1. Transformer 整体流程概述
Transformer 模型的整个处理流程可以概括为从自注意力(Self-Attention)到多头注意力,再加上残差连接、层归一化、堆叠多层的结构。其核心思想是利用注意力机制对输入进行并行计算,从而避免传统 RNN 逐步依赖导致的并行化困难问题。
在 Transformer 模型中,编码器(Encoder) 和 解码器(Decoder) 均由若干相同的层堆叠而成。模型的基本构成单元如下:
- 自注意力层(Self-Attention Layer):计算输入中各个 token 之间的相关性,为每个 token 提供上下文表示。
- 多头注意力机制(Multi-Head Attention):并行计算多个注意力头,每个头学习不同的特征(例如,有的关注实体信息,有的关注语法信息)。
- 前馈神经网络层(Feed-Forward Layer):在每个注意力模块后面添加一个全连接的前馈网络,引入非线性变换。
- 残差连接和层归一化(Residual Connection & Layer Normalization):通过加法将输入与输出相加,保证梯度能够高效传回,并利用层归一化稳定训练过程。
2. 多头注意力机制
2.1 为什么使用多头注意力
多头注意力机制将单一注意力分成多个“头”,每个头在不同的线性子空间中并行计算注意力,有以下优势:
- 捕获多种语义信息:例如,某一个注意力头可能专注于实体信息(entity focused),而另一个头可能捕捉句法结构(syntax focused)。
- 提高模型表达能力:通过并行多个注意力头,模型能够同时从多个角度学习输入数据的特征。
2.2 多头注意力公式
假设输入为查询 Q、键 K和值 V,单个注意力头的计算如下:
Attention ( Q , K , V ) = softmax ( Q K ⊤ d k ) V \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right) V Attention(Q,K,V)=softmax(dkQK⊤)V
其中:
- dk 为键的维度,做缩放是为了缓解点积随维度增加过大带来的数值不稳定性;
- softmax 后得到的注意力权重用于对 V 进行加权平均。
多头注意力的计算为对多个独立注意力头计算后,将它们拼接,再通过一个输出矩阵 WO 得到最终的输出:
MultiHead ( Q , K , V ) = Concat ( head 1 , … , head h ) W O \text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \ldots, \text{head}_h)W^O MultiHead(Q,K,V)=Concat(head1,…,headh)WO head i = Attention ( Q W i Q , K W i K , V W i V ) \text{head}_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V) headi=Attention(QWiQ,KWiK,VWiV)
其中 WiQ, WiK, WiV 为各头的线性变换矩阵。
3. 缩放点积注意力
3.1 为什么使用缩放
在高维空间下,如果直接用点积 计算注意力得分,因向量维度增加,点积值通常会变得很大,导致 softmax 函数会输出极端分布,进而使得梯度变小,不利于训练。因此,引入缩放因子,即除以 d k \sqrt{d_k} dk 来缓解这种情况。
3.2 缩放点积注意力公式
完整公式如下:
e x p ( e i j ′ ) α i j = exp ( e i j ) ∑ j ′ exp ( e i j ′ ) α i j = ∑ j ′ e x p ( e i j ′ ) exp(eij′)\alpha_{ij} = \frac{\exp(e_{ij})}{\sum_{j'} \exp(e_{ij'})}αij=∑j′exp(eij′) exp(eij′)αij=∑j′exp(eij′)exp(eij)αij=∑j′exp(eij′)
其中:
- eij 是未归一化的注意力得分;
- αij 是归一化后的权重;
- zi 是输出的向量表示。
4. 残差连接与层归一化
4.1 残差连接(Residual Connection)
残差连接用于缓解深层网络中的梯度消失问题,同时鼓励模型捕捉接近恒等映射的信息。其作用在于让输入信息能够直接流传至后续层,从而“学习”在原始表示上做出小的修改(即“学习小编辑”)。
公式表示为:
y = LayerNorm ( x + F ( x ) ) y = \text{LayerNorm}(x + F(x)) y=LayerNorm(x+F(x))
其中:
- x 为输入向量,
- F(x) 为经过注意力或前馈网络后的输出,
- LayerNorm 表示层归一化操作。
4.2 层归一化(Layer Normalization)
层归一化通过计算输入向量的均值和标准差,对向量进行归一化处理,从而稳定训练。具体步骤如下:
给定向量 x=[x1,x2,…,xd]
- 计算均值:
μ = 1 d ∑ i = 1 d x i \mu = \frac{1}{d} \sum_{i=1}^{d} x_i μ=d1i=1∑dxi
- 计算标准差(加上一个很小的 ϵ\epsilonϵ 防止除零):
σ = 1 d ∑ i = 1 d ( x i − μ ) 2 + ϵ \sigma = \sqrt{\frac{1}{d} \sum_{i=1}^{d} (x_i - \mu)^2 + \epsilon} σ=d1i=1∑d(xi−μ)2+ϵ
- 归一化和线性变换:
LayerNorm ( x ) i = γ i x i − μ σ + e + β i \text{LayerNorm}(x)_i = \gamma_i \frac{x_i - \mu}{\sigma+e} + \beta_i LayerNorm(x)i=γiσ+exi−μ+βi
其中 γ 和 β 是可学习的参数,分别用于重新缩放和平移归一化后的输出。e是一个小的值,以防止被零除
5. Transformer 中的解码器(Decoder)
5.1 解码器与编码器的相似性
解码器与编码器的基本构建块相似,都包含自注意力、多头注意力、前馈网络、残差连接与层归一化。然而,解码器有两个关键的区别:
-
因果(Masked)自注意力:
为防止未来信息泄露,解码器中计算自注意力时对未来的位置做屏蔽。e i j = { q i ⊤ k j d k , j ≤ i − ∞ , j > i e_{ij} = \begin{cases} \frac{q_i^\top k_j}{\sqrt{d_k}}, & j \leq i \\ -\infty, & j > i \end{cases} eij={dkqi⊤kj,−∞,j≤ij>i
然后软化为:
α i j = exp ( e i j ) ∑ j ′ = 1 i exp ( e i j ′ ) \alpha_{ij} = \frac{\exp(e_{ij})}{\sum_{j'=1}^{i} \exp(e_{ij'})} αij=∑j′=1iexp(eij′)exp(eij)
-
跨注意力(Cross-Attention):
除了自注意力外,解码器还包含跨注意力层,用于结合编码器的输出信息。在跨注意力中:- 查询(Query, Q) 来自解码器当前的隐藏状态;
- 键(Key, K) 和 值(Value, V) 来自编码器的隐藏状态;
相应公式与前述缩放点积注意力类似:
CrossAttention
(
Q
,
K
,
V
)
=
softmax
(
Q
K
⊤
d
k
)
V
\text{CrossAttention}(Q, K, V) = \text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V
CrossAttention(Q,K,V)=softmax(dkQK⊤)V
5.2 解码器的结构总结
解码器的一个典型层可以总结为:
- Masked Self-Attention:计算当前解码器输入的自注意力并屏蔽未来信息;
- 跨注意力(Encoder-Decoder Attention):利用编码器输出为解码器生成当前输出提供上下文信息;
- 前馈网络(Feed-Forward Network):对注意力输出进行非线性变换;
- 残差连接与层归一化:确保训练中梯度稳定并促进模型学习细微调整。
6. Transformer 总结及残差视角
从整体角度看,Transformer 模型的核心操作可以概括为:
- 多次并行注意力计算:通过多头注意力,模型同时关注不同角度的信息。
- 添加残差连接:让每一层学习输入上的小修正(“编辑”),从而保留原始信息。
- 加入层归一化:使各层输入分布保持稳定,提高训练效率。
- 堆叠多层结构:重复上述模块,多层堆叠能捕捉到更加抽象的特征。
从残差视角来观察,Transformer 的核心是词嵌入,随后每一层做的是在原始表示上学习微小的调整,从而“编辑”出更符合任务需求的表示。
核心区别总结表:
模块 | Encoder Layer | Decoder Layer |
---|---|---|
Attention 1 | Multi-Head Self-Attention | Masked Multi-Head Self-Attention |
Attention 2 | 无 | Cross-Attention(Query 来自 Decoder,Key/Value 来自 Encoder) |
FFN | 有(相同) | 有(相同) |
残差&归一化 | 有 | 有 |
📌 为什么 Decoder 需要 Masked Self-Attention?
为了保证**自回归(Autoregressive)**生成,只能看到前面的词,不能偷看将来的词。
举例:
- 当前生成到位置 3,不能让 Decoder 看到位置 4 的词。
- 所以在 Attention 的 softmax 权重矩阵中,强行 mask 掉未来位置。
🤯 记忆小技巧:
Encoder | Decoder |
---|---|
自我理解 | 自我生成 + 看懂输入 |
“我看整句,理解上下文” | “我边生成边回看 Encoder 给的提示” |