一.词嵌入

Word2Vec 的核心思想非常直白:“一个词的含义由它的上下文决定”。为了让机器学会这个概念,设计了两个截然相反的“考试题”模型:CBOW 和 Skip-Gram。
我们构建一个极简的微型世界:词表总数 ( V V V) = 3。我们的世界只有三个词:[“猫”, “吃”, “鱼”]。“猫” 的索引是 0,One-hot 向量是 [ 1 , 0 , 0 ] [1, 0, 0] [1,0,0]“吃” 的索引是 1,One-hot 向量是 [ 0 , 1 , 0 ] [0, 1, 0] [0,1,0]“鱼” 的索引是 2,One-hot 向量是 [ 0 , 0 , 1 ] [0, 0, 1] [0,0,1]词向量维度 ( N N N) = 2。我们要把词压缩到一个 2 维空间里。现在,我们把模型里的两个核心矩阵彻底剥开:

  1. 输入矩阵 W i n W_{in} Win (维度 3 × 2 3 \times 2 3×2):负责把词变成向量 W i n = [ w 11 w 12 w 21 w 22 w 31 w 32 ] W_{in} = \begin{bmatrix} w_{11} & w_{12} \\ w_{21} & w_{22} \\ w_{31} & w_{32} \end{bmatrix} Win= w11w21w31w12w22w32 第一行 [ w 11 , w 12 ] [w_{11}, w_{12}] [w11,w12] 就是“猫”的词向量。第二行 [ w 21 , w 22 ] [w_{21}, w_{22}] [w21,w22] 就是“吃”的词向量。第三行 [ w 31 , w 32 ] [w_{31}, w_{32}] [w31,w32] 就是“鱼”的词向量。
  2. 输出矩阵 W o u t W_{out} Wout (维度 2 × 3 2 \times 3 2×3):负责把向量还原成分数 W o u t = [ u 11 u 12 u 13 u 21 u 22 u 23 ] W_{out} = \begin{bmatrix} u_{11} & u_{12} & u_{13} \\ u_{21} & u_{22} & u_{23} \end{bmatrix} Wout=[u11u21u12u22u13u23]第一列 [ u 11 u 21 ] \begin{bmatrix} u_{11} \\ u_{21} \end{bmatrix} [u11u21] 代表“猫”作为上下文时的特征。第二列 [ u 12 u 22 ] \begin{bmatrix} u_{12} \\ u_{22} \end{bmatrix} [u12u22] 代表“吃”作为上下文时的特征。第三列 [ u 13 u 23 ] \begin{bmatrix} u_{13} \\ u_{23} \end{bmatrix} [u13u23] 代表“鱼”作为上下文时的特征。

1.1 Word2Vec(CBOW)

任务:给定上下文“猫”和“鱼”,预测中间的词(正确答案应该是“吃”)。
步骤 1:查表提取词向量 (Input → \rightarrow Hidden)用“猫”和“鱼”的 One-hot 向量分别去乘 W i n W_{in} Win 猫: [ 1 , 0 , 0 ] ⋅ [ w 11 w 12 w 21 w 22 w 31 w 32 ] = [ 1 ⋅ w 11 + 0 + 0 , 1 ⋅ w 12 + 0 + 0 ] = [ w 11 , w 12 ] \text{猫:} [1, 0, 0] \cdot \begin{bmatrix} w_{11} & w_{12} \\ w_{21} & w_{22} \\ w_{31} & w_{32} \end{bmatrix} = [1\cdot w_{11} + 0 + 0, \quad 1\cdot w_{12} + 0 + 0] = [w_{11}, w_{12}] 猫:[1,0,0] w11w21w31w12w22w32 =[1w11+0+0,1w12+0+0]=[w11,w12] 鱼: [ 0 , 0 , 1 ] ⋅ [ w 11 w 12 w 21 w 22 w 31 w 32 ] = [ 0 + 0 + 1 ⋅ w 31 , 0 + 0 + 1 ⋅ w 32 ] = [ w 31 , w 32 ] \text{鱼:} [0, 0, 1] \cdot \begin{bmatrix} w_{11} & w_{12} \\ w_{21} & w_{22} \\ w_{31} & w_{32} \end{bmatrix} = [0 + 0 + 1\cdot w_{31}, \quad 0 + 0 + 1\cdot w_{32}] = [w_{31}, w_{32}] 鱼:[0,0,1] w11w21w31w12w22w32 =[0+0+1w31,0+0+1w32]=[w31,w32]你看,One-hot 向量的作用,就像是一把精准的手术刀,把矩阵对应的某一行直接切下来了。
步骤 2:融合上下文 (求平均)把切下来的两个向量加起来除以 2,得到隐藏层向量 h ⃗ \vec{h} h h ⃗ = [ w 11 + w 31 2 , w 12 + w 32 2 ] \vec{h} = \left[ \frac{w_{11} + w_{31}}{2}, \frac{w_{12} + w_{32}}{2} \right] h =[2w11+w31,2w12+w32]为了后面写起来不眼花,我们把这个算出来的结果简写为 [ h 1 , h 2 ] [h_1, h_2] [h1,h2]。这个 [ h 1 , h 2 ] [h_1, h_2] [h1,h2] 就包含了“猫”和“鱼”的综合意思。
为什么要把切下来的两个向量加起来除以 2,得到隐藏层 h ⃗ \vec{h} h
这是 CBOW(Continuous Bag of Words,连续词袋模型)这个名字的由来。重点在 “Bag”(词袋) 这个词上。
(1).词袋假设: 这个模型做了一个极其粗暴但很有效的假设——在预测中间词时,周围上下文词的“顺序”是不重要的,重要的是“它们是谁”。 就像把“猫”和“鱼”扔进一个布袋子里摇一摇,出来的混合气味就暗示了袋子里大概率还有个“吃”。
(2).几何意义(寻找重心): 在高维空间里,“猫”是一个坐标点,“鱼”也是一个坐标点。把它们的向量相加并除以 2,几何意义就是在求这两点的中点(重心)。
(3).得到的隐藏层向量 h ⃗ \vec{h} h ,就是上下文词在语义空间中的“共同引力中心”。这个中心点蕴含了“猫”和“鱼”的混合语义,我们就是拿着这个“混合气味”去寻找最匹配的目标词。
步骤 3:计算得分 (Hidden → \rightarrow Output)把融合后的 h ⃗ \vec{h} h 乘以上下文矩阵 W o u t W_{out} Wout,得到词表中 3 个词的得分 y ⃗ \vec{y} y [ h 1 , h 2 ] ⋅ [ u 11 u 12 u 13 u 21 u 22 u 23 ] = [ y 1 , y 2 , y 3 ] [h_1, h_2] \cdot \begin{bmatrix} u_{11} & u_{12} & u_{13} \\ u_{21} & u_{22} & u_{23} \end{bmatrix} = [y_1, y_2, y_3] [h1,h2][u11u21u12u22u13u23]=[y1,y2,y3]
y 1 = h 1 u 11 + h 2 u 21 y_1 = h_1 u_{11} + h_2 u_{21} y1=h1u11+h2u21 (模型预测是“猫”的得分) y 2 = h 1 u 12 + h 2 u 22 y_2 = h_1 u_{12} + h_2 u_{22} y2=h1u12+h2u22 (模型预测是“吃”的得分) y 3 = h 1 u 13 + h 2 u 23 y_3 = h_1 u_{13} + h_2 u_{23} y3=h1u13+h2u23 (模型预测是“鱼”的得分)模型训练的目的,就是不断调整 w w w u u u 这些参数,让 y 2 y_2 y2(“吃”的得分)远远大于 y 1 y_1 y1 y 3 y_3 y3,最后套上 Softmax,让输出概率逼近 100%。
在训练模型的时候,模型在干什么?
一开始,无论是钥匙( W i n W_{in} Win)还是锁芯( W o u t W_{out} Wout)都是随机乱造的(随机初始化参数)。但是经过不断地做题(反向传播),模型发现:“哦!每次遇到‘猫’和‘鱼’造出来的钥匙 h ⃗ \vec{h} h ,都应该去开‘吃’这扇门!”于是,模型就会不断打磨修改 h ⃗ \vec{h} h 的形状(更新 W i n W_{in} Win),同时也不断修改“吃”这扇门的锁芯结构(更新 W o u t W_{out} Wout 的第二列),直到这把钥匙和这把锁完美匹配。
本质就是:“吃”到“猫+鱼”的相似度,要大于“猫”或“鱼”

