实验例子固定:
句子A:我爱你 ,序列
[我,爱,你]句子B:你爱我 ,序列
[你,爱,我]词向量:我=1,21,21,2,爱=3,13,13,1,你=2,32,32,3
简化条件:WQ=WK=WV=IW_Q=W_K=W_V=IWQ=WK=WV=I,不加入任何位置编码(无绝对位置、无RoPE)
现象:两个句子语义主谓宾完全相反,但经过自注意力后,中间词「爱」的聚合输出向量完全一致。

完整分步因果链
步骤1:词嵌入阶段------只编码词语本身,不带语序信息
词嵌入只看token内容,不看这个词放在句子第几个位置。
- 句子A「我爱你」:
我=1,21,21,2,爱=3,13,13,1,你=2,32,32,3
XA=123123 X_A=\begin{bmatrix}1 & 2\\3 & 1\\2 & 3\end{bmatrix} XA= 132213 - 句子B「你爱我」:
你=2,32,32,3,爱=3,13,13,1,我=1,21,21,2
XB=233112 X_B=\begin{bmatrix}2 & 3\\3 & 1\\1 & 2\end{bmatrix} XB= 231312
✔事实:两个句子中,"爱"的原始词向量都是 3,13,13,1。
这本身没有错误:词嵌入代表单词本身的词义;问题不出在这里,问题出在上下文聚合。
步骤2:无位置编码自注意力计算分数矩阵 S=QK⊤S=QK^\topS=QK⊤
本例 Q=K=V=XQ=K=V=XQ=K=V=X。
SA=XAXA⊤=55851098913,SB=XBXB⊤=13989105855 S_A=X_A X_A^\top= \begin{bmatrix} 5 & 5 & 8 \\ 5 & 10 & 9 \\ 8 & 9 & 13 \end{bmatrix},\quad S_B=X_B X_B^\top= \begin{bmatrix} 13 & 9 & 8 \\ 9 & 10 & 5 \\ 8 & 5 & 5 \end{bmatrix} SA=XAXA⊤= 55851098913 ,SB=XBXB⊤= 13989105855
我们重点观察中间token「爱」,也就是矩阵的第1行。
- A中爱这一行分数:5, 10, 95,\\;10,\\;95,10,9,含义:爱对我分数5,爱对自己10,爱对你9
- B中爱这一行分数:9, 10, 59,\\;10,\\;59,10,5,含义:爱对你分数9,爱对自己10,爱对我5
数学现象:分数只是非对角元互相交换 ,不是产生一组全新的数值。
原因:只是把序列里"我"和"你"两个token整体调换位置。
步骤3:对分数做Softmax得到注意力权重矩阵A
对爱所在的第1行做Softmax:
- A场景权重行:aA,1=0.0050.7270.268\boldsymbol a_{A,1} = \begin{bmatrix}0.005 & 0.727 & 0.268\end{bmatrix}aA,1=0.0050.7270.268
语义:爱几乎不看我,主要关注自己,较多关注你。 - B场景权重行:aB,1=0.2680.7270.005\boldsymbol a_{B,1} = \begin{bmatrix}0.268 & 0.727 & 0.005\end{bmatrix}aB,1=0.2680.7270.005
语义:爱较多关注你,主要关注自己,几乎不看我。
权重分布确实不一样!这一步网络"看到"了周围token的差异。
但是接下来加权求和会发生抵消。
步骤4:加权求和 O=A⋅VO = A\cdot VO=A⋅V,加法交换律造成表征碰撞
oA,1=0.0050.7270.268123123=0.005⋅v我+0.727⋅v爱+0.268⋅v你≈2.722, 1.541 \boldsymbol o_{A,1}= \begin{bmatrix}0.005 & 0.727 & 0.268\end{bmatrix} \begin{bmatrix} 1 & 2\\ 3 & 1\\ 2 & 3 \end{bmatrix} =0.005\cdot \boldsymbol v_我 +0.727\cdot \boldsymbol v_爱 +0.268\cdot \boldsymbol v_你 \approx 2.722,\\;1.541 oA,1=0.0050.7270.268 132213 =0.005⋅v我+0.727⋅v爱+0.268⋅v你≈2.722,1.541
oB,1=0.2680.7270.005233112=0.268⋅v你+0.727⋅v爱+0.005⋅v我≈2.722, 1.541 \boldsymbol o_{B,1}= \begin{bmatrix}0.268 & 0.727 & 0.005\end{bmatrix} \begin{bmatrix} 2 & 3\\ 3 & 1\\ 1 & 2 \end{bmatrix} =0.268\cdot \boldsymbol v_你 +0.727\cdot \boldsymbol v_爱 +0.005\cdot \boldsymbol v_我 \approx 2.722,\\;1.541 oB,1=0.2680.7270.005 231312 =0.268⋅v你+0.727⋅v爱+0.005⋅v我≈2.722,1.541
代数恒等式:
w0v0+w1v1+w2v2=w2v2+w1v1+w0v0 w_0\boldsymbol v_0 + w_1\boldsymbol v_1 + w_2\boldsymbol v_2 =w_2\boldsymbol v_2 + w_1\boldsymbol v_1 + w_0\boldsymbol v_0 w0v0+w1v1+w2v2=w2v2+w1v1+w0v0
关键事件:
权重的列发生交换的同时,V矩阵的行也同步交换;加法交换律让两者加权求和结果完全相等。
⚠信息不可逆丢失:
到这一步,浮点数层面已经无法区分:这个向量是"我→爱→你"算出来,还是"你→爱→我"算出来。
注意力权重矩阵AAA是中间临时变量,不会传给下一层 。只有求和完的o\boldsymbol oo继续往后走。
步骤5:进入FFN前馈网络,FFN看不到历史信息
自注意力输出 o\boldsymbol oo 送入残差、层归一化之后给到FFN。
FFN公式:
FFN(o)=max(0,oW1+b1)W2+b2 \mathrm{FFN}(\boldsymbol o) = \max(0,\boldsymbol o W_1+\boldsymbol b_1)W_2+\boldsymbol b_2 FFN(o)=max(0,oW1+b1)W2+b2
核心性质:
- FFN逐行独立运算,各个token之间不发生交互;
- FFN的输入仅仅是最终向量o\boldsymbol oo;
- FFN看不到:注意力权重矩阵AAA、原始输入矩阵XXX、矩阵行号、加权求和中间过程;
- FFN是确定性函数:输入向量完全相同,则输出一定完全相同。
代入本例:
FFN(oA,1)=FFN(2.722,1.541) \mathrm{FFN}(\boldsymbol o_{A,1})=\mathrm{FFN}\big(2.722,1.541\big) FFN(oA,1)=FFN(2.722,1.541)
FFN(oB,1)=FFN(2.722,1.541) \mathrm{FFN}(\boldsymbol o_{B,1})=\mathrm{FFN}\big(2.722,1.541\big) FFN(oB,1)=FFN(2.722,1.541)
👉 FFN输出的两个向量依旧完全相等。
误区澄清:矩阵行号只是人类阅读的索引,属于元信息,不参与GPU浮点数计算。神经网络张量里面只有数字,没有"这组向量原来来自第几号位置"这种标签。
步骤6:等价表征向下一层逐层传递,信息不能自我修复
FFN输出作为下一层Transformer的输入 。
下一层自注意力的Query、Key由这组向量投影得到:
q=hWQ q = h W_Q q=hWQ
因为输入隐藏状态hhh完全一样,模型参数固定,所以得到的qqq、kkk也完全一样。
重要结论:
一旦某一层得到完全相同的隐藏向量,后面无论堆叠多少层Transformer(多头注意力+FFN),都无法凭空恢复已经丢失的语序信息 。
相同输入经过确定性网络,永远只能产生相同输出;多层非线性不能"分裂"相同向量成为两个不同向量。
丢失的主谓宾关系信息不会自己长回来。
步骤7:传播到最后一层,对下游任务产生影响
最后一层输出隐藏状态送入输出层(词表投影+Softmax,用来预测下一个token)。
两个语义相反的输入,得到完全一样的隐藏状态,就会得到完全一样的词概率分布。
分两种实际表现:
- ✅任务不需要区分语序(句子情感分类:我爱你 / 你爱我都是正向情感)
此时目标标签碰巧一致,模型看起来可以答对,产生"好像不用位置编码也能工作"的迷惑假象。 - ❌任务强依赖语序、主谓宾、时序(文本生成、问答、填空)
- 例子1生成:
输入上下文我爱你期望后续:,希望和你在一起
输入上下文你爱我期望后续:,我也很喜欢你
模型给出相同概率分布,分不清两种上下文,生成文本逻辑混乱。 - 例子2问答:
句子1:小明打小红 → 问题:谁是受害者?期望:小红
句子2:小红打小明 → 问题:谁是受害者?期望:小明
无位置编码,表征等价,输出答案分布一致,必然有一个答案错误。
- 例子1生成:
现象特征:不会程序报错、不会loss爆炸;训练可以收敛,但凡是依赖语序的样本大量出错,验证集指标显著下滑。
步骤8:位置编码(RoPE)如何从源头阻断该问题
RoPE不在输入上加位置向量;而是只旋转Q、K向量 ,把相对位置信息注入注意力打分。
此时,交换"我"和"你"之后:
- 注意力分数不再是简单的数字互换,而是生成一组全新的分数;
- 加权求和输出 oA,1≠oB,1\boldsymbol o_{A,1} \neq \boldsymbol o_{B,1}oA,1=oB,1;
- FFN拿到两组不一样的向量,后续网络可以区分两种主谓宾语义。
本质:破坏置换不变性,在加权求和之前就避免不同语义坍缩到同一个向量。
总结
- 词嵌入:只编码单词本身,不带位置;两个句子中"爱"初始向量相同,这不是bug。
- 无位置自注意力:调换序列中两个token,注意力权重列发生交换,同时V矩阵行同步交换。
- 加法交换律:加权求和输出向量坍缩为同一个浮点数向量;主谓宾语义信息在求和这一步不可逆丢失;注意力权重是中间临时变量,不向下传递。
- FFN:仅接收求和完毕的向量,看不到权重、原始矩阵、行号标签;确定性函数:相同输入必然相同输出。
- 逐层传播:等价隐藏状态向下继承;多层网络不能凭空恢复已丢失信息。
- 下游表现:语义相近任务看不出问题;依赖语序、主谓宾、时序的生成/问答任务预测出错;无程序崩溃,但是效果退化。
- RoPE作用:修改Q/K打分,破坏置换不变性,从源头让不同语序得到不同聚合输出向量。
核心一句话记忆:
不带位置编码的自注意力是集合运算,只看有哪些词,不看词的先后顺序;加法交换律会抹掉语序带来的语义差异。