1. 整体架构概览
Transformer遵循编码器-解码器结构,但和传统的RNN或CNN不同,它完全基于注意力机制,没有循环或卷积。整体架构如下图所示(可自行想象):
-
编码器(Encoder):由多个相同的层堆叠而成(原论文为6层)。每一层包含两个子层:
-
多头自注意力(Multi-Head Self-Attention)
-
前馈神经网络(Feed-Forward Neural Network,FFN)
每个子层周围都有残差连接(Residual Connection),随后进行层归一化(Layer Normalization)。
-
-
解码器(Decoder):同样由多个相同的层堆叠而成(也是6层)。每一层包含三个子层:
-
掩码多头自注意力(Masked Multi-Head Self-Attention)------防止看到未来的词。
-
交叉注意力(Cross-Attention)------将编码器的输出与解码器的当前状态进行交互。
-
前馈神经网络。
每个子层同样有残差连接和层归一化。
-
-
输入处理:输入序列首先通过词嵌入(Word Embedding)转换为向量,然后加上位置编码(Positional Encoding)以注入序列顺序信息。
2. 核心组件详解
2.1 自注意力机制(Self-Attention)
自注意力是Transformer的核心,它允许模型在处理每个词时,动态地关注输入序列中所有其他词的相关性。对于每个输入向量,自注意力计算它与序列中所有向量的注意力权重,然后用这些权重加权求和得到输出。
计算步骤:
对于输入序列 X=(x1,x2,...,xn)X=(x1,x2,...,xn),每个 xixi 是一个 dmodeldmodel 维的向量。自注意力机制通过三个可学习的权重矩阵 WQ,WK,WVWQ,WK,WV 将每个 xixi 映射为查询(Query)、键(Key)和值(Value)向量:
Qi=xiWQ,Ki=xiWK,Vi=xiWVQi=xiWQ,Ki=xiWK,Vi=xiWV
通常,Q,K,VQ,K,V 的维度为 dkdk,且 dk=dmodel/hdk=dmodel/h,其中 hh 是多头注意力的头数。
然后,对于每个查询 QiQi,计算它与所有键 KjKj 的点积,得到注意力分数:
scoreij=Qi⋅Kjscoreij=Qi⋅Kj
这些分数除以 dkdk 进行缩放(防止点积过大导致梯度消失),然后通过Softmax函数归一化为概率分布:
αij=exp(scoreij/dk)∑k=1nexp(scoreik/dk)αij=∑k=1nexp(scoreik/dk)exp(scoreij/dk)
最后,输出向量 zizi 是所有值向量 VjVj 的加权和:
zi=∑j=1nαijVjzi=j=1∑nαijVj
这样,每个位置 ii 的输出融合了整个序列的信息,权重 αijαij 表示 ii 对 jj 的关注程度。
为什么用点积?
点积可以衡量两个向量的相似度,计算高效。缩放因子 dkdk 是为了使Softmax的输入方差稳定在1左右,避免梯度饱和。
2.2 多头注意力(Multi-Head Attention)
单头自注意力可能只能捕捉一种类型的依赖关系。为了增强模型的表达能力,Transformer使用多头注意力:并行执行 hh 个不同的自注意力(每个头有不同的 WQ,WK,WVWQ,WK,WV),然后将所有头的输出拼接起来,再通过一个线性变换投影回 dmodeldmodel 维。
具体来说,对于每个头 ii,计算输出 headi=Attention(QWiQ,KWiK,VWiV)headi=Attention(QWiQ,KWiK,VWiV)。然后拼接所有头:
MultiHead(Q,K,V)=Concat(head1,...,headh)WOMultiHead(Q,K,V)=Concat(head1,...,headh)WO
其中 WOWO 是输出投影矩阵。
多头机制允许模型在不同子空间中关注不同的位置组合,比如一个头可能关注句法关系,另一个头关注语义相关性。
2.3 位置编码(Positional Encoding)
自注意力本身是置换不变的(即打乱输入顺序,输出也会相应打乱,但权重关系不变),因此必须显式地将序列的位置信息注入模型。Transformer使用位置编码(PE)添加到输入嵌入中。位置编码可以是固定的,也可以是可学习的。原论文使用正弦和余弦函数:
PE(pos,2i)=sin(pos100002i/dmodel),PE(pos,2i+1)=cos(pos100002i/dmodel)PE(pos,2i)=sin(100002i/dmodelpos),PE(pos,2i+1)=cos(100002i/dmodelpos)
其中 pospos 是位置索引,ii 是维度索引。这种编码方式使得模型能够容易地学习相对位置关系,因为对于固定偏移 kk,PEpos+kPEpos+k 可以表示为 PEposPEpos 的线性函数。
2.4 前馈神经网络(FFN)
每个编码器和解码器层中的自注意力子层之后,都跟着一个前馈网络。它是一个简单的全连接多层感知机,通常包含两个线性变换和一个非线性激活函数(如ReLU):
FFN(x)=max(0,xW1+b1)W2+b2FFN(x)=max(0,xW1+b1)W2+b2
在Transformer中,FFN的中间维度通常比 dmodeldmodel 大(原论文中 dmodel=512dmodel=512,FFN内部维度为2048)。这个子层对每个位置独立且相同地处理(即逐位置前馈网络),但在不同层之间参数不同。
2.5 残差连接和层归一化
每个子层(自注意力或FFN)的输出都会加上其输入(残差连接),然后进行层归一化。即:
Output=LayerNorm(x+Sublayer(x))Output=LayerNorm(x+Sublayer(x))
残差连接有助于缓解深度网络中的梯度消失问题,使梯度能直接流过子层。层归一化则对每个样本的特征维度进行归一化,稳定训练过程。
3. 编码器与解码器的具体工作流程
3.1 编码器
输入序列(如源语言句子)经过词嵌入和位置编码后,得到向量序列 XX。然后依次通过 NN 个编码器层:
-
多头自注意力:X′=LayerNorm(X+MultiHead(X,X,X))X′=LayerNorm(X+MultiHead(X,X,X))
注意:在自注意力中,Q、K、V都来自同一个 XX,即自注意力。
-
前馈网络:X′′=LayerNorm(X′+FFN(X′))X′′=LayerNorm(X′+FFN(X′))
最终输出 EncoderOutputEncoderOutput 是一个同样长度的向量序列,每个向量编码了对应词及其上下文的信息。
3.2 解码器
解码器在训练时以目标序列(如目标语言句子)作为输入,但为了自回归生成,需要掩蔽未来信息。输入同样经过嵌入和位置编码得到 YY。然后逐层处理:
-
掩码多头自注意力 :
Y′=LayerNorm(Y+MaskedMultiHead(Y,Y,Y))Y′=LayerNorm(Y+MaskedMultiHead(Y,Y,Y))
这里的掩码(Mask)是为了防止当前位置关注未来位置。具体做法是在计算注意力分数时,将未来位置的分数设置为 −∞−∞(经过Softmax后权重为0)。这保证了预测第 tt 个词时只能使用前 t−1t−1 个词的信息。
-
交叉注意力 :
Y′′=LayerNorm(Y′+MultiHead(Y′,EncoderOutput,EncoderOutput))Y′′=LayerNorm(Y′+MultiHead(Y′,EncoderOutput,EncoderOutput))
这里,查询来自解码器的当前状态 Y′Y′,而键和值来自编码器的输出。这样解码器能够关注输入序列的相关部分。
-
前馈网络 :
Y′′′=LayerNorm(Y′′+FFN(Y′′))Y′′′=LayerNorm(Y′′+FFN(Y′′))
经过 NN 层后,解码器的输出通过一个线性层(映射到词汇表大小)和Softmax,得到每个位置上的下一个词的概率分布。
在推理(生成)时,解码器采用自回归方式:一次生成一个词,将已生成的词作为输入继续预测下一个词。
4. 训练与损失函数
Transformer通常使用交叉熵损失函数进行训练。对于机器翻译,目标序列的每个位置都有真实词,模型输出概率分布,计算损失并反向传播。由于解码器是自回归的,训练时采用教师强制(Teacher Forcing):将真实目标序列作为解码器输入(但掩蔽未来),而不是使用模型自己预测的词。这样能加速训练并稳定收敛。
为了防止过拟合,还会使用Dropout、标签平滑(Label Smoothing)等技术。
5. 关键优势与影响
-
并行计算:自注意力可以一次性计算所有位置的注意力,不像RNN需要逐步计算,因此训练速度更快。
-
长距离依赖:自注意力直接连接任意两个位置,路径长度恒为1,更容易捕捉长距离依赖。
-
可解释性:注意力权重可以可视化,帮助理解模型关注哪些部分。
-
通用性:Transformer不仅用于NLP,还被扩展到计算机视觉(ViT)、语音处理等领域。
6. 总结
Transformer通过自注意力机制替代了循环和卷积,实现了高效的并行计算和对长距离依赖的建模。其核心组件包括多头自注意力、位置编码、前馈网络、残差连接和层归一化。编码器-解码器结构使其适用于序列到序列的任务,同时通过掩码支持自回归生成。这一架构奠定了现代大规模预训练模型的基础,是深度学习领域里程碑式的工作。