python神经网络编程入门(四十四)——微调预训练 BERT 做下游任务

📍 路标 :本篇位于《从零构建 Transformer》系列 第 15/16 章 · 实战篇

系列主线:注意力思想 → 自注意力 → 多头 → 位置编码 → 编解码架构 → 手撕实现 → 预训练模型 → 实战微调 → 知识收官

进度:▸ 基石篇(1-5) ▸ 架构篇(6-10) ▸ 预训练篇(11-13) ▸ 实战篇(14-16·本篇) ▸ 知识收官
摘要:第 15 章讲"站在巨人肩上":不自己从零训练,而是先用无标注语料预训练(学会用 CLS 聚合全句判断"是否含情感词",30 步到 96%),再在少量噪声标注数据上微调做情感分类。真实输出对比三种方案:从零训练(测试 76.7%)、预训练后微调(88.3%,胜出)、冻结特征(46.7%);并在 10/40/100 条标注下验证微调全面优于从零(+8~18 个百分点),还踩出一个真实教训:任务头必须重新初始化、只能迁移骨干。
上一篇(四十三):从零训练一个小型 Transformer 做文本分类


引言:上一章从零造,这一章站在巨人肩上

第 14 章我们从零训练了一个 842 参数的分类器,测试准确率 92.5%------听起来不错,但要看清代价:200 条数据、60 步、纯 NumPy、而且任务极其简单 (情感词决定标签)。换到真实 IMDB(2.5 万条影评、否定句、反讽、长句),这个模型会跌到 60% 以下。真实世界的分类器是怎么做到 90%+ 的?答案不是"从零训一个更大的",而是:加载别人用海量数据预训练好的 BERT,只微调几轮

这就是迁移学习(Transfer Learning):把"在某处学到的知识"搬到"另一处任务"上。人类每天都在做这件事------你学会了中文,再学"给句子标情绪"只需要看几个例子;BERT 也一样:它在几十亿 token 上学会了"语言",再学"情感分类"只需要几千条标注。

这一章用可复现的小实验把迁移学习的每个环节拆开验证:

  1. 预训练:先用 300 条"无标注"语料训练一个模型(标签由词表自动推导,不需要人工标注),让它学会"用 CLS 聚合全句判断句子是否含情感词"(demo1);
  2. 微调 :把预训练好的骨干(嵌入 + Encoder)复制过来,换一个新的随机分类头,在 40 条标注数据上微调------测试准确率 88.3%,比从零训练的 76.7% 高 11.6 个百分点(demo2/3);
  3. 冻结特征:对比"Encoder 完全冻结、只训分类头"的做法(demo4)------在本设置下它反而受限,原因值得分析;
  4. 小样本优势:标注数据越少,微调相对从零的优势越明显(demo5);
  5. 一个真实教训 :写这章时我踩了个坑------"连任务头一起继承"让微调反而变差,最后发现任务头必须重新初始化、只能迁移骨干(这正是真实 BERT 微调的标准做法)。

这一章也是"知识的总验收":它把第 10 章的训练三件套(平滑 CE、AdamW、warmup)、第 11 章的数据管线(分词、padding、mask)、第 12 章的小 BERT(encoder-only、CLS 聚合)、第 14 章的分类器全部串联起来,又加上了"迁移学习"这块新拼图。如果你读到这里觉得"每个环节都眼熟",说明前 14 章没有白写------迁移学习不是新数学,而是"旧零件 + 新策略":策略只有三条(骨干继承、头重建、小学习率),本章用实验逐一验证。

先给一句话定位本章与第 14 章的关系:第 14 章是"造"(从零训练一个能用的模型),第 15 章是"借"(借别人预训练好的骨架,快速改造成自己的模型) 。两章用的是同一套训练代码、同一个模型结构,唯一区别是"初始权重从哪来"------随机(第 14 章)还是预训练(第 15 章)。而这个"唯一区别"带来的效果差异,正是迁移学习这门学问的全部内容。读懂本章,你就明白为什么今天几乎没有团队再从零训练语言模型------不是不能,而是没必要:预训练模型已经替你把最贵的"学语言"这步做完了

