Skip to content

参考

基于原始论文《Attention Is All You Need》(2017) + Annotated Transformer + 现代位置编码文献整理

速查

  • 核心公式Attention(Q,K,V) = softmax(QK^T/√dk) · V
  • 原论文参数:d_model=512, h=8 头, dk=dv=64, d_ff=2048, N=6 层 Encoder + 6 层 Decoder
  • 三大变体:BERT(Enc-only)/ GPT(Dec-only)/ T5(Enc-Dec)
  • 位置编码选型:现代 LLM 首选 RoPE(LLaMA/Qwen);超长上下文外推可选 ALiBi(BLOOM/MPT)
  • 复杂度:注意力 O(n²) 时间+空间;FFN O(n·d²);KV Cache 让推理 O(n) 每步
  • 优化标配:Flash Attention(IO 优化)+ KV Cache(推理加速)+ Pre-Norm(训练稳定)
  • PyTorch APInn.MultiheadAttention / nn.TransformerEncoderLayer / nn.TransformerDecoderLayer

原始 Transformer 参数表

组件参数值(base 模型)说明
模型维度d_model512所有子层输出的统一维度
注意力头数h8Multi-Head 并行头数
每头维度dk = dv64d_model / h
FFN 内层维度d_ff20484 × d_model
Encoder 层数N_enc6编码器堆叠层数
Decoder 层数N_dec6解码器堆叠层数
Dropout0.1残差+注意力+Embedding 都加
Label Smoothing0.1训练时标签平滑

Big 模型:d_model=1024, h=16, d_ff=4096, N=6,参数量约 213M。

三大变体对比

维度Encoder-onlyDecoder-onlyEncoder-Decoder
代表BERT、RoBERTa、DeBERTaGPT、LLaMA、Qwen、ClaudeT5、BART、Whisper
结构仅编码器仅解码器完整 Enc-Dec
注意力方向双向(看全序列)单向(只看前面,自回归)Enc 双向 + Dec 单向
训练目标Masked LM(完形填空)Next Token PredictionSeq2Seq(翻译/摘要)
擅长任务理解:分类、NER、抽取生成:对话、代码、创作翻译、摘要、语音识别
LLM 主流(理解类已多被 Decoder-only 覆盖)当前绝对主流特定场景(翻译/语音)

位置编码选型决策表

方案类型外推性代表模型适用场景
Sinusoidal固定绝对一般原始 Transformer入门理解,新项目少用
学习式绝对可学习绝对❌ 无BERT、GPT-2固定长度任务(如 BERT 的 512)
相对(T5)相对偏置T5、Transformer-XL兼容性差(不友好的高效注意力)
RoPE旋转(绝对形式相对效果)✅ 强LLaMA、Qwen、Mistral现代 LLM 首选
ALiBi线性偏置(无嵌入)✅ 极强BLOOM、MPT超长上下文外推

PyTorch Transformer API 速查

python
import torch.nn as nn

# 1. 单层多头注意力(手控灵活)
mha = nn.MultiheadAttention(
    embed_dim=512,        # d_model
    num_heads=8,          # 头数
    dropout=0.1,
    batch_first=True,     # 输入 shape [batch, seq, dim]
)
attn_out, attn_weights = mha(query, key, value, attn_mask=mask)

# 2. Encoder 层(封装自注意力+FFN+残差+LayerNorm)
enc_layer = nn.TransformerEncoderLayer(
    d_model=512, nhead=8, dim_feedforward=2048,
    dropout=0.1, batch_first=True, norm_first=True,  # Pre-Norm
)
encoder = nn.TransformerEncoder(enc_layer, num_layers=6)
enc_out = encoder(src)  # src: [batch, seq, d_model]

# 3. Decoder 层(含交叉注意力)
dec_layer = nn.TransformerDecoderLayer(
    d_model=512, nhead=8, dim_feedforward=2048,
    dropout=0.1, batch_first=True, norm_first=True,
)
decoder = nn.TransformerDecoder(dec_layer, num_layers=6)
dec_out = decoder(tgt, memory=enc_out)  # tgt: 目标序列

# 4. 完整 Transformer(封装好)
transformer = nn.Transformer(
    d_model=512, nhead=8, num_encoder_layers=6, num_decoder_layers=6,
    dim_feedforward=2048, dropout=0.1, batch_first=True,
)
out = transformer(src, tgt)

生产 LLM 不直接用 nn.Transformer(灵活性差),而是基于 nn.Linear+F.scaled_dot_product_attention(内置 Flash Attention)手写,方便加 RoPE/KV Cache/GQA 等定制。

经典论文与资源