跳到主要内容

12 · 微调实战:五步走完一条流水线

1. 这一章讲什么

全书最后一章把前面所有零件拧成一台整机:一次真实可跑的 BERT 微调。原书的路线是五步——数据集的选择与准备、层级冻结与部分解冻、超参数调整、评估与推理优化、综合案例1

它与 11 章的分工:11 章是「从零训练」的守护流程,这一章是「拿预训练模型做适配」的施工手册。读完这两章,原书的标题「从零构建大模型」才闭环:第 1 章拆开的零件,在这里重新装配成型。

2. 顶层全景:五步流水线

原始标注数据
① 清洗 → 分层切分(70/15/15) → 少样本时上数据增强
② 全模型冻结 → 只解冻顶部两层 + 分类头
③ AdamW + lr=2e-5 + 权重衰减 0.01 + 线性调度器
④ 四指标评估:准确率 / 精确率 / 召回率 / F1
⑤ 部署前:动态量化(32位→8位)+ 蒸馏

能上线的小模型

3. 核心原理

3.1 数据:切得公道,增强得克制

微调数据的第一件事是切分:原书用 train_test_split 切两次——先切出 30% 暂存,再对半分,得到训练 70%、验证 15%、测试 15%;关键参数是 stratify(分层抽样),保证三个集合里正负样本比例一致2。类别歪了的验证集会给出骗人的指标——「分层」防的就是这个。

少样本(例子只有几十条)场景再上 06 章的两招:同义词替换和随机插入3。注意书的口径:增强是「少样本情境下」的补丁,不是默认动作——数据够时,增强带来的噪声可能得不偿失。

3.2 层级冻结:解冻得越少,省得越多

05 章的 PEFT 是「只训外挂」;层级冻结是更朴素的中间路线:先冻结整个模型,再解冻需要的层。原书的做法:全部参数 requires_grad=False,然后只解冻最后两层(encoder.layer.10/11)和分类头,优化器只收可训练参数4

主走查:一次冻结到底省了什么。(比例是按 BERT-base 12 层结构算的演示估算。)

BERT-base:12 个编码器层 + 分类头
冻结后可训练的:layer.10 + layer.11 + classifier
→ 12 层里只动 2 层(≈17%) + 一个小分类头
解冻输出的参数名(原书打印):
bert.encoder.layer.10.attention.self.query.weight ← 被解冻,要更新

bert.encoder.layer.11.output.LayerNorm.bias ← 被解冻
classifier.weight ← 被解冻
三个 epoch:Loss 0.6534 → 0.6218 → 0.6123(原书输出)[^5]

走查说明:为什么解冻顶部就够?BERT 这类预训练模型的分层分工是「低层管通用语法、高层管任务语义」——适配新任务主要改高层;底部全冻,显存与时间省下大头,梯度也只需回传到 layer.10。代价是任务与预训练分布差太远时,冻死的低层可能不够用——那就多解冻几层(或回到 05 章的 LoRA)。

3.3 超参:一套可直接抄的起点

原书给微调超参定了一套基线:学习率 2e-5、权重衰减 0.01、AdamW 优化器、线性学习率调度器(随训练逐步降)5。两条原理解释:学习率是「参数更新步幅的控制因子」,大了不收敛、小了过慢6;权重衰减在梯度下降时对权重加小幅正则,防过拟合7

2e-5 这个数值得记——它是 BERT 级模型微调的行业常用起点(第 9 章那套「学习率要小步走」的道理,在微调场景的具体化:预训练模型已在好解附近,大步子反而把它踹走)。

3.4 评估与推理优化:四个指标,两道收尾

评估不能只看准确率:原书列了准确率、精确率、召回率、F1 四件套——精确率回答「报为正的有多少真是正」,召回率回答「真是正的有多少被抓到」,F1 是两者的调和平均;类别不平衡时准确率会骗人,这四个数才见真章8

部署前两道收尾:动态量化——把模型里的 Linear 层从 32 位浮点压到 8 位整数,模型更小、推理更快(torch.quantization.quantize_dynamic 一行)9;蒸馏——回到 10 章的师生结构,把微调后的大模型当教师再压一层10。至此全书的技术闭环:量化管「每个数省一半以上」,蒸馏管「整个网络换小的」,剪枝(10 章)管「不要的权重剪掉」。

4. 作者的判断与证据

  • 有演示数据的: 切分参数(0.3/0.5、stratify)、解冻参数名清单、三个 epoch 损失 0.6534→0.6123、超参 2e-5/0.01、量化后的预测输出、蒸馏损失 0.0145→0.0083。
  • 是作者判断的: 「层级冻结在微调任务中显著减少了训练时间和显存占用」——「显著」没有给出与全量微调的对照数字;「量化与蒸馏显著降低了推理的内存和计算需求」同为定性结论。
  • 演示的边界: 综合案例的评估输出是 Accuracy/Precision/Recall/F1 全部 1.0011——这是玩具数据的必然结果,说明演示跑通了,不能当成微调效果的证据。