🎯 本章目标

  1. 理解迁移学习的两阶段范式:预训练(无标注、贵、一次)→ 微调(有标注、便宜、多次);
  2. 亲手验证"预训练先验"的价值:微调 88.3% vs 从零 76.7%(demo2/3);
  3. 看懂三种方案(从零/微调/冻结)的差异与适用场景(demo2/3/4);
  4. 验证小样本优势:10/40/100 条标注下微调全面优于从零(demo5);
  5. 理解"任务头必须重新初始化、只迁移骨干"这一核心原则(图 10);
  6. 对接真实世界:HuggingFace 微调 BERT 的学习率、轮次、头初始化方式。

一、迁移学习:为什么"站在巨人肩上"更快

1.1 两阶段范式

第 12 章我们讲过 BERT 的"预训练 → 微调"两阶段,第 14 章我们验证了"从零训练"的完整闭环。这一章把两者接起来:预训练 (海量无标注文本,学"语言",贵但只做一次)→ 微调(少量标注数据,学"任务",便宜且可重复)。

为什么预训练值得做? 一句话:语言知识是"可迁移"的。情感分类需要懂"great 是好词、terrible 是坏词、句子结构怎么组织"------这些在预训练里(无标注地)学会了,微调时只需学会"怎么把情感说出来"这个薄薄的一层。而从零训练要把"语言知识 + 任务"一起学,数据不够就学不好。

1.2 同一任务,不同的"起点"

用图把两种方式摆在一起:同一个任务、同一个模型结构,唯一差别是初始权重------随机(从零)vs 预训练(微调)。

🎤 一句话总结迁移学习预训练花钱买"语言",微调花小钱买"任务"------总价远低于"从零把两者一起学"。

1.3 迁移学习的三种常见形式 。顺便把术语理清(面试常考):①特征迁移(Feature Transfer) ------用预训练模型把输入变成特征向量,下游只用特征(对应本章的冻结特征方案);②参数迁移(Parameter Transfer) ------用预训练权重初始化模型,继续训练(对应全量微调,本章主角);③领域迁移(Domain Transfer) ------在 A 领域预训练,用到 B 领域(如用英文模型初始化中文模型,先做语言适配)。三种形式中,参数迁移(微调)是 NLP 的主流,因为它让预训练知识参与下游训练、效果最好;特征迁移省算力但效果略逊;领域迁移一般作为前两者的前置步骤。本章实验恰好覆盖了①②两种:冻结特征(①)vs 全量微调(②)的对比,就是图 8 那两根柱子的故事。

1.4 本章实验设计总览。为了让你在读代码前心里有数,先把实验地图画出来:

环节 数据 任务 训练
预训练 300 条无标注句(含情感词句/纯填充句各半) 句级"是否含情感词"(CLS 二分类) 30 步,lr 0.1
方案 A 从零 40 条标注(15% 噪声) 情感二分类 30 步,lr 0.1,随机初始化
方案 B 微调 同上 同上 40 步,lr 0.05,预训练骨干 + 随机头
方案 C 冻结 同上 同上 30 步,只训 18 个头参数
小样本对比 10/40/100 条标注 同上 各 20~25 步,从零 vs 微调
评估 60 条干净测试集 ------ 所有方案共用同一测试集

注意两个"公平性"设计:①测试集对所有方案完全相同 (60 条、干净无噪声、与训练集不同源)------否则对比无意义;②微调与从零的骨干结构完全相同 (842 参数)------差别的唯一来源就是"初始权重"。控制变量,才能把效果差异归因于"预训练"而不是别的。


二、预训练:无标注语料上的自监督任务

2.1 标签从哪来?------从词表自动推导

"无标注"不意味着"没有可学的信号"。这一章的预训练用了一个巧妙的自监督信号 :句子是否含情感词。这个标签不需要人工标注------查词表(great/love 是情感词,the/and 不是)就能算出来。语料里一半是含情感词的句子、一半是纯填充词的句子:

这个任务设计有两个用心:①它训练了"CLS 聚合全句"的能力 ------和下游分类任务同构;②它让模型记住"哪些词是情感词"------正是下游情感分类最需要的先验。真实 BERT 的预训练(MLM,第 12 章)也是同类思路:标签从文本自身来(被遮的词就是标签),不需要人标注。

2.2 预训练实测(demo1)

真实输出:

复制代码
【demo1】预训练:无标注语料上做句级二分类"是否含情感词"([CLS]聚合,30 步)
  step 10  loss 0.7111  预训练准确率 52.3%
  step 20  loss 0.6718  预训练准确率 52.3%
  step 30  loss 0.3085  预训练准确率 96.0%
