简介:本文系统讲解Transformer的定义、核心组成与工作原理,重点解析单词Embedding、位置编码与自注意力机制的作用与实现方式,对比其与RNN、词袋模型的本质区别,并梳理典型应用场景与工程实践注意事项,帮助读者快速建立对Transformer架构的整体认知。
Transformer 是一种基于自注意力机制构建的深度神经网络架构,最初为解决序列到序列的自然语言处理任务而提出。它的核心思想可以概括为一句话:完全依靠注意力机制来建模序列中任意两个位置之间的依赖关系,而不再使用循环结构逐步递推地处理序列。
可以从三个视角来理解这个定义:
在 Transformer 出现之前,序列建模主要依赖循环神经网络及其改进版本。这类结构存在两个根本性限制:
Transformer 用自注意力机制让序列中每个位置直接与所有其他位置建立连接——任意两个单词之间的信息传递路径长度都是 1,同时整个序列可以一次性并行计算。这两点共同决定了它成为后续大规模预训练语言模型的基础架构。
计算机无法直接理解文字,第一步是把离散的词(或子词、字符)映射为低维稠密向量,这就是单词 Embedding。获取方式有两类:
Embedding 的本质作用是让语义相近的词在向量空间中彼此靠近,为后续的注意力计算提供可比较的数学表示。
这是理解 Transformer 最关键、也最容易被初学者忽略的一环。
问题所在:注意力机制本质上是“集合运算”——它对输入元素的顺序并不敏感。如果只把词向量送入模型,那么“猫追狗”和“狗追猫”经过注意力计算后得到的表示几乎完全相同,模型就退化成了词袋模型,丢失了语序这一对自然语言至关重要的信息。而 Transformer 又不采用循环结构,模型本身天然感知不到单词的先后顺序。
解决方案:在词向量之外,额外引入位置 Embedding(Position Encoding,简称 PE),显式地把“单词出现在句子中的第几个位置”编码进向量。PE 的维度与单词 Embedding 完全相同,两者直接逐位相加后作为模型真正的输入。
位置编码有两种获得方式:一是作为可训练参数学习得到;二是通过固定公式计算得到。经典 Transformer 采用后者,公式如下:
参数含义:
用如下示意伪代码可以直观理解其计算过程:
import numpy as npdef positional_encoding(max_len, d):pe = np.zeros((max_len, d))pos = np.arange(max_len).reshape(-1, 1) # 每个单词的位置索引i = np.arange(0, d, 2) # 偶数维度索引div = np.power(10000, i / d) # 不同维度对应的频率pe[:, 0::2] = np.sin(pos / div) # 偶数维填 sinpe[:, 1::2] = np.cos(pos / div) # 奇数维填 cosreturn pe # 最后与词向量相加
采用这种公式计算的优点非常明确:
自注意力机制可以类比为一次“模糊检索”:序列中的每个单词会生成三个向量——Query(查询)、Key(键)、Value(值)。当前单词用自己的 Query 去和所有单词的 Key 做相似度匹配,匹配得分经过 softmax 归一化后作为权重,对所有单词的 Value 加权求和,得到融合了全局上下文的新表示。核心公式为:
Attention(Q, K, V) = softmax(QK^T / √d_k) · V
其中 √d_k 是缩放因子,用于防止点积过大导致 softmax 输出趋于极端、梯度消失。多头注意力则把向量切分为多份,在多个子空间中并行计算注意力再拼接,让不同“头”分别关注语法关系、语义关联、位置邻近等不同模式的信息。
每一层还包含一个对每个位置独立作用的前馈网络,负责对注意力聚合后的信息做非线性变换;残差连接把子层输入直接加到输出上,缓解深层网络的梯度问题;层归一化稳定各层输出的数值分布。这些组件共同保证了模型可以堆叠得很深而训练依然稳定。
经典 Transformer 分为两部分:编码器负责对输入序列做双向的全局理解;解码器负责自回归地生成输出序列,其中使用了带掩码的注意力,保证生成第 t 个词时只能看到前 t-1 个位置,避免“偷看”未来信息。
以文本生成任务为例,整体流程如下:
在工程实践中,开发者既可以基于开源深度学习框架自行实现,也可以借助主流云平台提供的机器学习服务(例如百度智能云面向模型训练与推理的通用平台类服务)来获取大规模算力并完成部署。
Transformer 是一种以自注意力为核心的序列建模架构:单词 Embedding 把文字转化为语义向量,位置 Embedding 用公式或训练的方式把词序信息注入模型,弥补了注意力机制对顺序不敏感的天然缺陷;自注意力与多头机制则让每个位置都能直接获取全局上下文。正是“全局依赖建模 + 完全并行计算”这两大特性,使它成为当今自然语言处理乃至更广泛序列建模任务的基础性技术。理解了词向量与位置编码这两个输入端组件,也就掌握了读懂 Transformer 的第一把钥匙。