diff --git a/基础知识/Transformer.md b/基础知识/Transformer.md new file mode 100755 index 0000000..ddc1f9e --- /dev/null +++ b/基础知识/Transformer.md @@ -0,0 +1,346 @@ +# Transformer 深度学习架构 + +> Attention Is All You Need +> +> 归档:2026-04-22 + +--- + +## 基本信息 + +| 项目 | 说明 | +|------|------| +| 论文 | Attention Is All You Need | +| 作者 | Google Brain / Google Research | +| 发表 | 2017年6月 (NeurIPS) | +| 论文链接 | https://arxiv.org/abs/1706.03762 | +| 引用量 | 100,000+ | +| 核心思想 | 完全基于注意力机制,摒弃循环和卷积 | + +--- + +## 核心创新 + +### 传统架构的问题 + +| 架构 | 问题 | +|------|------| +| RNN/LSTM | 顺序计算,无法并行;长距离依赖困难 | +| CNN | 感受野有限,远距离依赖需要多层卷积 | +| Encoder-Decoder + Attention | 仍依赖 RNN 作为编码器 | + +### Transformer 的突破 + +> **"Attention Is All You Need"** — 仅用注意力机制,完全摒弃循环和卷积 + +- ✅ **并行化**:训练速度大幅提升 +- ✅ **长距离依赖**:O(1) 路径长度 +- ✅ **可扩展性**:易于堆叠更深层 + +--- + +## 模型架构 + +### 整体结构 + +``` +┌─────────────────────────────────────────────────────────────┐ +│ Transformer │ +├─────────────────────────────────────────────────────────────┤ +│ Input Embedding + Positional Encoding │ +├─────────────────────────────────────────────────────────────┤ +│ ┌─────────────────┐ ┌─────────────────┐ │ +│ │ Encoder │ │ Decoder │ │ +│ │ (N=6 layers) │ │ (N=6 layers) │ │ +│ │ │ │ │ │ +│ │ Multi-Head │ │ Masked Multi- │ │ +│ │ Self-Attention │────▶│ Head Self- │ │ +│ │ │ │ Attention │ │ +│ │ Feed-Forward │ │ │ │ +│ │ Network │ │ Encoder-Decoder │ │ +│ │ │ │ Attention │ │ +│ │ │ │ │ │ +│ │ │ │ Feed-Forward │ │ +│ │ │ │ Network │ │ +│ └─────────────────┘ └─────────────────┘ │ +├─────────────────────────────────────────────────────────────┤ +│ Output Linear + Softmax │ +└─────────────────────────────────────────────────────────────┘ +``` + +### Encoder 结构 + +每层包含两个子层: + +1. **Multi-Head Self-Attention** — 多头自注意力 +2. **Feed-Forward Network** — 位置前馈网络 + +每个子层都有残差连接 + LayerNorm: +``` +Output = LayerNorm(x + Sublayer(x)) +``` + +### Decoder 结构 + +每层包含三个子层: + +1. **Masked Multi-Head Self-Attention** — 带掩码的多头自注意力 +2. **Multi-Head Encoder-Decoder Attention** — 编码器-解码器注意力 +3. **Feed-Forward Network** — 位置前馈网络 + +--- + +## 核心组件 + +### 1. Scaled Dot-Product Attention + +``` +Attention(Q, K, V) = softmax(QK^T / √d_k) V +``` + +| 步骤 | 说明 | +|------|------| +| 1 | 计算 QK^T(点积) | +| 2 | 除以 √d_k(缩放) | +| 3 | softmax 得到权重 | +| 4 | 乘以 V 得到输出 | + +**为什么要缩放?** +- 当 d_k 较大时,点积值可能很大 +- 会导致 softmax 进入梯度饱和区 +- 除以 √d_k 保持数值稳定 + +### 2. Multi-Head Attention + +``` +MultiHead(Q, K, V) = Concat(head_1, ..., head_h) W^O + +where head_i = Attention(QW_i^Q, KW_i^K, VW_i^V) +``` + +| 参数 | 值 | +|------|-----| +| h (注意力头数) | 8 | +| d_model | 512 | +| d_k = d_v | 64 | +| 总参数量 | 与单头注意力相似 | + +**多头注意力的好处**: +- 允许模型同时关注不同位置的不同表示子空间 +- 捕捉多种依赖关系 + +### 3. 位置编码 (Positional Encoding) + +由于没有循环或卷积,需要注入位置信息: + +``` +PE(pos, 2i) = sin(pos / 10000^(2i/d_model)) +PE(pos, 2i+1) = cos(pos / 10000^(2i/d/d_model)) +``` + +**选择正弦版本的原因**: +- 可以处理任意长度的序列 +- 模型可以学习相对位置关系 + +### 4. Feed-Forward Network + +```python +FFN(x) = max(0, xW_1 + b_1)W_2 + b_2 +``` + +| 参数 | 值 | +|------|-----| +| 输入/输出维度 | d_model = 512 | +| 中间层维度 | d_ff = 2048 | +| 激活函数 | ReLU | + +--- + +## 训练细节 + +### 超参数 + +| 参数 | 值 | +|------|-----| +| Encoder/Decoder 层数 | 6 | +| 注意力头数 | 8 | +| 模型维度 | 512 | +| FFN 内部维度 | 2048 | +| dropout | 0.1 | +| 批量大小 | 约 25000 tokens/batch | + +### 优化器 + +- **Adam** (β_1=0.9, β_2=0.98, ε=10^-9) +- **学习率调度**:warmup_steps = 4000 + ``` + lr = d_model^(-0.5) * min(step^(-0.5), step * warmup^(-1.5)) + ``` + +### 正则化 + +- **Label Smoothing** (ε_ls = 0.1) +- **Dropout** (0.1) +- **残差 dropout** + +--- + +## 性能对比 + +| 模型 | WMT 2014 En-De | WMT 2014 En-Fr | +|------|----------------|----------------| +| Transformer (Base) | 25.8 BLEU | 38.1 BLEU | +| Transformer (Big) | 28.4 BLEU | 41.8 BLEU | +| 之前的最佳 | 26.4 BLEU | 40.7 BLEU | + +**训练成本**:8 块 P100 GPU,3.5 天 + +--- + +## 三种注意力使用方式 + +| 类型 | 位置 | Q 来源 | K/V 来源 | +|------|------|--------|----------| +| **Encoder Self-Attention** | Encoder | 同一层前一层 | 同一层前一层 | +| **Decoder Self-Attention** | Decoder | 同一层前一层(带掩码) | 同一层前一层 | +| **Encoder-Decoder Attention** | Decoder | 前一层 Decoder | Encoder 输出 | + +### Decoder 中的 Mask + +**目的**:防止看到未来位置(保持自回归特性) + +``` +设置所有非法连接为 -∞,使 softmax 输出为 0 +``` + +--- + +## 与其他架构对比 + +| 架构 | 最大路径长度 | 每层复杂度 | 最小顺序操作数 | +|------|-------------|-----------|---------------| +| **Transformer** | O(1) | O(d·n²) | O(1) | +| 循环层 (RNN) | O(n) | O(d·n) | O(n) | +| 卷积 (k=3) | O(log_k(n)) | O(k·d·n) | O(1) | +| 自注意力 | O(1) | O(d·n²) | O(1) | + +--- + +## 发展历程 + +### 时间线 + +| 年份 | 模型 | 关键创新 | +|------|------|---------| +| 2017 | Transformer | 注意力机制替代 RNN | +| 2018 | BERT | 仅用 Encoder,双向预训练 | +| 2018 | GPT | 仅用 Decoder,生成式预训练 | +| 2019 | GPT-2 | 更大模型,更多数据 | +| 2020 | GPT-3 | 1750 亿参数,few-shot 学习 | +| 2020 | T5 | Encoder-Decoder 统一框架 | +| 2021 | ViT | Transformer 用于图像 | +| 2022 | ChatGPT | RLHF 对齐 | +| 2023 | GPT-4 | 多模态,更强推理 | +| 2023 | LLaMA | 开源 LLM 底座 | +| 2024 | Sora | Transformer + Diffusion | + +### 变体架构 + +| 架构 | 改进点 | +|------|--------| +| **BERT** | 仅 Encoder,双向理解 | +| **GPT 系列** | 仅 Decoder,生成式 | +| **T5** | Encoder-Decoder 统一 | +| **Longformer** | 长序列处理 | +| **Reformer** | 高效注意力 | +| **FlashAttention** | IO 高效注意力 | +| **MoE (Mixture of Experts)** | 稀疏激活 | + +--- + +## 数学公式汇总 + +### 1. Scaled Dot-Product Attention +``` +Attention(Q, K, V) = softmax(QK^T / √d_k)V +``` + +### 2. Multi-Head Attention +``` +MultiHead(Q, K, V) = Concat(head_1, ..., head_h)W^O +head_i = Attention(QW_i^Q, KW_i^K, VW_i^V) +``` + +### 3. Feed-Forward Network +``` +FFN(x) = max(0, xW_1 + b_1)W_2 + b_2 +``` + +### 4. Positional Encoding +``` +PE(pos, 2i) = sin(pos / 10000^(2i/d_model)) +PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model)) +``` + +### 5. Residual Connection + LayerNorm +``` +Output = LayerNorm(x + Sublayer(x)) +``` + +--- + +## 代码示例 (PyTorch) + +```python +import torch +import torch.nn as nn +import math + +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 scaled_dot_product_attention(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) + scores = torch.softmax(scores, dim=-1) + return torch.matmul(scores, V) + + 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) + + out = self.scaled_dot_product_attention(Q, K, V, mask) + out = out.transpose(1, 2).contiguous().view(batch_size, -1, self.num_heads * self.d_k) + return self.W_o(out) +``` + +--- + +## 参考资料 + +| 资源 | 链接 | +|------|------| +| 原论文 | https://arxiv.org/abs/1706.03762 | +| HTML 版本 | https://arxiv.org/html/1706.03762v7 | +| PyTorch 实现 | Attention Is All You Need | + +--- + +## 基础知识索引 + +其他基础知识: +- [[INDEX_基础知识]] - 基础知识库索引 + +--- + +*整理:知识库管理员 | 来源:Google Brain | 归档:2026-04-22* \ No newline at end of file