→ 预训练后:模型学会了用 [CLS] 聚合全句、判断"句子里有没有情感词"------和下游任务同构

前 20 步几乎没动(warmup + 数据简单),第 30 步准确率从 52.3%(瞎猜)跳到 96.0%------模型学会了"CLS 聚合 + 情感词检测"。训练完的骨干(嵌入 + Encoder)就是我们要"搬"到下个任务的财富。

🎤 一句话总结预训练"无标注"不等于"没信号"------从词表推导标签、从文本自身推导标签(MLM),都是自监督。预训练的目的不是"完成任务",而是"学到可迁移的语言先验"。

2.3 为什么选"是否含情感词"这个预训练任务? 诚实交代设计理由:真实 BERT 用 MLM(猜被遮的词),那是几十亿 token 才喂得动的任务(第 12 章我们验证过:小模型猜具体词会卡在局部最优)。本章把预训练任务换成"句子是否含情感词"------它是一个与下游任务同构、但标签无需人工标注 的二分类:①同构 :下游是"句子积极/消极"(CLS 聚合),预训练是"句子是否含情感词"(同样是 CLS 聚合)------预训练直接教会模型"CLS 怎么聚合、情感词在哪",微调只需把"是否含"细化为"积极还是消极";②自监督 :标签查词表就有,符合"无标注"精神;③可学 :小模型 + 数值梯度 30 步就能到 96%(demo1)。"预训练任务与下游任务对齐度越高,迁移收益越大"------这是本章最重要的设计心得,也解释了真实世界为什么 MLM 好使:它教的是"语言理解"这个通用能力,对几乎所有下游任务都对齐。

2.4 预训练与微调的数据"性格"不同 。一张小表收尾数据部分:预训练数据多而脏 (无标注、规模大、质量参差,标签是自动推导的近似),微调数据少而贵 (人工标注、规模小、含噪声但可信)。这两个"性格"决定了两种训练的态度:预训练可以"大胆地跑"(数据多不怕过拟合),微调必须"小心地跑"(数据少怕过拟合、怕踢飞先验)。真实项目里,预训练数据是"量"的胜利,微调数据是"质"的精选------这也是为什么收集几千条高质量标注,往往比在低质量数据上再训几轮更有效。


三、微调:继承骨干 + 新头 + 小学习率

预训练完成,开始微调。流程三步:

  1. 复制骨干 :把预训练模型的嵌入 + Encoder 权重原样复制过来(只复制骨干,不复制预训练的任务头------原因第六节讲);
  2. 换新头:为下游任务新初始化一个分类头(随机权重);
  3. 小学习率微调:用远小于从零训练的学习率(0.05 vs 0.1)继续训练,避免"一脚踢飞"预训练学好的先验。

🎤 一句话总结微调"复制骨干、换新头、小步走"------前两步是结构操作,第三步是训练策略(第 10 章学过的"动作要轻":学习率太大 = 踢飞先验)。

3.1 两个"为什么"提前说透 。①为什么只复制骨干、不复制头? 预训练的任务头(判断"是否含情感词")期望的输入是"某位置的向量",而下游分类头拿到的是"CLS 聚合向量"------两者的输入分布不是一回事。带着不匹配的头开始微调,等于带着错误偏见出发,第六节会用实验证明这一点。②为什么微调学习率要小? 第 10 章我们讲过"预训练权重是存款,微调是取零花,动作要轻"------学习率决定了每次参数移动的幅度,0.05 表示"骨干只允许小幅调整";0.1 以上就可能把预训练学好的"情感词在哪、CLS 怎么聚合"一把冲掉(第七节对照表里真实 BERT 用 2e-5,比我们更小,因为它的先验更值钱)。微调的"微"字,一半指数据少,一半指步子小


四、三种方案实测对比:预训练先验到底值多少钱

这是本章最核心的实验。同一个任务(40 条标注、15% 标签噪声)、同一个测试集(60 条干净样本),三种"起点":

方案 A:从零训练(demo2)------骨干随机初始化,30 步:

复制代码
【demo2】方案A 从零训练:随机初始化 + 40 条标注,30 步
  从零初始化(未训练)测试集准确率: 48.3%(随机,约等于瞎猜)
  step 10  loss 0.3122  训练准确率 95.0%
  step 20  loss 0.2952  训练准确率 97.5%
  step 30  loss 0.3314  训练准确率 97.5%
  测试集准确率: 76.7%