1.2 Word2Vec(CBOW)

任务:给定目标词“吃”,预测它的周围可能会出现什么词(正确答案是“猫”和“鱼”)。
步骤 1:查表提取词向量 (Input → \rightarrow Hidden)只有“吃”进去了。 [ 0 , 1 , 0 ] ⋅ [ w 11 w 12 w 21 w 22 w 31 w 32 ] = [ w 21 , w 22 ] [0, 1, 0] \cdot \begin{bmatrix} w_{11} & w_{12} \\ w_{21} & w_{22} \\ w_{31} & w_{32} \end{bmatrix} = [w_{21}, w_{22}] [0,1,0] w11w21w31w12w22w32 =[w21,w22]隐藏层向量 h ⃗ \vec{h} h 就是 [ w 21 , w 22 ] [w_{21}, w_{22}] [w21,w22]。在 Skip-Gram 里,没有融合,原汁原味。
步骤 2:计算得分 (Hidden → \rightarrow Output)同样去乘输出矩阵 W o u t W_{out} Wout [ w 21 , w 22 ] ⋅ [ u 11 u 12 u 13 u 21 u 22 u 23 ] = [ y 1 , y 2 , y 3 ] [w_{21}, w_{22}] \cdot \begin{bmatrix} u_{11} & u_{12} & u_{13} \\ u_{21} & u_{22} & u_{23} \end{bmatrix} = [y_1, y_2, y_3] [w21,w22][u11u21u12u22u13u23]=[y1,y2,y3]展开来看得分: y 1 = w 21 u 11 + w 22 u 21 y_1 = w_{21} u_{11} + w_{22} u_{21} y1=w21u11+w22u21 (这是在算“吃”周围出现“猫”的概率得分) y 2 = w 21 u 12 + w 22 u 22 y_2 = w_{21} u_{12} + w_{22} u_{22} y2=w21u12+w22u22 (这是在算“吃”周围出现“吃”的概率得分) y 3 = w 21 u 13 + w 22 u 23 y_3 = w_{21} u_{13} + w_{22} u_{23} y3=w21u13+w22u23 (这是在算“吃”周围出现“鱼”的概率得分)
模型训练的目标,就是疯狂调整参数,使得“吃”的词向量,跟“猫”和“鱼”的上下文向量的点积尽可能大(也就是 y 1 y_1 y1 y 3 y_3 y3 要高),跟其他不相关词的点积尽可能小。经过成千上万次这样的训练,意思相关的词,它们在 W i n W_{in} Win 矩阵里对应的那些 w w w 参数就会变得越来越像,在多维空间里的坐标就会越靠越近。当我们把网络训练完,那个输出矩阵 W o u t W_{out} Wout 就可以直接扔掉了,我们只需要保留 W i n W_{in} Win,这个 W i n W_{in} Win 就是著名的 Word Embeddings(词向量表)。
我们在这里先有个直观的概念,后续再回看会有更深的简洁:

1.3 Transformer 中的 Embedding 层和Word2Vec的区别

Word2Vec 是“外包预训练”:Word2Vec 是一个独立的模型。当年大家都是先在一个巨大的语料库(比如维基百科)上,用 Skip-Gram 或 CBOW 跑上几天几夜,死磕出那个 W i n W_{in} Win 矩阵。然后把这个矩阵存成一个文件(比如 .bin 或 .txt)。当你做具体的下游任务(比如情感分析)时,直接把这个矩阵加载进来,固定住当字典用
Transformer 是“端到端(End-to-End)自己炼”:《Attention Is All You Need》中作者没有导入任何 Word2Vec 词向量。Transformer 的 Embedding 层一开始就是一堆随机初始化的无意义数字。它是和后面的 Attention 层、前馈神经网络(FFN)一起,在做机器翻译(或其他任务)的过程中,通过反向传播,根据最终任务的对错,一点点硬生生“拉扯”出语义的。(注:虽然现在很多小模型也会拿预训练好的词向量来初始化 Transformer 的 Embedding 层以加速收敛,但原教旨的 Transformer 架构是支持从零开始训练的。)
以前的时代是“拼图游戏”:先找一批语料,花几天时间专门训练一个 Word2Vec 模型,把词向量矩阵( W i n W_{in} Win)导出来;然后再建一个做翻译的网络,把这个矩阵塞进去当砖块用。现在的 Transformer 时代是“全自动流水线”:一开始,Transformer 底层的这个 Embedding 矩阵里面全是随机的乱码数字。模型直接开始做最终的任务(比如翻译“猫吃鱼”)。如果翻译错了,系统不仅会调整上层复杂网络的参数,反向传播的误差梯度会一路“杀”到底层,直接去修改 Embedding 矩阵里“猫”、“吃”、“鱼”的那几行坐标。等整个翻译模型训练完了,底层的那个词嵌入矩阵自然而然也就变得非常完美了。它完全是为了当前任务“量身定制”的。

