导读:本期聚焦于蚂蚁创作的《Transformer架构如何支撑语言推理:注意力机制与位置编码》,敬请观看详情。语言推理要求模型同时理解词与词之间的内容关联以及它们在句子中的先后顺序。Transformer把这两件事拆解给两个核心组件:自注意力机制负责内容匹配与依赖聚合,位置编码负责为无顺序的向量序列注入结构信息。缩放点积注意力通过查询和键的相似度计算权重,再对值向量加权求和,使模型能跳过长距离直接建立依赖;多头注意力进一步把表示空间拆成多个子空间,分别捕捉类比、共指、逻辑条件等不同关系。位置编码则弥补注意力对顺序不敏感的缺陷,正弦编码用不同频率刻画绝对位置,可学习编码与旋转位置编码在长序列和相对距离上表现更好。两者协同后,模型既能判断哪些词在内容上相关,又能区分这种相关发生的时间先后,从而支撑蕴含判断、多跳问答和因果推理等语言推理任务。

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

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进入梯度极小的饱和区。掩码的作用是在解码阶段屏蔽未来位置,使模型进行因果推理时只能利用已经生成的左侧信息,避免答案中提前出现尚未推导出的结论。

单头注意力只能在一个表示空间中计算相关性,表达能力有限。多头注意力将QKV分别线性投影到多个低维子空间,在每个子空间中独立执行注意力,再把结果拼接起来。这种设计让不同注意力头可以关注不同层面的语言关系:有的头可能专门追踪代词与先行词之间的共指关系,有的头可能关注条件句中的“如果”与“那么”,还有的头可能负责找到否定词的作用范围。语言推理往往需要同时处理这些关系,多头机制提供了并行捕捉多种依赖结构的能力。

位置编码为什么是不可或缺的一环

自注意力机制本身对序列顺序并不敏感。如果交换输入序列中两个词的位置,注意力计算只取决于向量之间的内容相似度,输出矩阵会发生相应置换,但模型内部没有任何参数能够天然区分前后顺序。然而语言推理高度依赖顺序,例如“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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。