Transformer架构原理的菜鸟学习之路02——位置编码(Positional encoding)
位置编码的应用随处可见例如我们常用的11位手机号码看似没有什么规律可循其实是由3位网号移动、电信等4位HLR号归属位置寄存器4位的个人代码共同组成尽管现在已经可以携号转网但依然可以通过权威网站追溯到号码属地信息。在日常生活场景中基本上都是以姓名来区分不同的人但只有身份证号等关键信息才是可以真正区分不同地区居民的编码。前六位一般遵循如下的编码标准第1~2位表示省级 行政区代码第3~4位表示地 市级行政区代码第5~6位表示县级 行政区代码。在计算机系统以及机器学习算法当中位置编码同样不可或缺。不管是一句话切分成的词元token还是一幅图像切分的像素块最终都会被转换成统一格式的向量集合而集合有一个典型的排列等变性随机性特征如果不给这些词嵌入向量加上位置编码词元之间的很多重要关系将无从理解和确定。一、傅里叶变换刚开始读到“通过将这些不同频率的正弦/余弦波叠加Transformer 为每个位置生成了一个独一无二的“指纹”既包含了局部信息也包含了全局信息”这句话时我是百思不得其解。过往的经验教训告诉我当一个问题实在无法得到有效解答之时很可能需要回溯一下这个问题这就是我要简单谈一谈傅里叶变换的原因。我们每时每刻看到的世界都在不断变化就像是看一部电影每一帧都不太相同故事会随时间的流动而徐徐展开我们想当然地认为这个世界永远不会静止下来这就是动态的、流逝的“时域”视角。其实我们还可以用另一种静态的、永恒的“频域”视角来看世界把电影拆分成一组有特定规律、永远不变的“颜色频率”和“声音频率”世界不再是“不断流逝的眼前”而是“永恒震荡的节奏”。傅里叶变换的核心任何复杂的信号时域都可以分解为一系列不同频率的正弦波和余弦波的叠加频域。Transformer 的位置编码设计思想本质上是傅里叶变换正变换时域→频域逆变换频域→时域思想的一种具体应用。为了更好地理解这种傅里叶变换过程我尝试使用了“请使用HTML语言编写网页模拟多个正余弦函数叠加成不同图像的过程”的提示词生成了一个可以直观体验变换过程的网页有兴趣的朋友不妨一试以加深对概念的直观理解。二、正余弦位置编码经典Transformer架构的设计者巧妙地借用了傅里叶变换的智慧用一组正交的正弦/余弦基函数编码Sinusoidal将一个离散的、绝对的位置索引映射到了一个连续的、包含丰富相对关系的高维词嵌入向量空间中。很多人读到这里可能也会和我有一样的疑问为什么要设计如此复杂的编码而不是直接使用数字编码容易理解的浅层原因是简单的数字编码表征长序列比如10000,100000等时位置数制会比较大不利于模型权重的有效训练而正余弦函数的值域固定在[-1,1]之间便于稳定训练。更深刻原因则是纯数字编码无法进行相对位置编码的线性变换这里又不得不出现了一个新词。如果对线性变换的概念一无所知显然无助于理解正余弦函数值编码的意义与价值这也是一直在困扰我们小组成员的学习边界问题一个问题可能与一连串的问题紧密相关拓展学习又谈何容易所以我们不断地求助于AI老师希望能够找到一种便于初学者理解“线性变换”概念的简约方式。我们可以用图像来做一个简单的列表缩放、旋转、翻转等都类似于线性变换因为线条还是线条边角还是边角并且不同状态之间可以来回转换而对图像的随意擦除操作就不是线性变换因为不能从一种擦除状态推导出另一种擦除状态。再举一个时针转动的例子3点钟的时针顺时针旋转90°就是6点钟6点钟顺时针旋转90°就是9点钟如果从数值本身6是3的2倍而9是6的1.5倍显然不符合线性变换的典型特征。如果我们从旋转90角度描述这种操作就是典型的线性变换。我们可以使用一种极简的矩阵乘法来直观演示这种有趣的线性变换方式已知验证1验证2每次乘同一个旋转矩阵 R3位置就 33→6→9两次验证全部正确全程只有矩阵乘法是标准线性变换。我们可以把sin (x) 和 cos (x)看成单位圆上一个点的两条边sin(x) 高度cos(x) 水平长度由于sin (x) 和 cos (x) 永远满足如下等量关系一个相对较大的值负责区分近的位置相邻词另一个相对较小的值负责区分远的位置长句子。正是有了这种此消彼长、永远互补的相对关系彼此之间才能有目的、有计划地进行不同形式的线性变换。如果对矩阵乘法还是云里雾里的朋友请先往下看。三、矩阵乘法与线性变换为什么矩阵相乘就能实现位置编码向量的旋转、缩放等线性变换操作这里很有必要回顾一下矩阵的四种不同视角。例如对于一个2*2的矩阵既可以看作是4个有序的数字abcd也可以看做是两个列向量或者两个行向量还可以看做对向量x,y进行的一种线性变换可以根据需要进行选择或设计。矩阵相乘的维度规则(A×B)×(B×C)A×C中间的 B 必须相同结果由前后维度决定。例如(3行×2列)×(2行×2列)3行×2列利用一些特殊矩阵可以轻松实现原来矩阵的缩放、旋转、升维、降维、裁剪过滤等线性与非线性变换操作。1、缩放用 2×2 对角矩阵点乘一个点 (1,1)(1,1) → (2,2)对角线上的数字就是缩放倍数。2、旋转用 2×2 旋转矩阵点乘点 (1,0)(1,0) → (0,1)确实旋转了 90°3、从低维升到高维矩阵形状2×3向量形状2×1输入2 维点 (x,y) 输出3 维点 (x, y, xy)维度从 2 → 3直观理解把平面上的点抬到三维空间里不再局限在平面这就是升维4、从高维“压扁”到低维矩阵3×2 向量3×1 3 维 → 2 维直接丢掉 z 轴3D 点 → 拍扁成 2D 点这就是降维 / 投影。Transformer 里的降维的基本逻辑用一个窄矩阵把高维向量压扁。5、裁剪/过滤信息用一个只保留部分维度的矩阵比如 3×3 矩阵但第三行全 0z 信息直接被清零相当于裁剪、丢弃、掩码Transformer 的 Mask 就类似这种逻辑。正是由于矩阵乘法与向量运算的多元互动与巧妙变换的关系Transformer经典架构的设计师方才选择适合通过矩阵乘法进行进行线性变换的正余弦编码而自注意力机制本身就包含了海量的矩阵乘法计算。这当然不是“去简就繁”的随机性巧合而是“化繁为简”创造性的设计从而让“国王-男人女人女王”的两次向量计算与“国王-女王”之间的语义联系共享了相似的底层逻辑。四、“国王-男人女人女王”假设我们已经通过海量语料库训练好了词向量Word2Vec模型词语被赋予了数学坐标语义关系变成了几何关系。我们可以把这个过程想象成在一张巨大的“语义地图”上进行导航。为了便于理解我们将词向量的维度简化设定为 4维实际上维度更高。1、准备工作词语的“基因”编码首先每个词语都被表示为一个向量一个包含多个数字的数组。这些数字捕捉了词语的“语义特征”。国王 可能表示为[1.0, 0.8, -0.2, 0.5] 代表权力、男性、统治等特征男人 可能表示为[0.3, 0.9, -0.1, 0.0] 代表性别、雄性特征女人 可能表示为[-0.3, 0.8, 0.1, 0.0] 代表性别、雌性特征女王 可能表示为[0.4, 0.7, -0.1, 0.5] 代表权力、女性、统治等特征2、计算过程在语义空间中“走步子”第一步国王 - 男人剥离“男性”特征这一步就像是在“国王”的概念中减去“男人”的特征向量。我们逐元素相减结果A国王−男人[0.7,−0.1,−0.1,0.5]语义解释我们从“国王”中拿走了“男性”的属性。剩下的 [0.7, -0.1, -0.1, 0.5] 代表什么它代表的是“拥有王权的非特定性别的人”或者说是“统治者的角色本身”保留了权力0.7和地位0.5但去掉了强烈的男性偏向从0.8降到了-0.1。第二步结果A 女人注入“女性”特征这一步是将“女人”的特征向量加到上一步得到的“统治者角色”上。我们逐元素相加 结果A女人[0.4,0.7,0.0,0.5]语义解释我们将“女性”的属性注入到“统治者角色”中。现在我们有了一个拥有权力0.4、具有女性特征0.7、地位显赫0.5的实体。3、结果验证寻找最近的邻居接下来需要在语义向量库中寻找哪个已有的词语向量与 [0.4, 0.7, 0.0, 0.5]向量最“相似”。我们发现“女王” 的向量是[0.4, 0.7, -0.1, 0.5]我们的计算结果[0.4, 0.7, 0.0, 0.5]这两个向量在数值上极其接近仅在第三个维度上有微小差异。在高维空间中这意味着它们的方向几乎一致距离非常近。向量平移国王-男人女人相当于进行了两次语义向量平移线性变换的一种基本形式。类比关系“从国王到男人的距离应该等于从女王到女人的距离”。通过数学运算我们成功地在语义地图上找到了对应的位置像人一样的机器学习、深度学习就悄然发生了。五、RoPE旋转位置编码随着技术的更新迭代正余弦函数形成的绝对位置编码的缺点直接加在词向量上正余弦函数位置编码只能表示绝对位置序列变长后编码差异模糊外推能力弱且稳定性差。我们都知道默认坐标系里有两个最基础的向量向右 1 步i (1, 0)横向基向量向上 1 步j (0, 1)纵向基向量所有点新向量都能靠这两个箭头基向量组合而成这两个箭头一拉就是单位正方形网格。使用水平剪切矩阵乘以横向基向量 (1,0)横向基向量(1,0)未变再使用水平剪切矩阵乘以纵向基向量(0,1)纵向基向量则变成了(1,1) 向右发生了倾斜。通过矩阵乘法线性变换之后的横向基向量10未变纵向基向量从0,1变成了1,1。通过使用旋转矩阵重新定义基向量让位置向量跟着旋转将单位正方形变成了单位平行四边形但是网格本身不弯曲、不扭曲这就是RoPE旋转编码的基本思想。RoPE 旋转位置编码不关心绝对位置只关注“谁和谁近谁和谁远”的相对位置关系这也是自注意力机制的核心意蕴在注意力计算时让 Q、K 各自旋转。假设位置 m 的 Q/K 旋转角度为θ·m位置 n 的 Q/K 旋转角度为θ·n两者的角度差就是θ⋅m−θ⋅nθ⋅(m−n) 只和 (m−n) 有关和 m、n 本身无关根据转角差判断距离最终点积只跟相对距离有关。关于RoPE旋转编码的深入探讨已经超过本文的写作边界和能力范围希望能在以后关于QKV矩阵乘法与向量归一化、点积等相关知识的学习过程中慢慢学习和深刻体会。转自https://mp.weixin.qq.com/s/eCW2Q_E0Es0FYjeRJ1ZWvA