1.4 词嵌入向量的理解

向量之于计算机,就如同自然语言之于人类,本质上没有任何区别,它们都只是存储信息的介质。一个东西叫中文的‘苹果’还是英文的‘Apple’,用什么符号写出来根本无关紧要。剥开语言的外衣,唯一有意义的是信息与信息之间的相对关系——比如苹果与水果的从属,香蕉与月亮的形似。当我们以为人类大脑里的‘联想’有多么神秘时,其实它的底层逻辑和计算机如出一辙:万事万物在脑海中的关联性,本质上就是一组组向量。人类引以为傲的“理解力”,其实也是在潜意识里算向量。 你看到香蕉想到月亮,不是因为你多懂浪漫,而是因为在你大脑的神经网络里,这两个概念的“形状维度”坐标极其接近。

二.位置编码(这一部分后续的RoPE会详细探究)

在原始的Transformer中,位置编码是通过正弦和余弦函数固定生成的(绝对位置编码)。给定一个序列,我们为其生成一个与词嵌入(Word Embedding)维度完全相同的矩阵。假设: N N N 为输入序列的长度(Sequence Length)。 D D D 为模型的隐藏层维度(即词向量维度 d m o d e l d_{model} dmodel),为了方便讨论,假设 D D D 是偶数。 p o s ∈ [ 0 , N − 1 ] pos \in [0, N-1] pos[0,N1] 表示词在序列中的位置。 i ∈ [ 0 , D / 2 − 1 ] i \in [0, D/2 - 1] i[0,D/21] 表示维度的索引。位置编码的具体数学公式定义如下: P E ( p o s , 2 i ) = sin ⁡ ( p o s 10000 2 i / D ) PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/D}}\right) PE(pos,2i)=sin(100002i/Dpos) P E ( p o s , 2 i + 1 ) = cos ⁡ ( p o s 10000 2 i / D ) PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/D}}\right) PE(pos,2i+1)=cos(100002i/Dpos)为了公式看起来更整洁,我们定义一个频率参数 ω i = 1 10000 2 i / D \omega_i = \frac{1}{10000^{2i/D}} ωi=100002i/D1,此时公式变为: P E ( p o s , 2 i ) = sin ⁡ ( ω i ⋅ p o s ) PE_{(pos, 2i)} = \sin(\omega_i \cdot pos) PE(pos,2i)=sin(ωipos) P E ( p o s , 2 i + 1 ) = cos ⁡ ( ω i ⋅ p o s ) PE_{(pos, 2i+1)} = \cos(\omega_i \cdot pos) PE(pos,2i+1)=cos(ωipos)
从矩阵的角度来看,位置编码是一个大小为 N × D N \times D N×D 的矩阵 P E \mathbf{PE} PE。我们可以这样构建它: P E = [ sin ⁡ ( ω 0 ⋅ 0 ) cos ⁡ ( ω 0 ⋅ 0 ) sin ⁡ ( ω 1 ⋅ 0 ) cos ⁡ ( ω 1 ⋅ 0 ) ⋯ sin ⁡ ( ω D / 2 − 1 ⋅ 0 ) cos ⁡ ( ω D / 2 − 1 ⋅ 0 ) sin ⁡ ( ω 0 ⋅ 1 ) cos ⁡ ( ω 0 ⋅ 1 ) sin ⁡ ( ω 1 ⋅ 1 ) cos ⁡ ( ω 1 ⋅ 1 ) ⋯ sin ⁡ ( ω D / 2 − 1 ⋅ 1 ) cos ⁡ ( ω D / 2 − 1 ⋅ 1 ) ⋮ ⋮ ⋮ ⋮ ⋱ ⋮ ⋮ sin ⁡ ( ω 0 ⋅ p o s ) cos ⁡ ( ω 0 ⋅ p o s ) sin ⁡ ( ω 1 ⋅ p o s ) cos ⁡ ( ω 1 ⋅ p o s ) ⋯ sin ⁡ ( ω D / 2 − 1 ⋅ p o s ) cos ⁡ ( ω D / 2 − 1 ⋅ p o s ) ⋮ ⋮ ⋮ ⋮ ⋱ ⋮ ⋮ sin ⁡ ( ω 0 ⋅ ( N − 1 ) ) cos ⁡ ( ω 0 ⋅ ( N − 1 ) ) sin ⁡ ( ω 1 ⋅ ( N − 1 ) ) cos ⁡ ( ω 1 ⋅ ( N − 1 ) ) ⋯ sin ⁡ ( ω D / 2 − 1 ⋅ ( N − 1 ) ) cos ⁡ ( ω D / 2 − 1 ⋅ ( N − 1 ) ) ] \mathbf{PE} = \begin{bmatrix} \sin(\omega_0 \cdot 0) & \cos(\omega_0 \cdot 0) & \sin(\omega_1 \cdot 0) & \cos(\omega_1 \cdot 0) & \cdots & \sin(\omega_{D/2-1} \cdot 0) & \cos(\omega_{D/2-1} \cdot 0) \\ \sin(\omega_0 \cdot 1) & \cos(\omega_0 \cdot 1) & \sin(\omega_1 \cdot 1) & \cos(\omega_1 \cdot 1) & \cdots & \sin(\omega_{D/2-1} \cdot 1) & \cos(\omega_{D/2-1} \cdot 1) \\ \vdots & \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ \sin(\omega_0 \cdot pos) & \cos(\omega_0 \cdot pos) & \sin(\omega_1 \cdot pos) & \cos(\omega_1 \cdot pos) & \cdots & \sin(\omega_{D/2-1} \cdot pos) & \cos(\omega_{D/2-1} \cdot pos) \\ \vdots & \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ \sin(\omega_0 \cdot (N-1)) & \cos(\omega_0 \cdot (N-1)) & \sin(\omega_1 \cdot (N-1)) & \cos(\omega_1 \cdot (N-1)) & \cdots & \sin(\omega_{D/2-1} \cdot (N-1)) & \cos(\omega_{D/2-1} \cdot (N-1)) \end{bmatrix} PE= sin(ω00)sin(ω01)sin(ω0pos)sin(ω0(N1))cos(ω00)cos(ω01)cos(ω0pos)cos(ω0(N1))sin(ω10)sin(ω11)sin(ω1pos)sin(ω1(N1))cos(ω10)cos(ω11)cos(ω1pos)cos(ω1(N1))sin(ωD/210)sin(ωD/211)sin(ωD/21pos)sin(ωD/21(N1))cos(ωD/210)cos(ωD/211)cos(ωD/21pos)cos(ωD/21(N1))
ssss
为什么不直接用 0 , 1 , 2 , 3... 0, 1, 2, 3... 0,1,2,3... 或者归一化的 0 ∼ 1 0 \sim 1 01 来表示位置?
因为三角函数形式的位置编码具有一个极其优雅的数学性质:相对位置可以表示为绝对位置的线性变换。假设我们有两个位置 p o s pos pos p o s + k pos + k pos+k(其中 k k k 是相对偏移量)。我们考察维度对 ( 2 i , 2 i + 1 ) (2i, 2i+1) (2i,2i+1)。对于位置 p o s + k pos + k pos+k,其位置编码为: P E ( p o s + k , 2 i ) = sin ⁡ ( ω i ⋅ ( p o s + k ) ) = sin ⁡ ( ω i p o s ) cos ⁡ ( ω i k ) + cos ⁡ ( ω i p o s ) sin ⁡ ( ω i k ) PE_{(pos+k, 2i)} = \sin(\omega_i \cdot (pos + k)) = \sin(\omega_i pos)\cos(\omega_i k) + \cos(\omega_i pos)\sin(\omega_i k) PE(pos+k,2i)=sin(ωi(pos+k))=sin(ωipos)cos(ωik)+cos(ωipos)sin(ωik) P E ( p o s + k , 2 i + 1 ) = cos ⁡ ( ω i ⋅ ( p o s + k ) ) = cos ⁡ ( ω i p o s ) cos ⁡ ( ω i k ) − sin ⁡ ( ω i p o s ) sin ⁡ ( ω i k ) PE_{(pos+k, 2i+1)} = \cos(\omega_i \cdot (pos + k)) = \cos(\omega_i pos)\cos(\omega_i k) - \sin(\omega_i pos)\sin(\omega_i k) PE(pos+k,2i+1)=cos(ωi(pos+k))=cos(ωipos)cos(ωik)sin(ωipos)sin(ωik)如果我们将其写成矩阵乘法的形式: [ P E ( p o s + k , 2 i ) P E ( p o s + k , 2 i + 1 ) ] = [ cos ⁡ ( ω i k ) sin ⁡ ( ω i k ) − sin ⁡ ( ω i k ) cos ⁡ ( ω i k ) ] [ P E ( p o s , 2 i ) P E ( p o s , 2 i + 1 ) ] \begin{bmatrix} PE_{(pos+k,2i)} \\ PE_{(pos+k,2i+1)} \end{bmatrix} = \begin{bmatrix} \cos(\omega_i k) & \sin(\omega_i k) \\ -\sin(\omega_i k) & \cos(\omega_i k) \end{bmatrix} \begin{bmatrix} PE_{(pos,2i)} \\ PE_{(pos,2i+1)} \end{bmatrix} [PE(pos+k,2i)PE(pos+k,2i+1)]=[cos(ωik)sin(ωik)sin(ωik)cos(ωik)][PE(pos,2i)PE(pos,2i+1)]核心结论: 中间那个 2 × 2 2 \times 2 2×2 的变换矩阵 M k \mathbf{M}_k Mk 仅仅依赖于相对偏移量 k k k,而与绝对位置 p o s pos pos 完全无关。从线性代数和几何的角度来看, M k \mathbf{M}_k Mk 是一个旋转矩阵(Rotation Matrix)。这意味着,在位置编码的高维空间中,“向前移动 k k k 个步长”这个操作,等价于在各个二维子空间中进行了一次角度为 ω i k \omega_i k ωik 的严格旋转。这使得自注意力机制在计算点积时,能够很容易地捕捉到词与词之间的相对距离信息。
最后,我们来看看引入 P E \mathbf{PE} PE 后,自注意力矩阵相乘时到底发生了什么。在自注意力中,我们需要计算 Query 和 Key 的点积。 Q = ( X e m b + P E ) W Q \mathbf{Q} = (\mathbf{X}_{emb} + \mathbf{PE})\mathbf{W}^Q Q=(Xemb+PE)WQ K = ( X e m b + P E ) W K \mathbf{K} = (\mathbf{X}_{emb} + \mathbf{PE})\mathbf{W}^K K=(Xemb+PE)WK注意力得分矩阵 S \mathbf{S} S (忽略缩放因子 d k \sqrt{d_k} dk )计算如下: S = Q K T = ( X e m b + P E ) W Q ⋅ ( ( X e m b + P E ) W K ) T \mathbf{S} = \mathbf{Q} \mathbf{K}^T = (\mathbf{X}_{emb} + \mathbf{PE})\mathbf{W}^Q \cdot \left((\mathbf{X}_{emb} + \mathbf{PE})\mathbf{W}^K\right)^T S=QKT=(Xemb+PE)WQ((Xemb+PE)WK)T S = ( X e m b + P E ) W Q ( W K ) T ( X e m b + P E ) T \mathbf{S} = (\mathbf{X}_{emb} + \mathbf{PE})\mathbf{W}^Q (\mathbf{W}^K)^T (\mathbf{X}_{emb} + \mathbf{PE})^T S=(Xemb+PE)WQ(WK)T(Xemb+PE)T将括号完全展开,我们会得到四个项: S = X e m b W Q ( W K ) T X e m b T ⏟ ( 1 ) + X e m b W Q ( W K ) T P E T ⏟ ( 2 ) + P E W Q ( W K ) T X e m b T ⏟ ( 3 ) + P E W Q ( W K ) T P E T ⏟ ( 4 ) \mathbf{S} = \underbrace{\mathbf{X}_{emb}\mathbf{W}^Q (\mathbf{W}^K)^T \mathbf{X}_{emb}^T}_{(1)} + \underbrace{\mathbf{X}_{emb}\mathbf{W}^Q (\mathbf{W}^K)^T \mathbf{PE}^T}_{(2)} + \underbrace{\mathbf{PE}\mathbf{W}^Q (\mathbf{W}^K)^T \mathbf{X}_{emb}^T}_{(3)} + \underbrace{\mathbf{PE}\mathbf{W}^Q (\mathbf{W}^K)^T \mathbf{PE}^T}_{(4)} S=(1) XembWQ(WK)TXembT+(2) XembWQ(WK)TPET+(3) PEWQ(WK)TXembT+(4) PEWQ(WK)TPET这四项在数学上具有极强的解释性:

