第6章补充材料:微调策略与IMDB分类实验

1. 微调策略深度对比 [MLNLP]

主章介绍了全微调、部分微调和特征提取三种策略。MLNLP 项目的 ch06/02_bonus_additional-experiments 提供了更细致的实验对比。

1.1 冻结层级的影响

实验对比了不同冻结策略在 SMS Spam 数据上的表现:

策略可训练参数量验证准确率训练时间
仅训练分类头~1.5K~88%最快
训练最后 1 个 Block + 分类头~7M~95%中等
训练最后 4 个 Block + 分类头~28M~96%较慢
全部参数微调~124M~97%最慢

结论:仅解冻最后 1~2 个 Block 就能获得接近全微调的效果,参数效率极高。

1.2 最后一个 token vs 第一个 token [MLNLP]

主章默认取最后一个 token 的隐藏状态做分类。GPT 是因果模型,最后一个 token 通过注意力”看到”前面所有 token,因此包含最完整的上下文。

MLNLP 的额外实验对比了不同位置的效果:

选取位置准确率说明
第一个 token~82%只看到当前词,几乎无上下文
中间 token~89%部分上下文
最后一个 token~95%完整上下文

这验证了因果语言模型中最后一个位置的隐藏状态是最强的文本表示

1.3 输入长度的影响

最大长度验证准确率显存占用
64~93%
128~95%
256~95.5%
512~95.6%很高

对于短信这类短文本,128 已经接近饱和。更长的文档分类(如 IMDB 评论)受益更多。


2. IMDB 情感分类:大规模对比实验 [MLNLP]

这是 MLNLP 项目中最有参考价值的补充材料之一(ch06/03_bonus_imdb-classification),在 50K IMDB 电影评论数据集上横向比较了多种模型。

2.1 实验设置

  • 数据集:IMDB 50K 电影评论(25K 训练 + 25K 测试)
  • 任务:二分类(正面/负面情感)
  • 评估:准确率(Accuracy)
  • 训练时长:1 个 epoch

2.2 实验结果

模型参数量微调策略测试准确率训练时间
GPT-2 124M124M全微调91.88%9.48 min
BERT-base340M全微调90.89%7.65 min
DistilBERT66M全微调91.40%4.26 min
RoBERTa355M最后 Block + 分类头92.95%7.20 min
逻辑回归(baseline)--88.85%秒级
随机分类器--49.91%-

2.3 关键发现

GPT-2(Decoder-only)作为分类器出乎意料地强。全微调后达到 91.88%,超过了同为全微调的 BERT(90.89%)。原因分析:

  1. 预训练数据量:GPT-2 在 40GB WebText 上预训练,BERT 在 16GB 文本上预训练,GPT-2 见过更多文本模式。
  2. 最后一个 token 的表示能力:因果注意力让最后一个位置积累了全局上下文信息,效果不亚于 BERT 的 [CLS] token。
  3. 参数量差异:虽然 GPT-2 124M < BERT 340M,但预训练数据量的优势弥补了参数劣势。

RoBERTa 整体最佳(92.95%),这符合预期——RoBERTa 是 BERT 的改进版,且只微调了最后一个 Block 就达到了最佳效果,说明预训练质量的重要性。


3. 微调的实用技巧 [Datawhale]

3.1 分组权重衰减

AdamW 的 weight_decay 应该只应用于矩阵权重,不应应用于 LayerNorm 的缩放/偏置参数和所有 bias:

def configure_optimizer(model, lr=5e-5, weight_decay=0.1):
    decay_params = []
    no_decay_params = []
    for name, param in model.named_parameters():
        if not param.requires_grad:
            continue
        if param.ndim < 2 or name.endswith('.bias') or 'norm' in name:
            no_decay_params.append(param)
        else:
            decay_params.append(param)

    optimizer_groups = [
        {"params": decay_params, "weight_decay": weight_decay},
        {"params": no_decay_params, "weight_decay": 0.0},
    ]
    return torch.optim.AdamW(optimizer_groups, lr=lr)

这个技巧在大模型训练中是标准做法,能提升 0.1~0.3% 的性能。

3.2 学习率选择

分类微调的学习率通常比预训练低 1~2 个数量级:

可训练参数量推荐学习率
仅分类头(<0.01M)$1\text{e-}3 \sim 5\text{e-}3$
最后几层(~10M)$1\text{e-}5 \sim 5\text{e-}5$
全部参数(~100M+)$5\text{e-}5 \sim 2\text{e-}4$

3.3 早停与正则化

在小数据集上微调极易过拟合。建议:

  1. 早停:验证集 loss 连续 2~3 个 epoch 不降就停
  2. Dropout:保持预训练时的 dropout(GPT-2 默认 0.1)
  3. 数据增强:对文本分类,可以尝试同义词替换、随机删词等简单增强

4. 从 SMS 到 IMDB:数据规模的影响 [MLNLP]

SMS Spam 数据仅约 5K 条,IMDB 有 50K 条。数据规模的差异带来了几个值得注意的现象:

现象SMS(5K)IMDB(50K)
全微调 vs 部分微调差距大(过拟合风险高)小(数据足以支撑全微调)
需要早停的紧迫性中等
分类头复杂度简单 Linear 即可两层 MLP 可能更优
数据增强的收益

5. 扩展阅读 [MLNLP]

  • 额外实验ch06/02_bonus_additional-experiments 对比了多种冻结策略、token 选取位置、输入长度的影响
  • IMDB 分类ch06/03_bonus_imdb-classification 提供了 GPT-2 vs BERT vs DistilBERT vs RoBERTa 的完整对比代码
  • 交互界面ch06/04_user_interface 提供了 Gradio 界面,可以实时体验分类效果