当前位置: 首页 > news >正文

Positional Encoding | 位置编码【详解】

文章目录

    • 1、位置编码的2种方案
    • 2、位置编码
    • 3、公式详解 : 绝对位置 、 相对位置
    • 4、代码
      • 4.1 代码1
      • 4.2 代码2

1、位置编码的2种方案

transformer的作者刚开始说固定的位置编码和可学习的位置编码的效果是差不多的,后来证明可学习的位置编码没有太大的必要,还不如省事直接使用固定的位置编码,

代码中,token_num是句子中的单词数量,embed_dim表示每个单词的特征向量长度,

self.pe =nn.Parameter(torch.zeros(token_num, embed_dim))

在这里插入图片描述

2、位置编码

将对应位置的位置编码直接加在输入的单词上,如下图中的最后一行,
为什么 attention 并不能赋予 token 位置信息?

  • 例如下图中的一句话里有5个token,先计算每个token(例如“我”)和其他所有token的相似度,然后再乘以每个token(例如“我”)的value,得到b1值,b1值只包含全局的内容信息,而不包括位置信息,
  • 下图第1行的左图和右图中的“我”的值都是相同的,
  • 所以相应的解决方案就是对每个token加入一个位置信息,如下图第2行中的pe,这样下图第2行中的b1和b3值就不一样了,

在这里插入图片描述

3、公式详解 : 绝对位置 、 相对位置

在这里插入图片描述

如下图,设置token的数量为10,token的特征向量长度为128,偶数项和奇数项的位置编码公式如下图所示,

在这里插入图片描述

下面详细解释一下位置编码公式,下图中也解释了下面这句话:The wavelengths form a geometric progression from 2 π 2\pi 2π to 10000 ⋅ 2 π 10000 \cdot 2\pi 100002π

在这里插入图片描述

在这里插入图片描述

下面解释一下下面这段话:We chose this function because we hypothesized it would allow the model to easily learn to attend byrelative positions, since for any fixed offset k k k, P E p o s + k PE_{pos+k} PEpos+k can be represented as a linear function of P E p o s PE_{pos} PEpos

在这里插入图片描述

在这里插入图片描述

4、代码

4.1 代码1

import torch
import math
import matplotlib.pyplot as pltdef positional_encoding(d_model, length):""":param d_model: dimension of the token:param length: (maximum) token number:return: length*d_model position matrix"""if d_model % 2 != 0:raise ValueError("Cannot use sin/cos positional encoding with ""odd dim (got dim={:d})".format(d_model))pe = torch.zeros(length, d_model)position = torch.arange(0, length).unsqueeze(1)div_term = torch.exp((torch.arange(0, d_model, 2, dtype=torch.float) *-(math.log(10000.0) / d_model)))pe[:, 0::2] = torch.sin(position.float() * div_term)pe[:, 1::2] = torch.cos(position.float() * div_term)return pepe = positional_encoding(128, 10)
plt.plot(range(10), pe[:, 0])
plt.show()

输出:

在这里插入图片描述

4.2 代码2

import torch
import torch.nn as nn
import numpy as npclass PositionalEncoding(nn.Module):def __init__(self, d_hid, n_position=200):super(PositionalEncoding, self).__init__()self.register_buffer('pos_table', self._get_sinusoid_encoding_table(n_position, d_hid))def _get_sinusoid_encoding_table(self, n_position, d_hid):def get_position_angle_vec(position):return [position / np.power(10000, 2 * (hid_j // 2) / d_hid) for hid_j in range(d_hid)]sinusoid_table = np.array([get_position_angle_vec(pos_i) for pos_i in range(n_position)])sinusoid_table[:, 0::2] = np.sin(sinusoid_table[:, 0::2])  # dim 2isinusoid_table[:, 1::2] = np.cos(sinusoid_table[:, 1::2])  # dim 2i+1return torch.FloatTensor(sinusoid_table).unsqueeze(0)def forward(self, x):return x + self.pos_table[:, :x.size(1)].clone().detach()

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • JAVA同城货运搬家系统小程序源码
  • 正信晟锦:借了钱不回信息怎么办
  • 前端(Vue)全屏 screenfull 通用解决方案及原理分析
  • 如何一键删除iPhone相册所有照片
  • 智密腾讯云直播组建--获取配置--getConfig
  • 压测模版
  • C ++初阶:C++入门级知识点
  • LangGPT结构化提示词
  • 基于微信小程序的高校校园信息整合平台的设计与实现
  • C语言enum枚举
  • 【数据结构】详细介绍栈和队列,解析栈和队列每一处细节
  • 基础第3关:LangGPT结构化提示词编写实践
  • VS2022上面运行QT程序
  • docker-实战——consul集群
  • 如何将老照片修复模糊照片变清晰?照片修复方法
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 10个最佳ES6特性 ES7与ES8的特性
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • JavaScript新鲜事·第5期
  • LintCode 31. partitionArray 数组划分
  • SOFAMosn配置模型
  • SpiderData 2019年2月25日 DApp数据排行榜
  • V4L2视频输入框架概述
  • web标准化(下)
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • Mac 上flink的安装与启动
  • 通过调用文摘列表API获取文摘
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​flutter 代码混淆
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • $.ajax()方法详解
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (pycharm)安装python库函数Matplotlib步骤
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (七)理解angular中的module和injector,即依赖注入
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (转)德国人的记事本
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .CSS-hover 的解释
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET delegate 委托 、 Event 事件,接口回调
  • .net 反编译_.net反编译的相关问题
  • .net 获取url的方法
  • .net 中viewstate的原理和使用
  • .net开发引用程序集提示没有强名称的解决办法