词义-词义 (Content-to-Content):纯粹基于单词本身的语义计算注意力得分(比如“苹果”和“吃”之间的关联)。

词义-位置 (Content-to-Position):基于前者的语义和后者的位置计算得分。

位置-词义 (Position-to-Content):基于前者的位置和后者的语义计算得分。

位置-位置 (Position-to-Position):纯粹基于两个词在句子中的位置距离计算得分。由于之前推导的旋转矩阵性质,这一项能够很好地对相对距离进行建模。
正是这四项的线性叠加,使得Transformer能够在复杂的注意力分布中,同时权衡“你是谁”(语义成分)和“你在哪”(位置成分)。

三.自注意力(Self-Attention)

在这里插入图片描述

自注意力机制最经典的公式: A t t e n t i o n ( Q , K , V ) = softmax ( Q K T d k ) V Attention(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dk QKT)V Q Q Q K K K V V V 是由输入矩阵 X X X 乘以三个不同的权重矩阵 W Q W^Q WQ W K W^K WK W V W^V WV 得到的。 d k \sqrt{d_k} dk 是缩放因子,用于防止点积结果过大导致 Softmax 梯度消失。自注意力机制巧妙地借用了数据库查询的概念,将输入序列中的每个词映射为三个不同的向量:
Q (Query / 查询): 代表当前词在“寻找”什么信息。
K (Key / 键): 代表当前词“能提供”什么特征(就像书架上的标签)。
V (Value / 值): 代表当前词实际的“内容”或语义信息。

