Transformer 模型的核心思想是通过自注意力机制(Self-Attention)和多层结构处理序列数据。下面我们逐层分解其架构,从宏观到微观进行解析:
1. 宏观结构(Encoder-Decoder 框架)
Transformer 由 Encoder(编码器) 和 Decoder(解码器) 堆叠而成:
-
Encoder:将输入序列(如句子)映射为高维表示(上下文相关的向量)。
-
Decoder:基于 Encoder 的输出和已生成的部分结果,逐步生成目标序列(如翻译结果)
2. Encoder 分解
单个 Encoder 层由两个核心子层组成:
(1) 多头自注意力(Multi-Head Self-Attention)
-
作用:捕捉序列中各个位置之间的关系,生成上下文相关的表示。
-
核心步骤:
-
Query-Key-Value 计算:对输入向量分别线性变换为 Q、K、V。
-
注意力分数:计算 Q 和 K 的点积,缩放后通过 Softmax 归一化。
-
加权求和:用注意力权重对 V 加权求和,得到输出。
-
-
多头机制:并行多组注意力头,拼接后线性变换,增强模型捕捉不同关系的能力。
(2) 前馈神经网络(Feed-Forward Network, FFN)
-
作用:对每个位置的表示进行非线性变换。
-
结构:两层全连接层(通常中间维度扩大,如 2048,再用 ReLU 激活)。
(3) 残差连接 & 层归一化
-
每个子层输出前会:
-
残差连接:
输出 = 子层输出 + 输入
(缓解梯度消失)。 -
层归一化(LayerNorm):对特征维度归一化,稳定训练。
-
3. Decoder 分解
Decoder 结构与 Encoder 类似,但增加了一些设计:
(1) 掩码多头自注意力(Masked Multi-Head Attention)
-
作用:确保解码时只能看到当前位置及之前的信息(防止信息泄漏)。
-
实现:在注意力分数计算时,将未来位置的权重设为
-inf
(Softmax 后变为 0)。
(2) 编码器-解码器注意力(Encoder-Decoder Attention)
-
作用:让 Decoder 关注 Encoder 的输出(类似传统 Seq2Seq 的注意力)。
-
Key & Value 来自 Encoder 的输出,Query 来自 Decoder 的上层输出。
(3) 前馈神经网络 & 残差连接
-
与 Encoder 的 FFN 结构相同。
4. 输入输出处理
(1) 输入嵌入(Input Embedding)
-
将输入词(或子词)转换为高维向量(如 512 维)。
(2) 位置编码(Positional Encoding)
-
作用:为模型注入序列的位置信息(因为 Transformer 无递归结构)。
-
方法:使用正弦/余弦函数生成固定或可学习的位置向量,与词向量相加。
(3) 输出层
-
线性层 + Softmax 预测下一个词的概率分布。
6. 代码级细节(以 PyTorch 为例)
python
复制
下载
# 自注意力计算简化示例 def attention(Q, K, V, mask=None): d_k = Q.size(-1) scores = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(d_k) if mask is not None: scores = scores.masked_fill(mask == 0, -1e9) p_attn = F.softmax(scores, dim=-1) return torch.matmul(p_attn, V) # 多头注意力拼接 class MultiHeadAttention(nn.Module): def __init__(self, h, d_model): super().__init__() self.d_k = d_model // h self.h = h self.linears = clones(nn.Linear(d_model, d_model), 4)
7. 各层的作用类比
-
自注意力层:类似“词与词之间的投票”,决定彼此的重要性。
-
FFN 层:类似“对每个词单独做特征加工”。
-
残差连接:类似“保留原始记忆,只学习增量变化”。
通过这种逐层分解,可以清晰理解 Transformer 如何通过堆叠模块实现强大的序列建模能力。