Transformer为什么一定要添加一个Positional Encoding模块?

作者 | Sirius 编辑 | 自动驾驶之心

原文链接:https://zhuanlan.zhihu.com/p/7202317478

点击下方卡片,关注“自动驾驶之心”公众号

戳我-> 领取自动驾驶近15个方向学习路线

>>点击进入→自动驾驶之心Transformer技术交流群

本文只做学术分享,如有侵权,联系删文

之前老喜欢死记硬背transformer的网络架构,虽然内容并不复杂,但是发现这个transformer模块中的positional encoding在死记硬背的情况之下很容易被忽略。为了更好地理解为什么transformer一定需要有一个positional encoding,简单推了一下公式

先说结论:没有Positional Encoding的transformer架构具有置换等变性。

证明如下:

1. 对self-attn的公式推导

30e87d2ae4f5b54ee328133fae5a12de.png a95034f96671461fb3f3a9bbf5852f2d.png

其中的是可训练的权重矩阵。首先计算Query和Key之间的点积,得到注意力权重矩阵:

f81cc4f2ce9f7e24c246e5111a02e80d.png

然后计算自注意力输出:

b78498ee904fa112c7679106d761e1d1.png

2. 假设对输入进行置换

fa59c382bc8151ea3409d9fb7fb37b27.png

置换后的Query, Key, Value的公式分别为:

61bba4788e08d781d11478816320e585.png

注意力矩阵的计算则变化为:

0b8a125bdf9e99ccc4f1c47c36cf1252.png

由于P是置换矩阵,满足=,且P=I,所以:

953687902a3fb0dd21494761db46bb65.png

所以最终的输出可以这样写:

50f3a200b5225bc9092c169708dc7eb9.png

这样就可以证明,transformer架构在没有Positional Encoding计算的情况下具有置换等变性,换句话说,输入序列中元素的排列方式不会影响模型对它们的处理方式,只是输出的顺序相应地改变。

3. 添加Positional Encoding之后的影响

加入Positional Encoding之后,置换后的输入为:

72b14dc91139d6c3f445be07d0418d13.png

由于P是固定的,加入Positional Encoding之后,输入序列的置换将导致模型的输出发生变化,模型能够区分不用的序列:

ee1a82acef17137c025cb594211417da.png

从公式上看,在没有位置编码的情况下,自注意力机制的计算只涉及输入向量的内容,不涉及任何位置信息,且对输入序列的置换是等变的。

加入位置编码后,输入向量包含了位置信息,打破了自注意力机制的置换等变性,使模型能够对序列中的元素位置敏感。

① 2025中国国际新能源技术展会

自动驾驶之心联合主办中国国际新能源汽车技术、零部件及服务展会。展会将于2025年2月21日至24日在北京新国展二期举行,展览面积达到2万平方米,预计吸引来自世界各地的400多家参展商和2万名专业观众。作为新能源汽车领域的专业展,它将全面展示新能源汽车行业的最新成果和发展趋势,同期围绕个各关键板块举办论坛,欢迎报名参加。

540e878d00c495d5e0b96bd4cfa7bbf5.png

② 国内首个自动驾驶学习社区

『自动驾驶之心知识星球』近4000人的交流社区,已得到大多数自动驾驶公司的认可!涉及30+自动驾驶技术栈学习路线,从0到一带你入门自动驾驶感知端到端自动驾驶世界模型仿真闭环2D/3D检测、语义分割、车道线、BEV感知、Occupancy、多传感器融合、多传感器标定、目标跟踪)、自动驾驶定位建图SLAM、高精地图、局部在线地图)、自动驾驶规划控制/轨迹预测等领域技术方案大模型,更有行业动态和岗位发布!欢迎扫描加入

ec85ff1d2b3dce18976f60357041a54e.png

 ③全网独家视频课程

端到端自动驾驶、仿真测试、自动驾驶C++、BEV感知、BEV模型部署、BEV目标跟踪、毫米波雷达视觉融合多传感器标定多传感器融合多模态3D目标检测车道线检测轨迹预测在线高精地图世界模型点云3D目标检测目标跟踪Occupancy、CUDA与TensorRT模型部署大模型与自动驾驶NeRF语义分割自动驾驶仿真、传感器部署、决策规划、轨迹预测等多个方向学习视频(扫码即可学习

7b4bc65dc86f6c6bedb56cd5108451c5.png

网页端官网:www.zdjszx.com

④【自动驾驶之心】全平台矩阵

5dce88cc26d3c20f755581142ca20c87.png

Transformer模型中,Embedding和Positional Encoding存在多方面区别。 ### 功能目的 Embedding的主要功能是将离散的输入数据(如单词、字符等)转化为连续的向量表示,让模型能够处理和理解这些数据。比如在自然语言处理里,将每个单词token映射到一个高维向量空间,使语义相近的单词在向量空间中距离较近,以此帮助模型捕捉词汇间的语义关系[^1]。 Positional Encoding则是为了向模型提供序列中元素的位置信息。由于Transformer模型中的Self - Attention机制本身无法感知元素的位置,Positional Encoding能为每个位置生成一个独特的编码,将其与Embedding后的向量相加,从而让模型知晓每个元素在序列中的位置[^1]。 ### 生成方式 Embedding通常是学习得到的。可以随机初始化Embedding矩阵,然后在模型训练过程中,通过反向传播算法不断调整矩阵中的参数,以优化模型性能。例如在PyTorch中,使用`nn.Embedding`类创建Embedding层,在训练时更新其权重参数[^1][^3]。 ```python import torch import torch.nn as nn vocab_size = 1000 embedding_dim = 512 embedding = nn.Embedding(vocab_size, embedding_dim) ``` Positional Encoding有多种生成方式。一种是使用固定的数学公式生成,像Transformer原始论文中使用正弦和余弦函数的组合来生成位置编码: $$ PE_{(pos,2i)} = \sin\left(\frac{pos}{10000^{\frac{2i}{d_{model}}}}\right) \\ PE_{(pos,2i + 1)} = \cos\left(\frac{pos}{10000^{\frac{2i}{d_{model}}}}\right) $$ 其中`pos`是位置,`i`是维度,`d_model`是模型的维度。另一种方式是将位置编码作为可学习的参数,类似于Embedding,在训练过程中进行更新,如BERT模型中的位置编码就是学习出来的,被称为Position Embedding[^2]。 ### 作用对象 Embedding作用于输入序列中的每个元素,不管是单词、字符还是其他离散单元,都会通过Embedding层将其转换为向量。 Positional Encoding作用于Embedding后的向量,在得到Embedding向量后,将Positional Encoding生成的位置编码向量与之相加,得到包含位置信息的向量,供后续的Self - Attention等模块使用。 ### 意义和影响 Embedding有助于模型理解输入元素的语义信息,使得模型能够在向量空间中对语义进行分析和处理,是模型捕捉词汇语义关系的基础。 Positional Encoding则保证了模型在处理序列时能够考虑元素的顺序和位置,对于处理具有顺序依赖的任务(如自然语言处理中的句子理解、机器翻译等)至关重要,能让模型更好地捕捉序列中的长距离依赖关系。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值