📚 课程目录

第20课:Transformer原理

📖 本课概述

Transformer彻底改变了NLP乃至整个深度学习的格局。本课深入理解"Attention is All You Need"的核心创新。

🏗️ 一、Transformer架构总览

1.1 编码器-解码器结构

编码器:N个相同层 × {多头自注意力 + FFN}

解码器:N个相同层 × {掩码多头自注意力 + 编码器-解码器注意力 + FFN}

每层都有残差连接 + LayerNorm

1.2 核心创新

📐 二、多头注意力

MultiHead(Q,K,V) = Concat(head₁,...,headₕ)Wᴼ

headᵢ = Attention(QWᵢQ, KWᵢK, VWᵢV)

h=8个头,每个头dₖ=d_model/h=64

🔧 三、前馈网络(FFN)

FFN(x) = max(0, xW₁+b₁)W₂+b₂

d_model=512 → d_ff=2048 → d_model=512

先升维4倍,再降回原始维度

3.1 PyTorch实现Transformer


import torch
import torch.nn as nn
import math

# Transformer实现
class MultiHeadAttention(nn.Module):
    def __init__(self, d_model, n_head):
        super().__init__()
        self.d_model = d_model
        self.n_head = n_head
        self.d_k = d_model // n_head
        
        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):
        B = Q.size(0)
        Q = self.W_q(Q).view(B, -1, self.n_head, self.d_k).transpose(1, 2)
        K = self.W_k(K).view(B, -1, self.n_head, self.d_k).transpose(1, 2)
        V = self.W_v(V).view(B, -1, self.n_head, self.d_k).transpose(1, 2)
        
        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)
        attn = torch.softmax(scores, dim=-1)
        context = torch.matmul(attn, V)
        
        context = context.transpose(1, 2).contiguous().view(B, -1, self.d_model)
        return self.W_o(context)

class TransformerBlock(nn.Module):
    def __init__(self, d_model, n_head, d_ff, dropout=0.1):
        super().__init__()
        self.attn = MultiHeadAttention(d_model, n_head)
        self.ffn = nn.Sequential(
            nn.Linear(d_model, d_ff),
            nn.ReLU(),
            nn.Linear(d_ff, d_model)
        )
        self.norm1 = nn.LayerNorm(d_model)
        self.norm2 = nn.LayerNorm(d_model)
        self.dropout = nn.Dropout(dropout)
    
    def forward(self, x, mask=None):
        x = x + self.dropout(self.attn(x, x, x, mask))
        x = self.norm1(x)
        x = x + self.dropout(self.ffn(x))
        x = self.norm2(x)
        return x

# 测试
d_model = 128
n_head = 4
model = TransformerBlock(d_model, n_head, d_model*4)
x = torch.randn(2, 20, d_model)
out = model(x)
params = sum(p.numel() for p in model.parameters())
print(f"Transformer Block: 输入{list(x.shape)} → 输出{list(out.shape)}")
print(f"参数量: {params:,}")

# PyTorch内置Transformer
print("\n=== PyTorch内置Transformer ===")
transformer = nn.Transformer(d_model=128, nhead=4, num_encoder_layers=2, num_decoder_layers=2, dim_feedforward=512)
src = torch.randn(20, 2, 128)
tgt = torch.randn(15, 2, 128)
out = transformer(src, tgt)
print(f"输入: src={list(src.shape)}, tgt={list(tgt.shape)}")
print(f"输出: {list(out.shape)}")
print(f"参数量: {sum(p.numel() for p in transformer.parameters()):,}")

# 掩码注意力
print("\n=== 因果掩码(自回归)===")
seq_len = 8
mask = torch.tril(torch.ones(seq_len, seq_len)).unsqueeze(0).unsqueeze(0)
print(f"因果掩码(下三角):")
for i in range(seq_len):
    print(f"  位置{i}: 可见位置={mask[0,0,i].nonzero().squeeze().tolist()}")
🟢 运行结果 ✅验证通过 Transformer Block: 输入[2, 20, 128] → 输出[2, 20, 128] 参数量: 198,272 === PyTorch内置Transformer === 输入: src=[20, 2, 128], tgt=[15, 2, 128] 输出: [15, 2, 128] 参数量: 926,208 === 因果掩码(自回归)=== 因果掩码(下三角): 位置0: 可见位置=0 位置1: 可见位置=[0, 1] 位置2: 可见位置=[0, 1, 2] 位置3: 可见位置=[0, 1, 2, 3] 位置4: 可见位置=[0, 1, 2, 3, 4] 位置5: 可见位置=[0, 1, 2, 3, 4, 5] 位置6: 可见位置=[0, 1, 2, 3, 4, 5, 6] 位置7: 可见位置=[0, 1, 2, 3, 4, 5, 6, 7]

🔬 深入拓展

核心要点回顾

本课的核心知识点构成了序列模型学习的重要一环。让我们从更高维度审视这些知识之间的关系:

常见陷阱与最佳实践

⚠️ 初学者常犯的错误:

💡 最佳实践:

与前后课程的联系

深度学习是一个整体——每一课的知识都不是孤立的:

📖 延伸阅读

💡 继续深入的学习路径:

📝 练习

练习1:实现完整Transformer

从零实现包含编码器和解码器的完整Transformer。

练习2:位置前馈网络变体

用GLU或SwiGLU替代ReLU FFN,对比效果。

练习3:Transformer在CV的应用

实现Vision Transformer(ViT)的图像分类。

💡 Transformer实践

训练大模型

常见错误与解决方案

⚠️ 需要避免的典型错误:

  1. 不了解模型假设就盲目使用
  2. 没有建立基线就追求复杂方法
  3. 忽视数据质量和预处理
  4. 过度调参而不理解原理
  5. 只看训练指标忽略验证指标

性能优化建议

💡 提升模型性能的系统方法:

  1. 确保数据管道正确且高效
  2. 建立简单但正确的基线模型
  3. 分析基线的错误类型
  4. 针对性地改进(数据/模型/训练)
  5. 持续迭代,每步验证

🔬 深度拓展:从理论到实践

核心概念网络

理解本课内容需要将其置于更大的知识网络中。每个核心概念都不是孤立的,它们相互关联、相互支撑:

关键洞察与直觉

建立正确的直觉比记住公式更重要:

1. 维度直觉:高维空间中,数据分布与低维直觉截然不同(维度诅咒)

2. 信息瓶颈:神经网络逐层压缩信息,保留任务相关的、丢弃无关的

3. 流形假设:高维数据实际分布在低维流形上,学习即发现流形结构

4. 偏差-方差权衡:简单模型欠拟合(高偏差),复杂模型过拟合(高方差)

与其他课程的关联

本课作为序列模型阶段的核心内容,与前后课程紧密关联:

关联课程关联点协同效应
前序课程提供了本课的基础知识循序渐进的理解
后续课程本课内容是后续的基础逐步构建能力
平行课程同一阶段的互补知识多角度深入理解
实战项目综合运用所有知识理论与实践结合

面试常见问题

💡 准备面试时,确保能回答以下问题:

  1. 用简单语言解释本课核心概念
  2. 画出关键算法/结构的流程图
  3. 比较不同方法的优缺点
  4. 举出实际应用场景
  5. 讨论常见误解和注意事项

进阶学习路径

掌握本课内容后,可以通过以下方式继续深入:

🤖

成就解锁:Transformer师

Attention is All You Need——你掌握了改变世界的架构!