5. 边界与局限

  • 原书只演示了「解冻顶部两层」这一种冻结粒度;解冻几层、按什么标准决定,没有给方法论(只有思考题在追问「冻结过多或过少的负面影响」)。
  • 量化只讲动态量化一招;静态量化、量化感知训练(QAT)、以及 LLM 时代主流的 GPTQ/AWQ 都不在书里。
  • 评估四件套是分类任务的;生成任务的评估(第 2 章的 BLEU/ROUGE/困惑度)在本章没有衔接——两章的评估体系各说各话。
  • 全章没有「微调 vs PEFT vs 全量」的资源对照表;05 章与 12 章其实是同一决策的两个端点,书没有把它们连起来,本拆解在第 5 章的选型表里补了。

6. 可带走的

  1. 微调五步是模板:数据→冻结→超参→评估→推理优化;新任务先照抄再改。
  2. 切分必须分层抽样(stratify);类别比例歪了的指标全是假象。
  3. 冻结策略:全冻→解冻顶部两层+分类头,是「省」与「效」的默认起点;不够再放宽。
  4. 微调学习率从 2e-5 起步;预训练模型经不起大步子。
  5. 权重衰减 0.01 是微调的常用值;它与学习率是一对,调一个要连着看另一个。
  6. 类别不平衡时只看准确率会骗人;精确率/召回率/F1 一起看。
  7. 部署前两道收尾:动态量化一行代码,蒸馏回到 10 章;三招压缩(量化/蒸馏/剪枝)按需叠加。
  8. 评估输出全是 1.00 的演示,看流程别看数字。

7. 原文地图

主题原书章原文位置
章导语第12章text/76-ch12.txt:24(搜「微调数据集的选择和准备策略」)
数据准备与切分12.1text/77-fm.txt:24(搜「数据清洗、分割与数据增强」) · text/77-fm.txt:48(搜「test_size=0.3」)
少样本增强12.1text/77-fm.txt:87(搜「数据增强有助于提升模型在少样本场景下的表现」)
层级冻结与解冻12.2text/78-fm.txt:24(搜「逐层冻结或解冻」) · text/78-fm.txt:42(搜「requires_grad=False」) · text/78-fm.txt:45(搜「仅解冻最后两层和分类层」)
解冻参数名与损失12.2text/78-fm.txt:60(搜「bert.encoder.layer.10」) · text/78-fm.txt:81(搜「0.6534」)
学习率与权重衰减12.3text/79-fm.txt:27(搜「较大的学习率可能导致」) · text/79-fm.txt:30(搜「防止模型过拟合」) · text/79-fm.txt:48(搜「2e-5」) · text/79-fm.txt:51(搜「线性学习率调度器」)
四指标与量化蒸馏12.4text/80-fm.txt:27(搜「准确率、精确率、召回率」) · text/80-fm.txt:30(搜「32位浮点数减少到8位整数」) · text/80-fm.txt:51(搜「quantize_dynamic」)
综合案例12.5text/81-fm.txt:24(搜「数据准备、层级冻结」) · text/81-fm.txt:60(搜「F1 Score: 1.00」) · text/81-fm.txt:85(搜「量化模型显著减小了存储需求」)

Footnotes

  1. 出处:「第12章 模型微调实战」第 24 段(text/76-ch12.txt:24,搜「微调数据集的选择和准备策略」)。

  2. 出处:「12.1 微调数据集的选择与准备」第 46-57 段(text/77-fm.txt:45,搜「适用于少样本微调」;text/77-fm.txt:48,搜「test_size=0.3」)。

  3. 出处:「12.1 微调数据集的选择与准备」第 85-87 段(text/77-fm.txt:87,搜「数据增强有助于提升模型在少样本场景下的表现」)。

  4. 出处:「12.2 层级冻结与部分解冻策略」第 42 与 45 段(text/78-fm.txt:42,搜「requires_grad=False」;text/78-fm.txt:45,搜「仅解冻最后两层和分类层」)。

  5. 出处:「12.3 模型参数调整与优化技巧」第 48 与 51 段(text/79-fm.txt:48,搜「2e-5」;text/79-fm.txt:51,搜「线性学习率调度器」)。

  6. 出处:「12.3 模型参数调整与优化技巧」第 27 段(text/79-fm.txt:27,搜「较大的学习率可能导致」)。

  7. 出处:「12.3 模型参数调整与优化技巧」第 30 段(text/79-fm.txt:30,搜「防止模型过拟合」)。

  8. 出处:「12.4 微调后的模型评估与推理优化」第 27 段(text/80-fm.txt:27,搜「准确率、精确率、召回率」)。

  9. 出处:「12.4 微调后的模型评估与推理优化」第 30 与 51 段(text/80-fm.txt:30,搜「32位浮点数减少到8位整数」;text/80-fm.txt:51,搜「quantize_dynamic」)。

  10. 出处:「12.4 微调后的模型评估与推理优化」第 33 与 55 段(text/80-fm.txt:33,搜「蒸馏」;text/80-fm.txt:54,搜「distillation_loss」)。

  11. 出处:「12.5 综合微调应用案例」第 60 段(text/81-fm.txt:60,搜「F1 Score: 1.00」)。