10 KiB
title, draft, tags
| title | draft | tags | ||||
|---|---|---|---|---|---|---|
| 02-BERT | false |
|
一、 BERT 的深度解析 (The Foundation)
1. Scaled Dot-Product Attention 的维度约束与方差偏移
注意力机制的本质是特征空间的相似度加权。在给定的 Query、Key 和 Value 矩阵 Q, K, V \in \mathbb{R}^{L \times d_k} 下,计算过程如下:
\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{Q K^T}{\sqrt{d_k}}\right)V
为什么必须引入缩放因子 $\sqrt{d_k}$?
假设 q 和 k 是均值为 $0$、方差为 1 的独立随机变量向量(即 $E[q_i]=0, Var(q_i)=1$)。其点积为 $q \cdot k = \sum_{i=1}^{d_k} q_i k_i$。
根据概率论,点积的均值和方差分别为:
E[q \cdot k] = \sum_{i=1}^{d_k} E[q_i]E[k_i] = 0
Var(q \cdot k) = \sum_{i=1}^{d_k} Var(q_i k_i) = \sum_{i=1}^{d_k} (E[q_i^2]E[k_i^2] - E[q_i]^2 E[k_i]^2) = d_k
工程结论:点积结果的方差随维度 d_k 的增加而线性放大。 在输入 Softmax 函数时,极大的方差会导致分布两极分化(趋近于 One-hot),使得极大值处的 Softmax 梯度区域平坦($\nabla \text{softmax} \approx 0$)。除以 \sqrt{d_k} 可严格将点积结果的方差强行缩放回 $1$,避免梯度消失,保证训练早期的稳定性。
2. 多头注意力 (MHA) 的物理意义
多头注意力的数学表达为:
\text{MultiHead}(Q,K,V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h)W^O
\text{head}_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V)
其中 W_i^Q, W_i^K, W_i^V \in \mathbb{R}^{d_{model} \times d_k} 是投影矩阵。
物理意义上,线性投影将原始高维输入隐式映射到 h 个相互正交的特征子空间中。每个 Head 能够独立关注不同的语言学特征(如句法依赖、语义指代等),最后通过 Concat 与 W^O 进行高维流形的特征融合,极大提升了模型的表达能力。
3. 输入层细化:E_{total} 的构建与局限
BERT 的输入表征是三个相同维度 Embedding 的严格加和:
E_{total} = E_{token} + E_{pos} + E_{seg}
其中,E_{pos} 采用的是绝对位置编码 (Learned Positional Embedding)。
局限性分析:Learned Positional Embedding 是通过反向传播更新的参数矩阵 $P \in \mathbb{R}^{L_{max} \times d_{model}}$。这种设计的致命弱点在于零外推性 (Zero Extrapolation):当推理时的序列长度超过预训练时设定的最大长度 $L_{max}$(如 512)时,模型无法查找到对应的位置向量,直接导致系统性崩溃。这也是后续模型向旋转位置编码 (RoPE) 演进的根本原因。
二、 演进至 GPT (The Transition & Architecture)
1. Masked Self-Attention 与因果视图
GPT 的核心是自回归生成,必须阻断信息从未来流向现在。数学上通过引入下三角 Mask 矩阵 M \in \mathbb{R}^{T \times T} 实现:
M_{ij} = \begin{cases} 0, & i \ge j \\ -\infty, & i < j \end{cases}
在计算 Softmax 之前,将 M 直接叠加到注意力分数上:
\text{Attention}(Q,K,V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}} + M\right)V
当 M_{ij} = -\infty 时,$\exp(-\infty) = 0$,确保第 i 个 Token 只能对 \le i 的 Token 产生非零概率权重。这构成了 Decoder 的因果视图 (Causal View),而 BERT 则是没有 Mask M 的全局视图 (Global View)。
2. 层归一化的深层抉择 (Pre-LN vs Post-LN)
Transformer 结构的成败高度依赖 Layer Normalization 的位置设置:
-
Post-LN (BERT):
x_{t+1} = \text{LayerNorm}(x_t + \text{SubLayer}(x_t)) -
Pre-LN (GPT):
x_{t+1} = x_t + \text{SubLayer}(\text{LayerNorm}(x_t))
梯度动力学分析:在 Post-LN 中,残差分支的输出直接被 LayerNorm 重新标准化。随着网络层数 L 的加深,反向传播到达底层的梯度会发生严重的衰减,导致极难初始化且必须依赖 Warm-up 策略。
而在 Pre-LN 中,主干网络始终保留一条纯净的恒等映射 (Identity Mapping)路径:$x_L = x_0 + \sum_{i=1}^L \text{SubLayer}(\dots)$。
工程结论:Pre-LN 使得各个 SubLayer 的梯度可以直接且无损地流向底层网络,从根本上缓解了深层网络的梯度消失/爆炸问题,是极深(如 96 层 GPT-3)模型能够稳定启动训练的必决条件。
3. 前馈神经网络 (FFN):从 ReLU 到 GeLU
FFN 负责非线性映射:$FFN(x) = \text{Act}(xW_1 + b_1)W_2 + b_2$。
GPT 彻底摒弃了 ReLU (max(0, x)),采用高斯误差线性单元 GELU:
\text{GELU}(x) = x \Phi(x) = x \cdot \frac{1}{2}\left[1 + \text{erf}\left(\frac{x}{\sqrt{2}}\right)\right]
相比 ReLU 在 x=0 处的不可导和硬截断,GELU 是一种概率平滑激活。它实际上等价于将输入 x 乘以一个服从 \mathcal{N}(0,1) 的 Dropout 门控变量。在零点附近的平滑过渡保证了更丰富的曲率信息,对优化器评估 Loss 景观非常有益。
三、 训练过程的硬核细节 (The Engineering)
1. 损失函数 (Loss Functions)
-
BERT 联合目标:
\mathcal{L}_{BERT} = \mathcal{L}_{MLM} + \mathcal{L}_{NSP} = -\sum_{i \in \mathrm{KL}} \log P(x_i | \hat{X}) - \log P(\text{IsNext} | X_A, X_B) -
GPT 标准自回归似然估计 (NLL Loss):
\mathcal{L}_{GPT} = -\sum_{i=1}^T \log P(x_i | x_1, x_2, \dots, x_{i-1})
2. 优化器与学习率策略
AdamW 的权重衰减逻辑:标准 Adam 在处理 L2 正则化时,梯度更新表达式会将权重衰减项和动量项耦合,导致正则化效果在遇到自适应学习率时被削弱。AdamW 强制将权重衰减解耦到梯度更新之外:
\theta_t = \theta_{t-1} - \eta_t \left( \frac{\alpha \hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} + \lambda \theta_{t-1} \right)
Linear Warmup + Cosine Decay:
初始极高的方差需要极小的学习率启动。
-
预热期 (
t < T_w):$lr_t = lr_{max} \frac{t}{T_w}$。作用:保护随机初始化的权重在第一个 Epoch 内免遭巨大且方差极高的梯度破坏(俗称“梯度洗牌”)。 -
余弦退火 (
t \ge T_w):$lr_t = lr_{min} + \frac{1}{2}(lr_{max} - lr_{min})(1 + \cos(\pi \frac{t - T_w}{T_{total} - T_w}))$。平滑逼近局部最优解。
3. 初始化与梯度控制
深度残差缩放:为了控制残差网络累积方差在深层的爆炸,GPT 要求针对残差路径前的权重(例如自注意力的投影矩阵 W^O 和 FFN 的第二层 $W_2$)执行额外的缩放初始化:
W \sim \mathcal{N}\left(0, \frac{\sigma}{\sqrt{2L}}\right)
其中 L 为层数。这确保了在初始化阶段,深层方差仍保持在 \mathcal{O}(1) 量级。
Gradient Clipping:在大规模预训练(如 Batch Size = 2048)中,Loss 景观充满“悬崖”。当 \|g\|_2 > \gamma 时,执行 $g \leftarrow g \frac{\gamma}{|g|_2}$。工程结论:梯度裁剪是防御预训练“Loss 突刺 (Spike)”的最后防线,通常阈值 \gamma 设为 1.0。
4. BPE (Byte Pair Encoding) 编码方案
BPE 是一种基于数据统计的子词压缩算法。通过计算连续字节对的频率,将最高频的组合不断合并,从而构建词表。
平衡 OOV 逻辑:它结合了 Character-level 的全覆盖特性(完全消除 OOV 问题)和 Word-level 的语义丰富特性。对于罕见词(OOV),BPE 会将其自然降解为更短的子词序列(或最终的字符/字节),从而保证了对未知词汇的鲁棒泛化。
四、 故障排除与架构对比 (Troubleshooting & Comparison)
1. KV Cache 推理加速与显存边界
在自回归生成第 t 个 Token 时,无需重新计算前 t-1 个 Token 的表征。只需将新计算的 k_t, v_t 拼接到缓存矩阵中:
K_{\le t} = [K_{<t}; k_t], \quad V_{\le t} = [V_{<t}; v_t]
内存占用数学推导:以 FP16(每参数 2 字节)为例,单个 Token 在每一层的注意力机制中需存储 Key 和 Value。对于单个 Batch:
\text{Memory/Token} = 2 (\text{K and V}) \times L (\text{layers}) \times h (\text{heads}) \times d_{head} (\text{dim}) \times 2 \text{ bytes}
工程结论:KV Cache 会随序列长度呈线性暴涨,极易导致 OOM,这也是后续 PagedAttention 等内存分页技术被提出的直接推手。
2. 训练崩溃与 Loss Spike
在几十 B 规模的模型训练中,Loss Spike(从正常值瞬间飙升至数百甚至 NaN)极度常见。
原因:通常由半精度 (FP16/BF16) 溢出引发。在注意力权重或 FFN 放大器中,某些异常 Token 导致中间特征激活值突破了 65504 (FP16 的最大表示阈值)。
应对方案:除了梯度裁剪和调整混合精度策略(如主权重保持 FP32)外,监控 \text{Norm}(\text{Gradient}) 是关键。若某一步梯度范数异于移动平均值过多,直接 Skip 该 Batch。
3. Softmax 饱和与 Temperature 控制
在 GPT 采样解码时,预测下一个 Token 的概率分布由带温度标量 T 的 Softmax 控制:
P(x_i) = \frac{\exp(z_i / T)}{\sum_j \exp(z_j / T)}
-
T \to 0(Greedy):分布变得极其尖锐,相当于 $\text{argmax}$,导致文本极其死板且容易陷入循环重复。 -
T > 1(Smoothing):概率分布变得平缓(接近均匀分布),使得长尾低频词被选中的概率增加,提升了生成的多样性和创造力,但过高会导致逻辑崩坏。
附录:BERT 与 GPT 核心数学差异对比表
| 对比维度 | BERT (Encoder) | GPT (Decoder) | 核心数学/结构差异点 |
|---|---|---|---|
| 掩码机制 (Masking) | 全局无 Mask (Padding 除外) | 下三角 Causal Mask M |
Softmax 输入存在 -\infty 的硬截断 |
| 计算复杂度 (Self-Attn) | \mathcal{O}(T^2 \cdot d_{model}) |
\mathcal{O}(T^2 \cdot d_{model}) |
复杂度相同,但 GPT 矩阵运算由于 Mask 为下三角矩阵,可作特定优化 |
| 训练/推理并行度 | 训练:极高 / 推理:单次计算 | 训练:极高 / 推理:极低 | GPT 推理受限于自回归本质,时间复杂度为 \mathcal{O}(T) 步向后展开 |
| 特征感受野 (Receptive) | 100\% 深度双向上下文 |
严格单向 (仅见历史 Token) | 联合概率分解定律的架构具象化表示 |
| LayerNorm 拓扑 | Post-LN | Pre-LN | 决定深层梯度反传是衰减还是完美继承 (Identity mapping) |