3.1 注意力计算

在这里插入图片描述
注意力计算的时候,不是“对 V V V 的每一行整体加权”,而是“一个维度一个维度的加权”。当我们在计算新向量的第 2 个维度 v 2 , 2 ′ v'_{2,2} v2,2 时,我们只用了所有词在第 2 个维度上的原始值( v 1 , 2 v_{1,2} v1,2 v 2 , 2 v_{2,2} v2,2)。第 1 个维度和第 3 个维度的数值根本没有参与计算!
从机器学习的特征表示角度来看,向量的不同维度代表着不同的语义特征。假设词向量的 3 个维度分别代表:
维度 1:词性(动词、名词)
维度 2:情感(褒义、贬义)
维度 3:时态(过去、现在)
当第 2 个词去融合其他词的信息时,如果它给词 1 分配了 0.8 的权重( t ^ 1 = 0.8 \hat{t}_1 = 0.8 t^1=0.8),给词 2 分配了 0.2 的权重( t ^ 2 = 0.2 \hat{t}_2 = 0.2 t^2=0.2):在情感维度(维度 2)上,新的情感特征 v 2 , 2 ′ v'_{2,2} v2,2 就是拿词 1 的情感特征和词 2 的情感特征按 0.8 : 0.2 0.8 : 0.2 0.8:0.2 混合。在时态维度(维度 3)上,新的时态特征 v 2 , 3 ′ v'_{2,3} v2,3 就是拿词 1 的时态特征和词 2 的时态特征按 0.8 : 0.2 0.8 : 0.2 0.8:0.2 混合。各个特征维度是独立混合的,互不干扰。 模型不会拿词 1 的“情感”去和词 2 的“时态”做加法,那是毫无意义的。

3.2 模型怎么知道QKV的具体的含义呢

主流讲解Transformer的博客都是这么讲的,但是我有一个问题:模型怎么知道QKV的具体的含义呢
模型是怎么训练的?以语言模型(如 GPT)为例,它的唯一目标(Objective)非常简单粗暴:Next Word Prediction(预测下一个词)。假设输入是:“The bank of the ____”,正确的下一个词是 “river”。如果模型一开始因为权重是随机的,预测出下一个词是 “apple”,那么损失函数(Loss Function,如交叉熵)就会暴增。高昂的 Loss 会触发反向传播,计算梯度: ∂ L ∂ W Q \frac{\partial L}{\partial W^Q} WQL ∂ L ∂ W K \frac{\partial L}{\partial W^K} WKL ∂ L ∂ W V \frac{\partial L}{\partial W^V} WVL。梯度就像是一个极其严苛的监工,它顺着计算图往回传导,对矩阵发号施令:“为了让模型输出 ‘river’ 的概率变高,你们刚才的计算必须调整!”
为了让预测结果变成 “river”,网络在倒数第一层发现,它极度需要 “bank” 这个词在前面提供的特征(而且必须是“河岸”特征,不能是“金融”特征)。于是,压力传导到了 Attention 层,反向传播开始微调权重,具体的数学逻辑如下:
1.逼迫 Q 和 K 走向对齐: 梯度发现,如果 “bank” 的 Q 向量和 “of” 的 K 向量内积很大,得到的特征没用;但如果 “bank” 的 Q 向量和它自身的 K 向量,或者某种代表自然地理的 K 向量内积变大,Loss 就会急剧下降。结果: 经过上亿次这样的迭代, W Q W^Q WQ W K W^K WK 被迫“进化”出了一种默契—— W Q W^Q WQ 会把当前词映射到一个空间,而 W K W^K WK 会把对预测有帮助的词映射到同一个空间。这就是我们人类眼中的“Q 寻找 K”。逼迫 V 剔除杂音: 梯度同时发现,如果 W V W^V WV 把 “bank” 中关于“金融”维度的数值保留下来,会导致后续预测出 “money” 而不是 “river”,从而增加 Loss。结果: 梯度会无情地把 W V W^V WV 矩阵中对应“金融”特征的权重向 0 压缩。久而久之, W V W^V WV 就“被迫”学会了过滤掉干扰当前预测任务的杂音,只输出纯粹的有用的特征。
其实,这种现象在深度学习中非常普遍。回想一下计算机视觉(CV)中的卷积神经网络(CNN)。我们从来没有告诉 CNN 什么是“边缘”、什么是“轮廓”、什么是“纹理”。但是,如果你去可视化训练好的 ResNet 或 VGG 的第一层卷积核,你会惊人地发现,它们全变成了类似 Gabor 滤波器的边缘检测算子(横向边缘、纵向边缘、对角线)。
CNN 知道什么是“边缘”吗?完全不知道。只是因为在进行图像分类(比如区分猫和狗)时,“提取边缘”是在数学上能让 Loss 降到最低的最优解
Transformer 中的 QKV 也是同理。
模型完全不懂人类的语言学、不懂语法、更不懂“提问与回答”。
但是,在预测海量文本的任务中,数学空间里存在一个全局最优解(或者极小值点):那就是让一部分权重去负责路由匹配(Q和K),让另一部分权重去负责内容提取(V)。
反向传播只管无脑地沿着梯度下降的方向走,走着走着,它就必然会掉进这个叫作“QKV 分工”的数学最优解里。我们人类看到这个结果后,一拍大腿说:“哎呀,这不就是‘缺什么找什么’嘛!”——这就是所谓的“解释性(Interpretability)”。