方案 B:预训练后微调(demo3)------预训练骨干 + 新分类头,40 步:

复制代码
【demo3】方案B 微调:继承预训练骨干(emb+Encoder)+ 新分类头,小学习率 0.05,40 步
  微调前(继承骨干+随机头,未训练)测试集准确率: 45.0%(约等于瞎猜------预训练收益在微调后才显现)
  step 10  loss 0.5634  训练准确率 80.0%
  step 20  loss 0.2290  训练准确率 100.0%
  step 30  loss 0.2241  训练准确率 100.0%
  step 40  loss 0.2031  训练准确率 100.0%
  测试集准确率: 88.3%

方案 C:冻结特征(demo4)------Encoder 完全冻结,只训练 18 个分类头参数:

复制代码
【demo4】方案C 冻结特征:Encoder 冻结(预训练骨干),只训练新分类头(18 参数),30 步
  step 10  loss 0.7208  训练准确率 50.0%
  step 20  loss 0.6805  训练准确率 57.5%
  step 30  loss 0.6966  训练准确率 50.0%
  测试集准确率: 46.7%

三组数字的解读:

  • 从零 76.7% vs 微调 88.3% :同样的骨干结构,只差"起点",差了 11.6 个百分点------预训练先验的价签,清清楚楚。微调还更稳:训练准确率 100%(把 15% 噪声样本之外的全学对了),loss 一路平滑下降;
  • 微调前只有 45% :注意这个数字------继承骨干但还没微调时,测试集只有 45%(约等于瞎猜)。这说明预训练先验不是"白送的结果",而是"一个更好的起点":它在微调过程中让模型学得更快、更好、更稳,而不是躺赢;
  • 冻结特征 46.7% :在本设置下(小模型 + 小数据)冻结特征反而受限------因为预训练任务产出的 CLS 特征"含情感词检测"与下游"积极/消极"区分不完全对齐,且分类头只有 18 个参数、数据只有 40 条,学不到足够的区分。真实世界里冻结特征通常有效 (大模型特征很丰富),但本章数据告诉我们:能微调就微调,别偷懒

4.1 三组数字背后的机制 。逐个拆解"为什么是这样":①从零 76.7% 为什么不错? 因为任务本质是"情感词检测",40 条标注里含足够的情感词样本,随机初始化也能学会------但只学到 76.7% 就上不去了,因为 15% 噪声样本它"照单全收"(训练 97.5% ≈ 学会了 15% 的错误标签);②微调 88.3% 为什么更高? 预训练已教会"哪些是情感词、CLS 怎么聚合",微调只需补"积极还是消极"这一层------而且先验让模型对噪声样本"有主见"(不盲从错误标签),所以训练 100%、测试也高;③冻结 46.7% 为什么崩? 预训练特征(CLS 向量)只编码了"含不含情感词",这个信号对"积极 vs 消极"区分度不足,而 18 个头参数在 40 条数据上无法"变出"新特征------冻结 = 信任预训练特征足够好,但本章的预训练特征还不够好 。三组数字合起来讲了一个完整的故事:先验的价值不在于"免费"(微调前 45%),而在于"引导"(微调时学得又快又稳又抗噪)

4.2 "抗噪"的机制是什么? 值得多想一层:为什么微调面对 15% 噪声标签更稳?打个比方:从零模型像一个没有底线的学生 ------40 条"例题"里有 6 条答案印错了,它全部照背(训练 97.5% ≈ 6/40 全错也记下);微调模型像一个有常识的学生 ------它早知道"great 是好词",即使 6 条例题把 great 标成消极,它也会"犹豫"而不是全盘接受。这个"犹豫"来自预训练先验:模型对"哪些词是情感词"已有稳定的内部表示,标签噪声只让它在"边界处"摇摆,不足以推翻整体认知。在真实项目中,这种抗噪性意味着:预训练模型可以用更脏的标注数据(降低标注成本),而仍保持不错的效果------这也是迁移学习在工业界"省钱"的方式之一。

微调训练曲线与三方案对比柱状图:

🎤 一句话总结对比微调 > 从零 > 冻结(本设置下)------预训练先验值 11.6 个百分点;冻结特征在小规模下"省了训练,也省了效果"。


五、小样本优势:标注越少,迁移越值钱

