Transformer 模型架构详解与核心原理
1. 背景与动机
2017 年,Google 在论文《Attention Is All You Need》中提出了 Transformer 模型。该模型彻底改变了自然语言处理(NLP)领域,其核心在于使用 Self-Attention 结构取代了传统的 RNN(循环神经网络)或 CNN(卷积神经网络)结构。
本文详细解析了 Transformer 模型的核心架构与实现原理。内容涵盖从 RNN 局限性引入,到 Encoder-Decoder 结构设计,重点阐述了自注意力机制、多头注意力、位置编码及掩码机制的数学推导。同时提供了 PyTorch 代码示例及训练优化技巧,旨在帮助读者深入理解现代大模型的基础构建块。

2017 年,Google 在论文《Attention Is All You Need》中提出了 Transformer 模型。该模型彻底改变了自然语言处理(NLP)领域,其核心在于使用 Self-Attention 结构取代了传统的 RNN(循环神经网络)或 CNN(卷积神经网络)结构。
相比 RNN,Transformer 最大的优势在于并行计算能力。RNN 必须按时间步顺序处理数据,导致训练速度慢且难以捕捉长距离依赖(Vanishing Gradient Problem)。Transformer 通过自注意力机制,能够直接计算序列中任意两个位置的关系,无论它们之间的距离多远。
Transformer 本质上是一个 Encoder-Decoder 架构。输入序列经过编码器(Encoder)处理,输出序列由解码器(Decoder)生成。
编码器由 N 个相同的层堆叠而成(论文中 N=6)。每一层包含两个子层:
每个子层周围都有残差连接(Residual Connection),随后是层归一化(Layer Normalization)。
解码器同样由 N 个相同的层堆叠而成。除了上述两个子层外,中间还插入了一个Encoder-Decoder Attention层,用于关注编码器的输出。
输入序列首先通过词嵌入层转换为向量。在原始论文中,词向量的维度为 512。词嵌入仅发生在最底层的编码器中,后续编码器接收上一层的输出。
Self-Attention 允许模型在处理某个词时关注句子中的其他词。计算过程涉及三个矩阵:Query (Q), Key (K), Value (V)。
公式如下: $$ \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V $$ 其中 $d_k$ 是 Key 向量的维度。除以 $\sqrt{d_k}$ 是为了防止点积结果过大,导致 Softmax 梯度消失。
为了增强模型的表达能力,Transformer 将 Q、K、V 分别映射到 h 个不同的子空间(h=8),并行进行注意力计算,最后拼接并线性变换。 $$ \text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, ..., \text{head}_h)W^O $$ $$ \text{where } \text{head}_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V) $$ 这使得模型能够在不同子空间中关注不同的信息特征。
这是一个全连接网络,对每个位置独立应用。通常包含两个线性变换,中间使用 ReLU 激活函数: $$ \text{FFN}(x) = \max(0, xW_1 + b_1)W_2 + b_2 $$ 输入和输出维度通常为 512,中间层维度为 2048。
每个子层后都添加残差连接 $x + \text{Sublayer}(x)$,并使用 LayerNorm 稳定训练。这有助于解决深层网络梯度消失问题。
由于 Self-Attention 不保留序列顺序,Transformer 需要显式的位置信息。论文采用正弦和余弦函数生成位置编码: $$ PE_{(pos, 2i)} = \sin(pos / 10000^{2i/d_{model}}) $$ $$ PE_{(pos, 2i+1)} = \cos(pos / 10000^{2i/d_{model}}) $$ 这种设计使得模型能够学习到相对位置关系,并能泛化到比训练集更长的序列。
以下是一个简化的 Self-Attention 模块实现,展示了核心逻辑:
import torch
import torch.nn as nn
import math
class ScaledDotProductAttention(nn.Module):
def __init__(self, d_model):
super().__init__()
self.d_k = d_model
def forward(self, q, k, v, mask=None):
scores = torch.matmul(q, k.transpose(-2, -1)) / math.sqrt(self.d_k)
if mask is not None:
scores = scores.masked_fill(mask == 0, -1e9)
p_attn = torch.softmax(scores, dim=-1)
return torch.matmul(p_attn, v), p_attn
class MultiHeadAttention(nn.Module):
def __init__(self, d_model, num_heads):
super().__init__()
self.num_heads = num_heads
self.d_k = d_model // num_heads
self.w_q = nn.Linear(d_model, d_model)
self.w_k = nn.Linear(d_model, d_model)
self.w_v = nn.Linear(d_model, d_model)
self.w_o = nn.Linear(d_model, d_model)
def forward(self, q, k, v, mask=None):
batch_size = q.size(0)
# 投影并分头
q = self.w_q(q).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)
k = self.w_k(k).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)
v = self.w_v(v).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)
# 计算注意力
attn, score = ScaledDotProductAttention(self.d_model)(q, k, v, mask)
# 合并头
attn = attn.transpose(1, 2).contiguous().view(batch_size, -1, self.d_model * self.num_heads)
output = self.w_o(attn)
return output
Transformer 通过自注意力机制实现了高效的并行计算,解决了长序列建模难题。其模块化设计使其易于扩展,成为当前大语言模型(LLM)的基础架构。理解其内部细节对于深入掌握深度学习至关重要。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online