在当前的自然语言处理领域,Transformer已经成为了当前NLP模型的标配,因此针对Transformer模型也需要重新从网络结构到实际应用回味一下。Transformer 是由 Vaswani 等人在 2017 年提出的革命性模型(论文 Attention Is All You Need),彻底改变了序列建模的范式。它完全依赖自注意力机制(Self-Attention)替代传统的 RNN/CNN,实现了并行化计算和长距离依赖建模。以下从网络结构角度详细解析其设计。
1. 整体架构
Transformer 由 编码器(Encoder) 和 解码器(Decoder) 堆叠组成,结构对称但功能不同。以机器翻译为例:
- 输入:源语言序列(编码器处理)
- 输出:目标语言序列(解码器生成)
核心组件
- 嵌入层(Embedding Layer)
- 位置编码(Positional Encoding)
- 多头注意力(Multi-Head Attention)
- 前馈网络(Feed-Forward Network)
- 残差连接 & 层归一化(Add & Norm)
2. 编码器(Encoder)
单个编码器层包含两个核心子层,均采用 残差连接(Residual Connection) 和 层归一化(Layer Normalization):
(1) 多头自注意力(Multi-Head Self-Attention)
- 目标:捕捉序列中词与词之间的全局依赖关系。
- 计算步骤:
a. 输入变换:
输入向量 X ∈ R n × d model X \in \mathbb{R}^{n \times d_{\text{model}}} X∈Rn×dmodel( n n n 为序列长度, d model = 512 d_{\text{model}}=512 dmodel=512)被线性投影到 h h h个不同的子空间(头),每个头的维度为 d k = d v = d model / h d_k = d_v = d_{\text{model}} / h dk=dv=dmodel/h(论文中 h = 8 h=8 h=8)。
b. 缩放点积注意力(Scaled Dot-Product Attention):
对每个头分别计算:
Attention ( Q , K , V ) = Softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{Softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=Softmax(dkQKT)V
其中 Q Q Q(查询)、 K K K(键)、 V V V(值)由输入向量线性变换得到。
c. 多头拼接:
将 h h h个头的输出拼接后再次线性变换:
MultiHead ( Q , K , V ) = Concat ( head 1 , … , head h ) W O \text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h)W^O MultiHead(Q,K,V)=Concat(head1,…,headh)WO
其中 W O ∈ R d model × d model W^O \in \mathbb{R}^{d_{\text{model}} \times d_{\text{model}}} WO∈Rdmodel×dmodel 为可学习参数。
(2) 前馈神经网络(Feed-Forward Network, FFN)
- 结构:两层全连接网络,中间维度扩展为 d f f = 2048 d_{ff}=2048 dff=2048:
FFN ( x ) = ReLU ( x W 1 + b 1 ) W 2 + b 2 \text{FFN}(x) = \text{ReLU}(xW_1 + b_1)W_2 + b_2 FFN(x)=ReLU(xW1+b1)W2+b2
W 1 ∈ R d model × d f f , W 2 ∈ R d f f × d model W_1 \in \mathbb{R}^{d_{\text{model}} \times d_{ff}}, W_2 \in \mathbb{R}^{d_{ff} \times d_{\text{model}}} W1∈Rdmodel×dff,W2∈Rdff×dmodel。
(3) 残差连接与层归一化
对每个子层输出:
Output = LayerNorm ( x + Sublayer ( x ) ) \text{Output} = \text{LayerNorm}(x + \text{Sublayer}(x)) Output=LayerNorm(x+Sublayer(x))
其中 Sublayer \text{Sublayer} Sublayer为多头自注意力或 FFN。
3. 解码器(Decoder)
解码器层在编码器基础上增加一个编码器-解码器注意力层,并引入掩码自注意力。
(1) 掩码多头自注意力(Masked Multi-Head Self-Attention)
- 目标:防止解码器在生成时“看到”未来信息(保证自回归性)。
- 实现:在计算注意力分数时,将未来位置的权重设为 − ∞ -\infty −∞(通过掩码矩阵实现):
Mask ( Q , K , V ) = Softmax ( Q K T d k + M ) V \text{Mask}(Q, K, V) = \text{Softmax}\left(\frac{QK^T}{\sqrt{d_k}} + M\right)V Mask(Q,K,V)=Softmax(dkQKT+M)V
其中掩码矩阵 M M M的上三角元素为 − ∞ -\infty −∞,其余为 0。
(2) 编码器-解码器注意力(Cross-Attention)
- 目标:融合编码器的输出信息(Key 和 Value 来自编码器,Query 来自解码器)。
- 计算方式:与多头自注意力相同,但 K K K 和 V V V来自编码器的输出。
(3) 前馈神经网络
结构与编码器的 FFN 完全相同。
4. 关键模块详解
(1) 位置编码(Positional Encoding)
- 作用:为无顺序的输入序列注入位置信息。
- 公式(正弦/余弦函数):
P E ( p o s , 2 i ) = sin ( p o s 1000 0 2 i / d model ) PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) PE(pos,2i)=sin(100002i/dmodelpos)
P E ( p o s , 2 i + 1 ) = cos ( p o s 1000 0 2 i / d model ) PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) PE(pos,2i+1)=cos(100002i/dmodelpos)
其中 p o s pos pos是位置, i i i是维度索引。 - 替代方案:可学习的位置嵌入(如 BERT)。
(2) 自注意力机制的优势
- 并行计算:无需像 RNN 一样逐步处理序列。
- 长距离依赖:任意两词直接交互,解决梯度消失问题。
- 可解释性:注意力权重可视化词与词的关系(如指代消解)。
(3) 残差连接与层归一化
在 Transformer 的编码器和解码器中,Add & Norm 是每个子层(如自注意力、前馈网络)后的核心模块,由 残差连接(Add) 和 层归一化(Norm) 组成。它通过梯度稳定和特征融合,显著提升了深层网络的训练效果。以下是其原理、作用和实现细节。
1. 残差连接(Add)
- 目标:解决深层网络中的梯度消失问题,保留原始输入信息。
- 操作:将子层(如自注意力或 FFN)的输入 x x x与其输出 Sublayer ( x ) \text{Sublayer}(x) Sublayer(x)直接相加:
Add ( x , Sublayer ( x ) ) = x + Sublayer ( x ) \text{Add}(x, \text{Sublayer}(x)) = x + \text{Sublayer}(x) Add(x,Sublayer(x))=x+Sublayer(x) - 核心思想:
- 假设深层网络需要学习的映射为 F ( x ) F(x) F(x),残差连接将其转化为 F ( x ) = H ( x ) − x F(x) = H(x) - x F(x)=H(x)−x,即 H ( x ) = F ( x ) + x H(x) = F(x) + x H(x)=F(x)+x。
- 网络只需学习残差 F ( x ) F(x) F(x),而非完整映射 H ( x ) H(x) H(x),简化了优化难度。
- 优势:
- 梯度可直接通过加法回传,缓解梯度消失。
- 允许构建极深网络(如百层以上的 Transformer 变体)。
2. 层归一化(Layer Normalization, Norm)
- 目标:对特征维度进行联合标准化,稳定训练过程。
- 操作:对每个样本的所有特征维度计算均值和方差,并进行缩放和平移:
μ = 1 d ∑ i = 1 d x i , σ 2 = 1 d ∑ i = 1 d ( x i − μ ) 2 \mu = \frac{1}{d} \sum_{i=1}^d x_i, \quad \sigma^2 = \frac{1}{d} \sum_{i=1}^d (x_i - \mu)^2 μ=d1i=1∑dxi,σ2=d1i=1∑d(xi−μ)2
Norm ( x ) = γ ⋅ x − μ σ 2 + ϵ + β \text{Norm}(x) = \gamma \cdot \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} + \beta Norm(x)=γ⋅σ2+ϵx−μ+β
其中 d d d是特征维度, γ \gamma γ和 β \beta β是可学习的缩放和偏移参数, ϵ \epsilon ϵ是为数值稳定性添加的小常数(如 1 0 − 5 10^{-5} 10−5)。 - 与批量归一化(BatchNorm)的区别:
- BatchNorm:在批次维度计算统计量,依赖批次大小,不适合变长序列(如 NLP 任务)。
- LayerNorm:在特征维度计算统计量,独立于批次大小,更适合序列数据。
3. Add & Norm 的组合流程
以编码器的自注意力子层为例,输入 x x x的处理步骤如下:
- 子层计算:通过多头自注意力得到输出 SelfAttn ( x ) \text{SelfAttn}(x) SelfAttn(x)。
- 残差连接:将输入 x x x与子层输出相加:
x add = x + SelfAttn ( x ) x_{\text{add}} = x + \text{SelfAttn}(x) xadd=x+SelfAttn(x) - 层归一化:对相加后的结果进行归一化:
x norm = LayerNorm ( x add ) x_{\text{norm}} = \text{LayerNorm}(x_{\text{add}}) xnorm=LayerNorm(xadd) - 传递到下一层:归一化后的结果作为下一子层(如 FFN)的输入。
5. 模型输入输出流程
输入嵌入:
- 词嵌入:将词映射为 d model d_{\text{model}} dmodel维向量。
- 位置编码:与词嵌入相加,得到最终输入 X = Embedding + Positional Encoding X = \text{Embedding} + \text{Positional Encoding} X=Embedding+Positional Encoding。
编码器处理:
- 输入 X X X经过 N N N层编码器,每层包含多头自注意力和 FFN。
- 输出上下文相关的表示 H enc ∈ R n × d model H_{\text{enc}} \in \mathbb{R}^{n \times d_{\text{model}}} Henc∈Rn×dmodel。
解码器生成:
- 初始输入为起始符(如
<sos>
),逐步生成目标序列。 - 通过掩码自注意力、交叉注意力和 FFN 逐层处理。
- 最终输出通过线性层和 Softmax 得到词的概率分布。
- 初始输入为起始符(如
6. 核心公式总结
组件 | 公式 |
---|---|
缩放点积注意力 | Attention ( Q , K , V ) = Softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{Softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=Softmax(dkQKT)V |
多头注意力 | MultiHead = Concat ( head 1 , … , head h ) W O \text{MultiHead} = \text{Concat}(\text{head}_1, \dots, \text{head}_h)W^O MultiHead=Concat(head1,…,headh)WO |
位置编码(正弦/余弦) | P E ( p o s , 2 i ) = sin ( p o s / 1000 0 2 i / d ) , P E ( p o s , 2 i + 1 ) = cos ( p o s / 1000 0 2 i / d ) PE_{(pos, 2i)} = \sin(pos/10000^{2i/d}), PE_{(pos, 2i+1)} = \cos(pos/10000^{2i/d}) PE(pos,2i)=sin(pos/100002i/d),PE(pos,2i+1)=cos(pos/100002i/d) |
残差连接与层归一化 | LayerNorm ( x + Sublayer ( x ) ) \text{LayerNorm}(x + \text{Sublayer}(x)) LayerNorm(x+Sublayer(x)) |
7. 优缺点分析
优点:
- 并行性:自注意力机制允许全序列并行计算,显著提升训练速度。
- 长距离建模:任意词对直接交互,解决 RNN 的长期依赖问题。
- 灵活性:适用于多种任务(如翻译、生成、分类)。
缺点:
- 计算复杂度:自注意力时间复杂度为 (O(n^2)),长序列处理成本高。
- 位置编码局限:静态位置编码可能无法适应复杂序列模式(动态位置编码可缓解)。
- 内存消耗:存储注意力矩阵需大量显存(如序列长度 4096 时,矩阵大小 16M×16M)。