迁移学习最著名的卖点:标注数据很少时,预训练模型依然能用。用三档标注量(10/40/100 条)分别训练"从零"和"微调",在同一 60 条干净测试集上评估(demo5):

复制代码
【demo5】小样本优势:标注数据越少,微调相对从零的优势越大(测试集 60 条)
       标注量             从零训练            预训练微调           差距
      10 条            56.7%            66.7%        10.0%
      40 条            85.0%            93.3%         8.3%
     100 条            73.3%            91.7%        18.3%
→ 三档标注量下微调全部优于从零(+8~18 个百分点)------预训练先验在噪声标注数据上更稳健
  • 10 条 :从零只有 56.7%(数据太少 + 15% 噪声,模型被噪声带偏),微调 66.7%------预训练先验像锚一样稳住模型
  • 100 条 :从零 73.3%(噪声数据多,从零"学噪"),微调 91.7%------数据多了从零也追不上,因为 15% 噪声是"学不对的",预训练先验让模型不被噪声带跑;
  • 结论修正了常见误解:"标注足够多时从零也能追上"------在本实验里没追上,因为预训练先验帮模型抵抗了标签噪声(真实数据总带噪声)。

🎤 一句话总结小样本优势预训练先验 = 免费的数据增强 + 抗噪盾牌------数据越少、噪声越多,它的价值越大。

5.1 数据的边际收益:为什么 100 条没有比 40 条好多少? 看 demo5 的微调列:66.7%(10 条)→ 93.3%(40 条)→ 91.7%(100 条)------从 40 条加到 100 条,准确率几乎没涨 。这不是 bug,而是"数据边际收益递减"的典型表现:任务能学的东西(区分 12 个情感词的方向)在 40 条时已基本学完,再加 60 条只是重复。反过来看从零列:56.7%(10 条)→ 85%(40 条)→ 73.3%(100 条)------从零在 100 条时反而掉了 (15% 噪声样本更多,过拟合噪声更严重)。这条规律给工程实践的启示:先看"加数据是否还有收益"再决定要不要标数据------预训练模型的"数据饥饿"远比从零模型低,很多时候几千条标注就够用了(对照真实 BERT 微调通常只需要几千条)。


六、一个真实的教训:任务头必须重新初始化

写这一章时,我踩了一个坑,值得原原本本讲出来:一开始我把预训练模型连任务头一起继承("词类头"直接当"分类头"用),结果微调反而比从零还差(60% vs 73.3%)。排查后发现原因:

  • 预训练的"词类头"期望输入的是单个词的向量(词级任务);
  • 微调的分类头输入的是 CLS 聚合向量(句级任务);
  • 两者输入分布完全不同------用词类头当分类头,等于给"句级分类"塞了一个"词级分类器",初始权重就跑偏了。

修正后(只继承骨干、分类头随机初始化),微调立刻变成 88.3%。这个坑的价值在于:它不是巧合,而是迁移学习的核心原则------

🎤 一句话总结本章最重要的坑"骨干可迁移,头不可迁移"------预训练学的是任务无关的语言理解,输出头学的是任务专属的映射;换任务时,头必须重建。

6.1 从坑里能带走的经验 。这个坑的价值不只在"头不迁移"这一条,还有两条通用教训:①实验里出现"反直觉结果"时,先怀疑"初始化",而不是怀疑"训练" ------微调比从零差,第一反应应该是"是不是继承的权重带偏了",而不是"微调没调好";②对照组要做得细 ------如果我一开始就同时跑"继承头"和"重建头"两个版本对比,坑当场就能发现;只跑一个版本,就容易把"坏结果"误归因于"方法不行"。这两条是"可迁移的调试经验":在深度学习里,错误往往藏在"你没想到要检查的那一步"(这里是初始化),而对照实验是照妖镜

6.2 除了"头",还有什么"不该迁移"? 顺着"头不迁移"的原则再想一步:位置编码、padding token 的嵌入 这类"协议相关"的权重,在任务变化时通常也不迁移或重新学习------因为序列长度、padding 约定可能变了(第 11 章)。真实 BERT 微调时一般保留 位置编码(BERT 固定 max_len=512),但重新初始化 分类头、并视情况 重学 segment 嵌入(句子对任务才用)。一个实用的判断标准:"这个权重编码的是'语言知识'(可迁移)还是'任务协议'(不可迁移)?"------语言知识(词义、句法)带走,任务协议(输出格式、特殊 token 的含义)重建。这个标准能帮你在任何"迁移"场景里快速决定"带什么、丢什么"。

