184 lines
10 KiB
Markdown
184 lines
10 KiB
Markdown
---
|
||
title: 02-BERT
|
||
draft: false
|
||
tags:
|
||
- BERT
|
||
- 大语言模型
|
||
- Transformer
|
||
- 深度学习
|
||
---
|
||
## 一、 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**:
|
||
|
||
初始极高的方差需要极小的学习率启动。
|
||
|
||
1. 预热期 ($t < T_w$):$lr_t = lr_{max} \frac{t}{T_w}$。**作用:保护随机初始化的权重在第一个 Epoch 内免遭巨大且方差极高的梯度破坏(俗称“梯度洗牌”)。**
|
||
|
||
2. 余弦退火 ($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)| |