张芷铭的个人博客

Transformer 采用编码器-解码器结构,通过多头注意力捕捉全局依赖,靠位置编码注入位置信息,成为现代深度学习的核心架构。

整体架构

组件结构功能
编码器6 层堆叠输入序列 → 上下文向量
解码器6 层堆叠基于编码器输出 + 已生成词 → 生成下一个词
核心组件多头注意力、FFN、残差连接、层归一化、位置编码-

论文原始超参数

超参数数值含义
d_model512模型整体维度
h8多头注意力的头数
d_k = d_v64每个头的 Q/K/V 维度
d_ff2048FFN 中间层维度
N6编码器/解码器层数
dropout_rate0.1Dropout 概率
max_len5000最大序列长度

输入层:词嵌入 + 位置编码

词嵌入

将词汇表中的词映射为 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)))$$

多头自注意力计算流程

  1. 线性投影生成 Q、K、V:$Q = xW_Q$,$K = xW_K$,$V = xW_V$
  2. 多头拆分:将 Q、K、V 沿维度拆分为 8 个头(每个头 64 维)
  3. 缩放点积注意力: $$\text{Attention}(Q_i,K_i,V_i) = \text{softmax}\left(\frac{Q_iK_i^T}{\sqrt{d_k}}\right)V_i$$
  4. 多头拼接:8 个头输出拼接为 seq_len × 512
  5. 最终线性投影:乘权重矩阵 $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}$ 衰减
Dropout0.1
标签平滑0.1

总参数量(V=37000)

  • 词嵌入:18,944,000
  • 编码器:18,902,016
  • 解码器:25,199,616
  • 总计:约 63M

核心总结

Transformer = 6 层编码器(多头自注意力 + FFN)+ 6 层解码器(掩码多头自注意力 + 编码器-解码器注意力 + FFN),所有核心维度 d_model=512

Comments