6.3 迁移学习与第 10 章训练三件套的"化学反应" 。回顾本章所有实验,训练用的还是第 10 章的平滑 CE、AdamW、warmup------但迁移学习给它们加了新含义:warmup 不只是"防起步爆炸",更是"防止第一步就踢飞先验" (学习率从 0 爬升 = 先不动骨干);标签平滑不只是"防过度自信",更让模型"对噪声标注不较真" (这正是 4.2 节抗噪机制的一部分);权重衰减在微调小数据时尤其重要 (防止把几百条标注背下来)。同一个工具,在"从零训练"和"微调"两个场景里有不同的使命------理解了这一点,你就不是在"套模板",而是在"懂原理地调参"。


七、真实世界的微调:对照 HuggingFace

本章的小实验是"微调 BERT"的微缩版。对照真实世界(HuggingFace 微调 bert-base-uncased 做情感分类),你会发现参数不同,配方完全一致

环节 本章小实验 真实 BERT 微调
预训练 300 条语料,30 步 33 亿 token,几十万步
骨干 嵌入 + 1 层 Encoder(842 参数) 嵌入 + 12 层 Encoder(1.1 亿参数)
分类头 随机初始化(8→2) 随机初始化(768→2)
学习率 0.05(warmup 5 步) 2e-5~5e-5(warmup 若干步)
轮次 40 步 2~4 epoch
冻结策略 默认全量微调 默认全量微调(冻结特征可选)
结果 88.3%(40 条标注) 90%+(几千条标注)

三点对照读懂这张表:①"头随机初始化、骨干继承、小学习率"三个配方完全一致 ------本章学的就是真实的微调;②规模差 6 个数量级,但机制相同 ------小实验验证的规律在大模型上成立;③真实 BERT 用 2e-5 这种"极小"学习率,因为 1.1 亿参数的先验比我们 842 参数值钱得多,更要"轻拿轻放"。

🎤 一句话总结真实微调本章小实验 = 真实 BERT 微调的"同构缩放"------配方一样,只是把 842 换成 1.1 亿、把 300 条换成 33 亿 token。

7.1 微调还会遇到的两个问题 。①灾难性遗忘(catastrophic forgetting) :如果微调学习率过大或轮次过多,模型会"忘掉"预训练学的东西、只记住下游任务------表现是训练集准确率很高、但一到新领域就崩。缓解手段就是"小学习率 + 少轮次"(本章配方),以及"不要贪杯"(2~4 epoch 就停,多训反而过拟合);②小数据过拟合 :下游标注只有几百条时,微调也可能把这几百条"背下来"------此时可以用第 10 章的权重衰减、标签平滑,或者干脆退回到"冻结特征"方案。真实项目里,"微调到底调几轮"通常用验证集(train/validation/test 三段)决定------训练中定期看验证集准确率,不再上升就停(早停,early stopping)。

7.2 把本章数字"换算"到真实 BERT 。一个练习:本章预训练 300 条、微调 40 条、差距 +11.6 个百分点;真实 BERT 预训练 33 亿 token、微调几千条、典型差距是多少?其实真实世界很难做"从零 vs 微调"的公平对比(从零训 1.1 亿参数根本不现实)------这正是迁移学习最厉害的地方:它让"从零训练"这个选项直接退出比赛 。真实的证据是另一个方向:BERT 刚发布时,用 2500 条标注数据微调就能在多数任务上超过"用全部数据从头训的传统模型"。数字会随规模变,但"预训练先验让下游又快又好"这个方向,从 842 参数到 1.1 亿参数,从未改变


