Transformer从被提出后,迅速成为大语言模型的基础架构。语言推理任务通常要求模型在若干前提之间建立联系,并根据这些联系得出结论。例如面对“如果下雨,地面会湿;现在下雨了”这样一组输入,模型需要知道第二个分句与第一个分句的条件关系,而不是简单地把所有词堆在一起。支撑这种能力的核心并不是单一的深度网络,而是两个设计的组合:注意力机制让每个位置可以根据上下文动态聚合信息,位置编码让模型知道这些信息在序列中位于何处。

自注意力机制如何建立推理依赖
Transformer中的自注意力机制可以理解为一种可微的键值检索系统。输入序列中的每个位置都会生成查询向量Q、键向量K和值向量V。查询向量表示当前词希望从上下文中获取什么信息,键向量表示每个词能提供什么信息,值向量表示每个词真正携带的内容。模型先计算查询向量与所有键向量的相似度,再用softmax将相似度转换为权重,最后对值向量进行加权求和。这样,任何一个位置都可以直接关注到序列中的任意其他位置,而不需要像循环神经网络那样逐步传递信息。
缩放点积注意力的计算过程可以用下列代码表示:
import numpy as np
def scaled_dot_product_attention(Q, K, V, mask=None):
d_k = K.shape[-1]
scores = np.matmul(Q, K.transpose(0, 1, 3, 2)) / np.sqrt(d_k)
if mask is not None:
scores = np.where(mask == 0, -1e9, scores)
weights = np.exp(scores - np.max(scores, axis=-1, keepdims=True))
weights = weights / np.sum(weights, axis=-1, keepdims=True)
output = np.matmul(weights, V)
return output, weights
这里除以d_k的平方根是为了防止点积数值过大,导致softmax进入梯度极小的饱和区。掩码的作用是在解码阶段屏蔽未来位置,使模型进行因果推理时只能利用已经生成的左侧信息,避免答案中提前出现尚未推导出的结论。
单头注意力只能在一个表示空间中计算相关性,表达能力有限。多头注意力将Q、K、V分别线性投影到多个低维子空间,在每个子空间中独立执行注意力,再把结果拼接起来。这种设计让不同注意力头可以关注不同层面的语言关系:有的头可能专门追踪代词与先行词之间的共指关系,有的头可能关注条件句中的“如果”与“那么”,还有的头可能负责找到否定词的作用范围。语言推理往往需要同时处理这些关系,多头机制提供了并行捕捉多种依赖结构的能力。
位置编码为什么是不可或缺的一环
自注意力机制本身对序列顺序并不敏感。如果交换输入序列中两个词的位置,注意力计算只取决于向量之间的内容相似度,输出矩阵会发生相应置换,但模型内部没有任何参数能够天然区分前后顺序。然而语言推理高度依赖顺序,例如“A大于B”和“B大于A”表达的关系完全不同;“先下雨后地湿”和“先地湿后下雨”的因果方向也不同。因此Transformer必须在输入表示中显式编码位置信息。
最初的Transformer使用正弦位置编码。对于位置pos和维度i,偶数维度使用正弦函数,奇数维度使用余弦函数,波长呈几何级数增长。不同频率的组合使每个位置拥有唯一的编码向量,也让模型能够通过向量之间的线性关系感知相对距离。下面是一段生成正弦位置编码的代码:
import numpy as np
def sinusoidal_position_encoding(seq_len, d_model):
pe = np.zeros((seq_len, d_model))
position = np.arange(seq_len)[:, np.newaxis]
div_term = np.exp(np.arange(0, d_model, 2) * (-np.log(10000.0) / d_model))
pe[:, 0::2] = np.sin(position * div_term)
pe[:, 1::2] = np.cos(position * div_term)
return pe
这种编码具有外推能力,理论上可以处理训练期间未见过的更长序列,因为函数定义是连续的。不过实际应用中,当序列长度显著超过训练分布时,仅靠正弦位置编码并不能保证模型稳定泛化。因此后续工作引入了可学习位置编码,把位置编码作为参数随训练更新。可学习编码在小规模数据和固定长度任务上表现直观,但外推能力较弱。
相对位置编码和旋转位置编码进一步改变了位置信息的注入方式。相对位置编码不再只给每个绝对位置分配向量,而是直接建模两个位置之间的距离,使注意力权重能够感知相对偏移。旋转位置编码则在每一对维度上对查询和键向量进行旋转,使注意力计算天然带有相对位置信息。这类方法在长文档推理、代码理解和多轮对话中表现更好,因为它们更符合语言推理中“词与词之间的相对顺序”这一本质需求。
注意力与位置编码如何协同支撑推理
语言推理可以拆解为两个子问题:哪些信息应该放在一起比较,以及这些信息在时间或逻辑上具有怎样的关系。注意力机制解决第一个问题,它根据内容和当前表示动态计算相关性,使模型能够从长距离上下文中召回前提、条件或约束。位置编码解决第二个问题,它为每个向量附加位置特征,使模型在聚合信息时不会把不同位置的相同词完全等同。两者结合后,模型能够形成结构化的上下文表示。
以一个简单的蕴含推理为例,输入为“所有金属都能导电,铜是金属,因此铜能导电”。模型处理“铜”这个词时,注意力机制会提高它对“金属”和“导电”等词元的权重,同时降低对“因此”等连接词的权重。位置编码则帮助模型区分“金属”出现在前提一还是前提二,避免把“铜是金属”错误地理解为“金属是铜”。在一层层Transformer编码器中,低层可能更关注局部语法搭配,中层开始聚合跨分句的实体信息,高层则将这些信息压缩为可用于判断蕴含关系的表示。
在解码阶段,因果掩码与位置编码共同保证推理顺序。大语言模型逐词生成答案时,每个新词只能关注已经生成的内容。这要求模型在生成“能导电”之前,必须已经在前面的隐藏状态中保留“铜是金属”这一前提,并通过注意力把该前提信息读取出来。位置编码则让隐藏状态记录这些信息出现的先后,使得模型不会把结论与前提的时间顺序弄反。
这种协同也解释了为什么单独替换注意力或位置编码往往会削弱推理表现。移除位置编码后,模型仍然可以通过词向量内容找到相关词,但在需要区分因果方向、逻辑先后和语序歧义时会出现更多错误。削弱注意力则会让模型难以从长上下文中定位关键前提,只能依赖局部模式进行猜测。推理能力不是由某一层单独完成,而是由注意力提供的信息路由能力与位置编码提供的顺序约束在多层网络中逐步构建出来的。
Transformer注意力机制位置编码修改时间:2026-08-25 13:47:50