3.3 为什么要映射为QKV矩阵?

我们不妨做一个极端的思想实验(反证法):假设我们不映射,直接让 Q = X , K = X , V = X Q = X, K = X, V = X Q=X,K=X,V=X。 我们来看看在数学和实际语言表达上,会遭遇怎样灾难性的崩塌。
灾难一:无解的“对称性魔咒” (The Curse of Symmetry)
如果 Q = X , K = X Q=X, K=X Q=X,K=X,那么注意力得分矩阵 S S S 就是: S = X X T S = X X^T S=XXT从线性代数的角度看,任意一个矩阵乘上它的转置,得到的一定是一个对称矩阵(Symmetric Matrix)。这意味着 S i , j = S j , i S_{i,j} = S_{j,i} Si,j=Sj,i。翻译成人话就是:词 A 对 词 B 的关注度,永远等于 词 B 对 词 A 的关注度。实际语言中的荒谬性:语言的逻辑关系绝大多数是有向的、非对称的。比如句子:“我 吃 苹果”。“吃”(动词)非常需要知道它吃的是什么,所以“吃”作为 Query 时,应该给“苹果”(宾语)极高的注意力。但是“苹果”(名词)本身是一个完整的实体,它作为 Query 时,并不需要同等强烈地去反向关注“吃”。如果强制对称,语言的从属结构、修饰结构就全毁了。
引入 W Q W^Q WQ W K W^K WK 后, S = ( X W Q ) ( X W K ) T = X W Q ( W K ) T X T S = (XW^Q)(XW^K)^T = X W^Q (W^K)^T X^T S=(XWQ)(XWK)T=XWQ(WK)TXT。因为 W Q W^Q WQ W K W^K WK 是两个独立训练的矩阵,中间那个核心矩阵 W Q ( W K ) T W^Q (W^K)^T WQ(WK)T 绝大概率不是对称矩阵,从而完美打破了对称性魔咒,赋予了模型学习“单向依赖”的能力。

灾难二:致命的“自恋陷阱” (The Narcissism Trap)
还是假设 Q = X , K = X Q=X, K=X Q=X,K=X。我们来看看对角线上的元素(即一个词对它自己的注意力得分): S i , i = x ⃗ i ⋅ x ⃗ i = ∥ x ⃗ i ∥ 2 S_{i,i} = \vec{x}_i \cdot \vec{x}_i = \|\vec{x}_i\|^2 Si,i=x ix i=x i2根据向量点积的几何意义,一个向量与自身的点积,是其长度的平方,这通常是它与任何其他向量点积中的最大值(因为夹角为 0, cos ⁡ ( 0 ) = 1 \cos(0)=1 cos(0)=1)。实际语言中的荒谬性:如果不用 Q Q Q K K K 进行空间隔离,经过 Softmax 之后,每一个词都会把绝大多数的注意力权重(比如 0.99)死死地锁在自己身上,只分给其他词可怜的 0.01。这就像一群极其自恋的人开会,每个人都在自言自语,根本不听别人说话。自注意力机制将彻底退化为“恒等映射”(Identity Mapping),丧失了捕获上下文的意义。通过 W Q W^Q WQ W K W^K WK 将同一个词映射到不同的子空间, q ⃗ i \vec{q}_i q i k ⃗ i \vec{k}_i k i 就变成了两个不同的向量,打破了“自我点积必最大”的数学必然性。
W V W^V WV 的信息过滤作用:
当“吃”找到了“苹果”,它需要把“苹果”的某些特征融合进自己体内。但它不需要融合苹果的全部特征(比如苹果的英文拼写、苹果的发音)。 W V W^V WV 就相当于一个“滤网”,专门过滤出当前语境下最有用的信息组合在一起,去更新“吃”这个词的表征。
将原始矩阵 X X X 映射到 Q , K , V Q, K, V Q,K,V,其数学和哲学的本质是:在一个极其复杂的系统中,一个实体的“诉求(Query)”、“标签(Key)”和“内涵(Value)”是三种完全不同的高维特征。如果强行用同一个 X X X 去承担这三种截然不同的功能,模型就会被数学上的对称性和内积最大化锁死,变得极其僵化。引入 W Q , W K , W V W^Q, W^K, W^V WQ,WK,WV,就是给了模型 3 × d × d 3 \times d \times d 3×d×d 个自由度,让它能够在海量数据中,通过反向传播,精准地雕刻出“如何提问”、“如何展示”和“如何给予”这三套完全独立的认知逻辑。

3.4 缩放因子

