Transformer 采用编码器-解码器结构,通过多头注意力捕捉全局依赖,靠位置编码注入位置信息,成为现代深度学习的核心架构。
整体架构
| 组件 | 结构 | 功能 |
|---|---|---|
| 编码器 | 6 层堆叠 | 输入序列 → 上下文向量 |
| 解码器 | 6 层堆叠 | 基于编码器输出 + 已生成词 → 生成下一个词 |
| 核心组件 | 多头注意力、FFN、残差连接、层归一化、位置编码 | - |
论文原始超参数
| 超参数 | 数值 | 含义 |
|---|---|---|
d_model | 512 | 模型整体维度 |
h | 8 | 多头注意力的头数 |
d_k = d_v | 64 | 每个头的 Q/K/V 维度 |
d_ff | 2048 | FFN 中间层维度 |
N | 6 | 编码器/解码器层数 |
dropout_rate | 0.1 | Dropout 概率 |
max_len | 5000 | 最大序列长度 |
输入层:词嵌入 + 位置编码
词嵌入
将词汇表中的词映射为 d_model=512 维向量。词嵌入向量需乘以 √d_model 以匹配位置编码量级。
位置编码
Transformer 无循环/卷积,需显式注入位置信息:
$$PE(pos, 2i) = \sin\left(pos / 10000^{2i/d_{\text{model}}}\right)$$
$$PE(pos, 2i+1) = \cos\left(pos / 10000^{2i/d_{\text{model}}}\right)$$
最终输入 = 词嵌入 + 位置编码。
编码器详解
每层包含 2 个子层:多头自注意力、前馈网络。每个子层后有残差连接 + 层归一化:
$$\text{LayerNorm}(x + \text{Dropout}(\text{Sublayer}(x)))$$
多头自注意力计算流程
- 线性投影生成 Q、K、V:$Q = xW_Q$,$K = xW_K$,$V = xW_V$
- 多头拆分:将 Q、K、V 沿维度拆分为 8 个头(每个头 64 维)
- 缩放点积注意力: $$\text{Attention}(Q_i,K_i,V_i) = \text{softmax}\left(\frac{Q_iK_i^T}{\sqrt{d_k}}\right)V_i$$
- 多头拼接:8 个头输出拼接为
seq_len × 512 - 最终线性投影:乘权重矩阵 $W_O$
参数量:$W_Q, W_K, W_V, W_O$ 共 $4 × 512 × 512 = 1,048,576$
前馈网络
$$\text{FFN}(x) = \max(0, xW_1 + b_1)W_2 + b_2$$
参数量:$512×2048 + 2048 + 2048×512 + 512 = 2,099,712$
单编码器层参数量
多头注意力(1,048,576)+ FFN(2,099,712)+ 2 个层归一化(2,048)= 3,150,336
编码器总参数量(6 层):18,902,016
解码器详解
每层包含 3 个子层:掩码多头自注意力、编码器-解码器注意力、前馈网络。
掩码多头自注意力
加"未来掩码"防止解码器看到 t 之后的词,保证自回归生成。
编码器-解码器注意力
- $Q$:来自解码器上一子层
- $K, V$:来自编码器最终输出
单解码器层参数量
掩码多头注意力(1,048,576)+ 编码器-解码器注意力(1,048,576)+ FFN(2,099,712)+ 3 个层归一化(3,072)= 4,199,936
解码器总参数量(6 层):25,199,616
输出层
线性层将解码器输出映射为词汇表大小的向量,权重与词嵌入矩阵共享。
训练设置
| 配置 | 设置 |
|---|---|
| 优化器 | Adam($\beta_1=0.9, \beta_2=0.98$) |
| 学习率 | Warmup 4000 步后按 $\text{step}^{-0.5}$ 衰减 |
| Dropout | 0.1 |
| 标签平滑 | 0.1 |
总参数量(V=37000)
- 词嵌入:18,944,000
- 编码器:18,902,016
- 解码器:25,199,616
- 总计:约 63M
核心总结
Transformer = 6 层编码器(多头自注意力 + FFN)+ 6 层解码器(掩码多头自注意力 + 编码器-解码器注意力 + FFN),所有核心维度 d_model=512。
张芷铭的个人博客
Comments