
在 Positional Encoding 系列中我们搞清楚了正余弦公式怎么用——它通过不同频率的波形给每个词打上了独一无二的位置指纹。但知其然更要知其所以然。Transformer 论文发布后无数研究者都在问同一个问题为什么偏偏是正弦和余弦 为什么不用别的函数答案是——这背后藏着一个非常优雅的数学秘密。今天我们就来亲手揭开它。为什么偏偏选正余弦· 建立推导起点在这期深度解析中我们将集中火力回答三个连环问题第一为什么选正余弦它到底有什么不可替代的特性第二为什么不同维度的频率要不一样第三也是最硬核的一个位置编码和词向量是逐位相加的两种信息混在一起真的不会互相干扰吗今天我们先死磕第一个问题。为了看清本质我们需要做一件事——化繁为简。真实的模型里每个词的位置编码有 512 维看着头晕。所以我们的第一步是把视线聚焦到其中的一对维度上。根据公式设计维度是两两配对的偶数位用正弦奇数位用余弦。我们就单独拎出这一对来看。对于一个特定的位置它的编码其实就是一个简单的二维向量——上面是正弦值下面是余弦值。为了书写方便我们把公式分母那一长串东西统称为频率常数用希腊字母欧米伽表示。你可以把它理解为这一对维度的旋转速度。于是位置的二维编码向量就可以写成画面上这个非常干净的形式。这就是我们整个推导的起点。现在关键问题来了——假设我知道了某个位置的编码我想知道往后偏移几个位置的新编码。我能不能不重新算而是直接用旧编码经过某种变换来得到它如果能这个变换长什么样带着这个疑问进入推导环节。三角函数展开推导 · 拨开云雾我们的目标很明确——把偏移后的新编码展开看看能不能用原来那个位置的编码来表示它。怎么展开答案就四个字召唤高中记忆。没错接下来你要看到的是你在高中刷题时写过无数遍的三角函数和角公式。画面上就是那两行第一行全是加号第二行中间是个减号。别小看这个减号它后面会发挥巨大作用。现在我们做一个简单的等量代换。让公式里的角度 A 等于当前位置的相位角度 B 等于偏移量的相位。完美套入。好了见证奇迹的时刻。我们分两行来展开。先看第一行的正弦项。直接套公式把它拆开。注意看画面上的颜色——红色的项永远绑着原始位置蓝色的项永远绑着偏移量。这一行的展开非常顺利没有任何意外。再看第二行的余弦项。同样套公式拆开红色依然绑着原始位置蓝色依然绑着偏移量。唯一的变化就是中间变成了减号。到这里展开完成了。但这只是表象真正的魔法藏在整体的结构里。现在请把目光聚焦在等号的右边。发现了吗等号右边已经没有偏移后的新角度了所有的项全都是原始位置的正弦和余弦的线性组合。而那些乘在旁边的系数只跟偏移量有关跟原始位置毫无关系这意味着什么这意味着新位置的编码完全可以由旧位置的编码乘以一个固定的矩阵变换而来这个矩阵长什么样当你把这两行结果重新塞回一个方阵里你会看到一个令人起鸡皮疙瘩的事实写成线性变换 · 旋转矩阵现身上一步我们把偏移后的编码展开了。等号右边变成了一堆正弦和余弦的线性组合。但这还不够震撼。现在我们要做一件更酷的事——把这些散落的项重新组装成一个矩阵。回顾一下上一步的结果。注意看画面的颜色红色永远代表原始位置的相位蓝色永远代表偏移量的相位。如果我们把红色的项提出来作为变量把蓝色的项提取出来作为系数……一个绝妙的结构浮现了把第一行的系数放在矩阵的第一行第二行的系数放在矩阵的第二行等号左边的向量放在左边原始位置的向量放在右边。画面上出现了完整的矩阵乘法等式。请把你的目光锁定在中间那个方阵上。左上角和右下角是偏移量的余弦值右上角是正弦值左下角是负的正弦值。如果你学过线性代数这个结构绝对会让你虎躯一震——这赫然就是一个标准的二维旋转矩阵也就是说刚才那长篇大论的三角函数展开千言万语汇成一句话新位置的编码等于一个旋转矩阵乘以旧位置的编码。整个位置编码的位移逻辑从一坨复杂的三角函数瞬间坍缩成了一个极其优雅的线性代数表达式。更关键的是请注意这个旋转矩阵的内部——它里面只有偏移量 k完全没有绝对位置 pos 的影子。这意味着什么意味着不管你是在句子的开头还是结尾不管 pos 是 0 还是 10000只要两个词相隔的距离 k 相同它们位置编码之间的变换矩阵就完全一样。这就是正余弦方案最核心的魅力——天然具备相对位置感知能力。旋转矩阵的三个核心结论光看矩阵不够过瘾我们把它画出来。在左边这个二维坐标系里我们画了一个单位圆。这根蓝色的箭头代表位置 pos 的编码向量。它与横轴的夹角就是当前位置的相位。现在我们要走到 posk 的位置。看——向量转动了。这根金色的箭头就是新位置的编码。从蓝色到金色中间扫过的这个夹角就是偏移量 k 对应的相位。注意看画面上的提示这个旋转的角度只跟距离 k 有关。不管蓝色箭头一开始指向哪里只要你让它转同样的角度它感受到的力是完全一样的。直观感受有了基于这个旋转本质我们能得出三个极其重要的结论。第一线性稳定性。刚才说了变换矩阵只跟相对距离 k 有关。这在深度学习里是个巨大的优势——模型在学习的时候不需要去记住第 0 个位置长什么样、第 100 个位置长什么样它只需要学会一种通用的变换规则只要是往后偏移 k 个位置就按固定角度转一下。这极大地降低了模型的记忆负担。第二旋转的物理本质。在所有几何变换里旋转有一种独一无二的特质——它不拉伸、不压缩只改变方向。用数学语言说它的行列式等于 1它是正交矩阵。翻译成大白话就是不管你怎么转向量的长度永远不会变。这意味着什么意味着位置编码在参与后续计算时不会因为变换而放大或衰减信息的能量被完美守恒了。第三也是最实际的一点——它让模型更好学了。Transformer 内部全是矩阵乘法。如果位置编码是某种复杂的非线性变换模型很难用简单的线性层去捕捉它。但如果是旋转呢旋转本质上就是在捕捉向量之间的夹角关系。对于神经网络来说学会看夹角比学会猜复杂的非线性曲线要容易得多。正余弦方案等于是在告诉模型别瞎猜了我已经把位置关系变成了最简单的旋转你直接学就好了。最后让我们用三句话为为什么选正余弦画上句号。第一正余弦函数把干瘪的排队顺序升华成了高维空间里优美的向量旋转角度。第二旋转矩阵只由相对距离决定天然具备全局一致的相对位置感知能力。第三这种纯粹的线性变换结构让 Transformer 的学习过程更稳定、更高效。这就是 Transformer 论文作者选择正余弦的底层逻辑——不是为了炫技而是为了在数学上找到最干净、最利于模型学习的表达方式。到这里第一个问题彻底讲透了。但别忘了我们还有第二个问题为什么不同维度的频率要不一样那些从极低频到极高频的波形到底是怎么分工的答案藏在一个极其巧妙的二进制时钟模拟里。我们下期见。更多transformerVITswin tranformer 参考头条号人工智能研究所 v号人工智能研究Suo, 启示AI科技动画详解transformer 在线视频教程