第一部分:点积的方差放大效应 (概率论视角)

  1. 初始假设 (i.i.d. 条件)假设词向量 q q q k k k 的维度均为 d k d_k dk。在模型初始化阶段,我们假定向量中的每一个元素 q i q_i qi k i k_i ki 都是独立同分布(i.i.d.)的随机变量,且满足标准假设:
    均值: E [ q i ] = 0 , E [ k i ] = 0 E[q_i] = 0, \quad E[k_i] = 0 E[qi]=0,E[ki]=0
    方差: V a r ( q i ) = 1 , V a r ( k i ) = 1 Var(q_i) = 1, \quad Var(k_i) = 1 Var(qi)=1,Var(ki)=1
  2. 核心推导:单项乘积的方差令 x i = q i k i x_i = q_i k_i xi=qiki。由于 q i q_i qi k i k_i ki 相互独立,其乘积的期望为: E [ x i ] = E [ q i k i ] = E [ q i ] E [ k i ] = 0 × 0 = 0 E[x_i] = E[q_i k_i] = E[q_i]E[k_i] = 0 \times 0 = 0 E[xi]=E[qiki]=E[qi]E[ki]=0×0=0接下来计算 x i x_i xi 的方差。根据方差的定义式 V a r ( X ) = E [ X 2 ] − ( E [ X ] ) 2 Var(X) = E[X^2] - (E[X])^2 Var(X)=E[X2](E[X])2 V a r ( x i ) = E [ x i 2 ] − ( E [ x i ] ) 2 Var(x_i) = E[x_i^2] - (E[x_i])^2 Var(xi)=E[xi2](E[xi])2 V a r ( x i ) = E [ ( q i k i ) 2 ] − 0 2 = E [ q i 2 ] E [ k i 2 ] Var(x_i) = E[(q_i k_i)^2] - 0^2 = E[q_i^2]E[k_i^2] Var(xi)=E[(qiki)2]02=E[qi2]E[ki2]根据方差定义,已知 V a r ( q i ) = 1 Var(q_i)=1 Var(qi)=1 E [ q i ] = 0 E[q_i]=0 E[qi]=0,所以 E [ q i 2 ] = V a r ( q i ) + ( E [ q i ] ) 2 = 1 + 0 = 1 E[q_i^2] = Var(q_i) + (E[q_i])^2 = 1 + 0 = 1 E[qi2]=Var(qi)+(E[qi])2=1+0=1。同理 E [ k i 2 ] = 1 E[k_i^2]=1 E[ki2]=1。因此,单项乘积的方差为: V a r ( x i ) = 1 × 1 = 1 Var(x_i) = 1 \times 1 = 1 Var(xi)=1×1=1
  3. 标量点积的方差汇总点积 Z Z Z d k d_k dk 个独立随机变量 x i x_i xi 的求和: Z = q ⋅ k = ∑ i = 1 d k x i Z = q \cdot k = \sum_{i=1}^{d_k} x_i Z=qk=i=1dkxi由于 x i x_i xi 之间相互独立,和的方差等于方差的和: V a r ( Z ) = V a r ( ∑ i = 1 d k x i ) = ∑ i = 1 d k V a r ( x i ) = ∑ i = 1 d k 1 = d k Var(Z) = Var\left(\sum_{i=1}^{d_k} x_i\right) = \sum_{i=1}^{d_k} Var(x_i) = \sum_{i=1}^{d_k} 1 = d_k Var(Z)=Var(i=1dkxi)=i=1dkVar(xi)=i=1dk1=dk结论 1: 两个 d k d_k dk 维的标准随机向量,其点积的方差被放大了 d k d_k dk 倍。根据方差的伸缩性质 V a r ( c X ) = c 2 V a r ( X ) Var(cX) = c^2 Var(X) Var(cX)=c2Var(X),为了使结果的方差恢复为 1,必须在点积上乘以 c = 1 d k c = \frac{1}{\sqrt{d_k}} c=dk 1

