模型原理 · 图文笔记
16:53原片时长
12内容页
0官方章节 / CC 字幕
10重绘矢量图
主线:Self-Attention 对输入做任何位置置换,分数矩阵只是跟着换行换列,数值一个不变——它天生看不见顺序。位置编码要做的就是把这个缺失的维度补回去:先用「加法」把位置向量并进输入,再用「旋转」把位置搬进 Q·K 内部,让注意力分数天然只依赖相对距离。
01 问题:看得见 Token,看不见顺序
RNN 逐步传递隐状态,前一个位置的 h 传给后一个位置,顺序被写进计算过程本身,代价是 N 步只能串行。Transformer 让每个 Token 的 Query 与所有 Key 算匹配分数、再汇总 Value,任意两个 Token 都能同时处理——并行换来的效率,成本就是顺序在计算里彻底消失了。
图 1 · RNN 的串行链与 Self-Attention 的全连接矩阵
换个角度看同一件事:把输入序列的顺序整体打乱,Self-Attention 的输出只会跟着打乱,数值一个不变。模型对顺序等变(equivariant),换个说法就是——它对顺序不敏感。对一个需要理解语序的模型来说,这等于少了一整维信息。
把 dog bites man 里 dog 和 man 换个位置,三个 Token 一个没变,含义却正好反过来。这就是问题的最小可复现例子。
图 2 · 同一组 Token、不同顺序,语义反转
16:53片长
12内容页
1013s时间轴总长
5.789秒 / 帧
02 加法入场:Xᵢ = Eᵢ + Pᵢ
Embedding 负责表示「这是什么 Token」,位置编码负责表示「它出现在第几个位置」,两者相加后一起送进模型。同一个 dog 放在位置 0 和位置 2,得到的 X 就不同,后续生成的 Q、K、V 也随之改变——Attention 这才同时拿到了语义与顺序。
Xᵢ = Embedding(xᵢ) + PositionalEncoding(i) Xdog,0 = Edog + P₀ ≠ Xdog,2 = Edog + P₂
为什么不拼接?拼接看起来更直观,代价是每个 Token 的向量维度翻倍:位置和语义各占一半维度,生成 Q/K/V 的参数矩阵跟着变宽,参数量与计算量一起上涨。相加保持 N × d_model 的形状不变,后续的 Transformer Block 可以原样接收。被叠进同一个向量里的两类信息,后续的线性映射仍然可以按训练需要自行组合。
图 3 · 拼接与相加的维度代价(按 d_model = 512 示例)
03 为什么位置不能直接用 0, 1, 2, 3
最直接的想法是把编号复制到每个维度:Pᵢ = [i, i, …, i]。看起来能用,但三个问题随之而来。
图 4 · 顺序编号的三个问题
所以目标很明确:要一个维度固定、数值有界,而且方便模型读出相对关系的位置向量。原片在这里把问题收敛成一句话——如何根据一个位置编号,生成维度固定、数值有界、并且方便模型利用位置关系的向量。后面两种方案(正余弦编码、RoPE)都是对这句话的不同回答。
04 正余弦编码:把位置写成一排快慢不同的波
论文的做法是让位置向量的维度两两一组,每组用一种频率:偶数维写 sin,奇数维写 cos,i 既是分组序号,也是频率编号。
PE(pos, 2i) = sin( pos / 100002i/d_model ) PE(pos, 2i+1) = cos( pos / 100002i/d_model )
以 d_model = 8、pos = 3 为例,四组分母分别是 1、10、100、1000,一个 8 维位置向量就这样被算出来。
图 5 · d_model = 8、pos = 3 时前 8 维的完整取值
i 越大,分母越大,pos 每增加 1 带来的角度变化就越小——分组本质上是在决定这一组的「快慢」。
图 6 · 四组不同频率的正弦波:位置每前进一格,各维走出的角度完全不同
高频维度每隔几个位置就转完一圈,能分辨相邻位置,但走远了数值会重叠;低频维度相邻位置几乎看不出差别,要走很多个位置才转一圈,专门负责区分远处。两组频率搭配起来,近处和远处的尺度才都能被区分开。
05 一个意外收获:点积只剩下相对距离
Attention 真正想知道的是「两个 Token 相隔多远」,而不是「它排第几个」。它不会主动拿位置编号做减法,但一定会做点积——把位置 pos 与 pos+k 的编码点乘,用积化和差展开,pos 就被干净地消掉了。
图 7 · 从 sin·sin + cos·cos 到 Σcos(k/Dᵢ) 的四步
06 RoPE:把相对距离直接放进 Q·K
既然目标只是相对距离,就不必先造一个位置向量、再费劲让它在点积里抵消掉。RoPE 换掉了位置的入口:不加位置向量,而是在 Q、K 生成之后,按 Token 的位置把它们旋转一个角度。
图 8 · 位置信息在哪一步进入计算:绝对位置编码 vs RoPE
具体做法是把 Query 的相邻两个维度当成一个二维向量,按位置 m 给每组算一个旋转角度,这一组两维乘上旋转矩阵即可。
[ q₁′, q₂′ ]ᵀ = [ [cos θₘ, −sin θₘ], [sin θₘ, cos θₘ] ] · [ q₁, q₂ ]ᵀ
图 9 · 一组相邻维度就是一个二维平面,位置决定旋转角度
Query 和 Key 各自旋转之后,做点积时共同的旋转角互相抵消,分数只受距离 k 影响。这一步的差别值得强调:旋转发生在 Q、K 生成之后,所以位置信息根本没有进入向量内容,它只改变了 Q 与 K 之间的夹角差——「相对距离」从一个可以被学出来的性质,变成了一件在计算结构上必然成立的事。这一页给了三个理由:相对性是自带的(不用指望模型自己学出来)、代价极低(维度不变、不增加参数)、以及已经是主流大模型普遍采用的位置编码方案。
07 小结:补上 Attention 唯一缺的那一维
模型看到的不再只是 dog,而是「位于第 i 个位置的 dog」。位置编码补上的,正是 Attention 唯一看不见的那一维。
图 10 · 全片 12 个内容页的位置与时间轴
Xᵢ = Eᵢ + Pᵢ入场方式
sin / cos正余弦编码
Σcos(k/Dᵢ)点积只剩距离
RoPE主流方案
下一讲是 Encoder 工作流程:Embedding、位置编码、注意力、多头注意力、Add & Norm、FFN 这些零件,如何拼成一整块 Encoder。
三个容易记错的地方- 位置编码加在 Embedding 上,不代表位置信息只影响第一层——它顺着残差流一路往下传。
- 「点积只由距离决定」是 d_model 维两两配对求和之后的结果(Σcos(k/Dᵢ)),不是单个维度的结论。
- RoPE 不是正余弦编码的等价改写。它把位置的作用点从输入搬到了注意力内部:位置不再进入向量内容,只进入 Q、K 的夹角差。
取材与还原方式(可核对)
- 原片
view_points 为空:没有官方章节;CC 字幕数为 0,画面底部带 UP 主自制的硬字幕。骨架因此靠分镜雪碧图逐帧还原。 - 雪碧图 200 个槽位,逐帧亮度统计显示第 175–199 帧为纯黑填充(最低 15 帧字节完全相同),内容帧共 175 帧,据此取 s/帧 = 1013 ÷ 175 ≈ 5.789,未使用官方章节点校准,时间戳误差约 ±5 秒。
- 页面标题与要点从幻灯片画面读取;分镜单帧为 480×270,个别小字按上下文补全,非逐字引用,措辞以原片含义为准。
- 全部 10 张配图为按内容重绘的矢量 SVG:无位图、无 CDN、断网可回看,可无损缩放。
- 官方 AI 总结接口需登录(返回
-101 账号未登录),未采用;弹幕与评论区未提供可用时间轴。 - 数据抓取时间:2026-09-22。