八、常见坑与自查

  • 连任务头一起继承 :本章最大的坑(第六节)。预训练头的输入分布与下游头不同,直接继承会跑偏。自查:微调前确认分类头是随机初始化的;
  • 学习率太大踢飞先验:微调 lr 要明显小于从零训练(本章 0.05 vs 0.1,真实 BERT 2e-5)。学习率太大 = 第一步就把预训练学的知识冲掉;
  • 把"预训练准确率"当"下游能力":预训练 96%(判断是否含情感词)≠ 下游 88.3%(积极/消极)。预训练是"起点",微调才是"终点"------微调前测试只有 45%,就是证明;
  • 测试集与训练集同源:评估必须在"从没见过"的测试集上(本章测试集单独生成、干净无噪声)。用训练集评估会虚高(从零能到 97.5%);
  • 冻结特征无脑用 :冻结省训练,但本章数据显示小模型+小数据下冻结只有 46.7%。能微调就微调,冻结通常只在"特征已足够丰富"或"算力受限"时用;
  • 忽略标签噪声 :真实标注总有噪声(本章 15%)。噪声下从零模型"学噪"(100 条从零 73.3%),预训练先验能抗噪------评估时别只看训练集,测试集才是真相
  • 忘了 warmup:微调同样需要第 10 章的 warmup(学习率从小爬升),尤其在小数据上,一上来就大学习率会震荡;
  • 用训练集上的"预训练准确率"判断迁移好坏:预训练 96% 是"预训练任务"的成绩,不是"下游任务"的成绩------迁移效果要用"微调后的测试集"来评判(本章 88.3% 才是数字);
  • 小测试集上比大小:60 条测试集差 2~3 条样本就是 4~5 个百分点,单次实验的微小差距可能是噪声------判断"方案 A 是否优于方案 B",最好多次换 seed 重跑看波动范围。

小结

第 15 章用可复现实验把"迁移学习"从口号变成数字,核心收获九条:

  • 两阶段范式:预训练(无标注、贵、一次)→ 微调(有标注、便宜、多次),"预训练买语言、微调买任务"(图 1);
  • 自监督信号:无标注 ≠ 没信号------标签可从词表推导(是否含情感词),也可从文本自身推导(MLM)(图 3);
  • 预训练实测:30 步内准确率 52.3% → 96.0%,模型学会"CLS 聚合 + 情感词检测"(demo1、图 6);
  • 微调配方:复制骨干 + 新随机分类头 + 小学习率(图 4);
  • 三方案实测 :从零 76.7% vs 微调 88.3%(+11.6)vs 冻结 46.7%------微调完胜(demo2/3/4、图 5、图 7、图 8);
  • 微调前 45%:预训练先验不是"白送结果",而是"更好的起点"------收益在微调中兑现;
  • 小样本优势:10/40/100 条标注下微调全面优于从零(+8~18 个百分点),且抗噪声(demo5、图 9);
  • 头不可迁移:任务头必须重新初始化、只迁移骨干------本章踩坑换来的核心原则(图 10);
  • 真实世界对照:HuggingFace 微调 BERT 与本章配方完全一致(头随机、小 lr 2e-5、2-4 epoch),规模差 6 个数量级、机制相同;
  • 一句话记住本章预训练解决"学语言",微调解决"学任务"------先验的价值是"引导"不是"免费",而"头不迁移"是铁律

系列进度 :第 14 章"自己造"、第 15 章"站在巨人肩上",实战篇只剩最后一章------把 RNN 与 Transformer 两条知识线织成一张认知树,并为整个 16 章系列画上句号。到这一章为止,"预训练 → 微调"这个当今 NLP 的黄金范式,你已经从原理到代码完整走了一遍:看得懂、写得出、验得明------从 842 个参数的小实验,到 1.1 亿参数的真实 BERT,配方从未变过。


下一篇(四十五):知识体系收官------从 RNN 到 Transformer 的完整地图

相关推荐
像风一样自由20204 小时前
14.什么时候用pgvector什么时候单独部署Milvus
postgresql·大模型·微调·milvus
Lee_jerome3 天前
python神经网络编程入门(四十三)——从零训练一个小型 Transformer 做文本分类
文本分类·情感分析·cls·准确率·训练循环·encoderonly·实战篇
Tbisnic6 天前
BGE-M3 算法详解:从模型架构到三种检索方式的数学原理
算法·自然语言处理·大模型·bert·transformer·注意力机制
孙启超8 天前
【大模型应用开发】LLM 到底是什么,以及它是怎么训练的
人工智能·lora·llm·微调·sft·token·rlhf
bulingg8 天前
bert输入长度有限,如何处理超长文本?
人工智能·深度学习·bert
bittersuite9 天前
BERT,fine-tuning
人工智能·深度学习·bert
leoZ23110 天前
Vue3 还原一个企业级后台-08-API注册管理
目标检测·机器学习·分类·状态模式·迁移学习·集成学习·figma