第二部分:Softmax 的梯度消失定理 (微积分视角)
令输入 Softmax 的向量为 Z ∈ R N Z \in \mathbb{R}^N ZRN,输出为概率分布 S ∈ R N S \in \mathbb{R}^N SRN。第 i i i 项的 Softmax 定义为: S i = e Z i ∑ k = 1 N e Z k S_i = \frac{e^{Z_i}}{\sum_{k=1}^N e^{Z_k}} Si=k=1NeZkeZi对其求偏导,结果分为对角线元素( i = j i=j i=j)和非对角线元素( i ≠ j i \neq j i=j): ∂ S i ∂ Z j = { S i ( 1 − S i ) , if  i = j − S i S j , if  i ≠ j \frac{\partial S_i}{\partial Z_j} = \begin{cases} S_i(1 - S_i), & \text{if } i = j \\ -S_i S_j, & \text{if } i \neq j \end{cases} ZjSi={Si(1Si),SiSj,if i=jif i=j现在,我们将第一部分(方差变大)和第二部分(Softmax导数)结合起来看。假设没有除以 d k \sqrt{d_k} dk ,由于方差极大(比如 d k = 512 d_k=512 dk=512),输入 Softmax 的向量 Z Z Z 中的数值绝对值会非常大。比如某个输入向量是 Z = [ 100 , − 20 , 10 , − 50 ] Z = [100, -20, 10, -50] Z=[100,20,10,50]。经过 Softmax 后,最大的那个值对应的概率 S k S_k Sk 会无限逼近于 1,而其他的 S i S_i Si 会无限逼近于 0: S = [ 0.9999 , 0.0000 , 0.0001 , 0.0000 ] S = [0.9999, 0.0000, 0.0001, 0.0000] S=[0.9999,0.0000,0.0001,0.0000]把这个极端的概率分布代入我们刚才求出的导数公式中:对于 i = k i = k i=k 的最大项: 梯度 = S k ( 1 − S k ) ≈ 1 × ( 1 − 1 ) = 0 = S_k(1 - S_k) \approx 1 \times (1 - 1) = 0 =Sk(1Sk)1×(11)=0对于 i ≠ j i \neq j i=j 的项: 梯度 = − S i S j ≈ − 0 × 1 = 0 = -S_i S_j \approx -0 \times 1 = 0 =SiSj0×1=0 − 0 × 0 = 0 -0 \times 0 = 0 0×0=0
当方差随着维度 d k d_k dk 变大时,输入 Softmax 的数值会分布在绝对值极大的区域。这必然导致 Softmax 的输出变成一个 One-hot 向量(一个 1,剩下全是 0)。而无论是 S i ( 1 − S i ) S_i(1 - S_i) Si(1Si) 还是 − S i S j -S_i S_j SiSj,只要 S i S_i Si 极其接近 1 或 0,所有的偏导数都会立刻变成 0。梯度为 0,反向传播的链式法则就在这里断裂(梯度消失),前面的 Q、K 矩阵权重就再也得不到更新,模型彻底变成“一块石头”。这就是为什么数学上必须除以 d k \sqrt{d_k} dk 将方差强行拉回 1 的根本原因。

3.5 多头注意力机制(Multi-Head Attention)

在这里插入图片描述
多头注意力(Multi-Head Attention)的核心思想与 CNN 的多通道(Multi-Channel)如出一辙。 它拒绝用单一的视角去理解语言,而是强行创造出多个独立的特征子空间(Subspaces),让模型能够同时从语法、语义、逻辑等多个维度去解析同一句话。
核心一:打破 Softmax 的“零和博弈”限制在数学上,Softmax 是一个“零和博弈”函数——所有权重的总和必须绝对等于 1。如果你只有一个头(单头注意力),这意味着如果模型决定把 90% 的注意力给“主谓关系”,它就只剩下 10% 的额度去关注“时态”、“修饰语”或“指代关系”。单头注意力无法同时表达多种强烈的、不同类型的语义关联。多头机制的核心,就是给模型发放了 h h h 张独立的“注意力信用卡”。每个头都有自己独立且完整的 100% 额度(独立的 Softmax 分布)。这样,模型就能在 Head 1 全力关注语法结构的对齐,在 Head 2 全力关注情感色彩的关联,彻底解除了单点重叠特征的冲突。
核心二:强制性的“特征解耦” (Disentanglement)在深度学习的研究中,我们最怕的就是高维特征糅杂在一起变成一锅粥(特征纠缠)。原始的 512 维向量是一个极其复杂的混合体。通过将 512 维强行切分或投影到 8 个 64 维的正交子空间(Orthogonal Subspaces)中,多头机制实际上是在做一种强制的特征隔离。这就像在做高阶的视觉特征提取时,我们绝不会指望用一个极其复杂的万能滤波器去同时识别物体的轮廓、纹理、光影和深度。相反,我们会用不同的通道(Channels)或特征金字塔去分别提取。多头机制强制网络在降维的“信息瓶颈”中,把语言中混杂的语法、词义、逻辑关系剥离开来,分布到不同的子空间中去独立刻画。
核心三:隐式的“集成学习” (Ensemble Learning)在机器学习中,提升模型鲁棒性最简单粗暴的方法就是集成(Ensemble)——训练多个不同的模型,然后综合它们的预测结果。多头注意力本质上就是在网络内部实现了一种极低成本的集成学习。8 个头由于初始化的随机权重不同,在反向传播的优化地形中,它们会自发地掉进不同的局部最优解(即学会了关注不同的模式)。最后通过 W O W^O WO 矩阵进行拼接和线性组合,相当于综合了 8 个“弱语义专家”的意见,得出了一个“强语义共识”。这极大地提升了模型的容错率和泛化能力——即使某一个头学偏了(比如过度关注了噪声),其他 7 个头的正确关注点依然能把整体表示拉回正轨。
笔者个人粗浅的理解,非要一句话概括为什么要多头注意力的话,那么就是:“增加了更多的可能”。

四.残差连接

假设我们有一个没有残差连接的普通深层网络,输入是 x x x,经过一层层的函数变换 f 1 , f 2 , … , f n f_1, f_2, \dots, f_n f1,f2,,fn,最后得到输出 y y y,并计算损失函数 L L L。前向传播就是一个疯狂嵌套的复合函数: L = Loss ( f n ( f n − 1 ( … f 1 ( x ) …   ) ) ) L = \text{Loss}(f_n(f_{n-1}(\dots f_1(x)\dots))) L=Loss(fn(fn1(f1(x))))在反向传播时,我们要更新第 1 层的参数,必须求 L L L 对第一层输入 x x x 的导数(梯度)。根据微积分的链式法则,我们要把每一层的导数乘起来: ∂ L ∂ x = ∂ L ∂ f n ⋅ ∂ f n ∂ f n − 1 … ∂ f 2 ∂ f 1 ⋅ ∂ f 1 ∂ x \frac{\partial L}{\partial x} = \frac{\partial L}{\partial f_n} \cdot \frac{\partial f_n}{\partial f_{n-1}} \dots \frac{\partial f_2}{\partial f_1} \cdot \frac{\partial f_1}{\partial x} xL=fnLfn1fnf1f2xf1如果每一层的导数都略小于 1(比如 0.9),连乘 100 层后: 0.9 100 ≈ 0.000026 0.9^{100} \approx 0.000026 0.91000.000026。这就是梯度消失(Vanishing Gradient)。底层网络根本接收不到更新信号,直接“脑死亡”。如果每一层的导数都略大于 1(比如 1.1),连乘 100 层后: 1.1 100 ≈ 13780 1.1^{100} \approx 13780 1.110013780。这就是梯度爆炸(Exploding Gradient)。数值直接溢出,网络瞬间崩溃。
残差连接为: y = F ( x ) + x y = F(x) + x y=F(x)+x假设我们在反向传播,要求 y y y 对输入 x x x 的偏导数: ∂ y ∂ x = ∂ ( F ( x ) + x ) ∂ x \frac{\partial y}{\partial x} = \frac{\partial (F(x) + x)}{\partial x} xy=x(F(x)+x)根据微积分的加法求导法则: ∂ y ∂ x = ∂ F ( x ) ∂ x + ∂ x ∂ x \frac{\partial y}{\partial x} = \frac{\partial F(x)}{\partial x} + \frac{\partial x}{\partial x} xy=xF(x)+xx ∂ y ∂ x = ∂ F ( x ) ∂ x + 1 \frac{\partial y}{\partial x} = \frac{\partial F(x)}{\partial x} + 1 xy=xF(x)+1以前的链式法则是连乘: A ⋅ B ⋅ C … A \cdot B \cdot C \dots ABC 只要有一个是 0,全盘皆输。
现在的链式法则变成了: ( A + 1 ) ⋅ ( B + 1 ) ⋅ ( C + 1 ) … (A+1) \cdot (B+1) \cdot (C+1) \dots (A+1)(B+1)(C+1)因为有了这个恒定的 + 1 +1 +1,无论 ∂ F ( x ) ∂ x \frac{\partial F(x)}{\partial x} xF(x) 变得多么小(甚至完全变成了 0),括号里的值最小也是 1!梯度就像在拥堵的城市道路(网络层)旁边,修建了一条绝对畅通的高速公路(恒等映射)。即便所有的网络层都梯度消失了,来自顶层 Loss 的梯度依然可以通过无数个“ + 1 +1 +1”,无损地、光速地直达网络最底层。
除了上面的有点,残差连接还有下面的好处:
1.保护“词汇身份”的完整性:最底层的 Embedding 层把“苹果”映射成了一个向量。随着网络层数加深,自注意力机制不断地把别的词的特征融合进来。如果只有 Z = A V Z = AV Z=AV,没有外面的 + x + x +x,“苹果”原本的词意特征在经过几十层疯狂的矩阵混合后,早就连渣都不剩了。残差连接确保了:无论你吸收了多少上下文,你依然是你自己(原词的语义基础被保底了)。
2.损失平滑化(Loss Landscape Smoothing):大量的研究证明,如果画出极其深的网络损失函数的 3D 地形图,没有残差的网络,地形就像刺猬的背,充满了锯齿、局部最优和悬崖,优化器根本找不到路。而加了残差连接后,高维地形瞬间被抚平,变成了一个平滑的巨大漏斗。这也是为什么今天的大模型能够用如此粗暴的梯度下降,安稳地收敛到极佳状态的底层原因。

五.总结

剥开纷繁复杂的公式,Transformer 的本质其实极其纯粹:它提供了一种极其优雅的数学拓扑结构。它从不“理解”语言,它只是用极度自由又被精心约束的矩阵空间,承载了语言的无限可能。我们惊叹于大模型的智能涌现,但在这背后,不过是冰冷的梯度下降在浩瀚的参数海中,顺理成章走到的那个最优解。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