动手学深度学习——BERT微调

张开发
2026/4/18 19:03:22 15 分钟阅读

分享文章

动手学深度学习——BERT微调
1. 前言前面我们已经把 BERT 这一条线基本串起来了BERTBERT代码BERT预训练数据代码BERT预训练代码到这里我们已经知道BERT 最强的地方不只是模型本身而是“预训练 微调”这套范式。前面的几节主要解决的是模型怎么搭预训练数据怎么构造预训练时 MLM 和 NSP 怎么联合训练但真正到了实际应用中一个更关键的问题是预训练好的 BERT怎么拿去做具体任务这就引出了这一节的主题BERT 微调Fine-tuning这一节非常重要。因为它对应的是现代 NLP 最核心的一种使用方式先拿大规模语料把 BERT 预训练好再在具体任务上加一个很小的任务头最后用该任务数据对整个模型做联合训练。这就是为什么 BERT 能成为一个通用语言理解底座。2. 什么是微调“微调”两个字最简单的理解就是在已经预训练好的模型基础上再用目标任务数据做进一步训练。注意这里不是“从零训练一个新模型”也不是“只拿预训练模型当固定特征提取器”。BERT 微调通常做的是把预训练好的参数作为初始化然后在下游任务上继续更新参数。也就是说BERT 主体参数会继续学新加的任务输出层也会一起学所以 Fine-tuning 的核心不是“冻结不动”而是带着预训练知识整体适配新任务。3. 为什么 BERT 不直接从零做下游任务因为从零训练成本高而且往往效果差。假设你现在要做一个下游任务比如情感分析文本分类自然语言推理问答命名实体识别如果完全从零训练那么模型必须同时学会第一语言基本规律例如词义语法句子结构上下文关系第二任务本身规律例如正负情感怎么区分两句话是否矛盾哪个片段是答案这就很浪费。而 BERT 的优势就在于它已经在海量语料上学会了大量通用语言知识。所以下游任务只需要在这个基础上“最后再对准目标任务”这当然会更高效、更稳。4. BERT 微调的核心思想是什么一句话概括预训练阶段学通用语言表示微调阶段学具体任务决策边界。也就是说预训练解决的是“语言本身”的问题。微调解决的是“这个任务要怎么用这些语言表示”的问题。这就是现代 NLP 很经典的分工方式通用能力先学好任务能力后适配所以微调并不是在重新学一遍语言而是在已有语言理解能力基础上做任务特化。5. BERT 微调和“特征提取”有什么区别这个点很容易混。特征提取Feature Extraction通常是预训练模型参数固定不动只把它输出的表示拿出来再喂给一个额外分类器这种方式更像把 BERT 当一个静态工具。微调Fine-tuning通常是BERT 主体参数也参与更新任务头参数也参与更新整个模型端到端一起学所以微调更强的原因在于它允许预训练模型根据新任务再做适配。这通常比只拿固定特征会更有效。6. BERT 微调通常怎么做大体流程可以概括成 4 步第一步加载预训练好的 BERT把已经学好通用表示的参数作为起点。第二步在顶层接一个任务相关输出头例如分类层序列标注层问答输出层第三步喂入下游任务数据例如分类样本、句对样本、标注样本。第四步联合训练BERT 主体和任务头一起更新。所以微调的关键就在于任务变了输出头变但底层语言表示主体基本保留。7. 为什么说 BERT 是“通用底座”因为很多不同 NLP 任务都可以共享同一个 BERT 编码器主体只是顶层任务头不一样。例如文本分类取[CLS]表示接一个全连接分类器。句对匹配也是取[CLS]表示做二分类或多分类。序列标注对每个 token 的表示分别做分类。问答对每个位置预测“是不是答案起点/终点”。所以 BERT 的通用性就在于底层统一顶层多变。这正是“预训练模型”最有价值的地方。8. BERT 微调时最常见的任务类型有哪些通常可以分成两大类。第一类句级任务即整段输入对应一个标签。例如情感分类文本主题分类自然语言推理句子相似度判断这类任务通常会用[CLS]位置的输出表示做分类。第二类词级任务即序列中每个位置都要有一个标签。例如命名实体识别词性标注分词这类任务通常会用每个 token 对应位置的输出表示分别做分类。所以不同任务微调时最大的差别通常就在输出头设计。9. 为什么句级任务通常用[CLS]因为在 BERT 输入中[CLS]被放在最前面经过多层 Transformer 编码后它的输出表示会融合整段输入信息。所以它很适合作为整句或整段输入的综合表示因此在句级任务中常见做法就是取[CLS]对应向量接一个线性层输出类别概率这是一种非常简单但非常有效的微调方式。10. 句级任务微调头一般长什么样最基础的写法通常很简单h_cls encoded_X[:, 0, :] y_hat classifier(h_cls)这里encoded_X是 BERT 编码器输出encoded_X[:, 0, :]就是[CLS]位置表示classifier通常是一个全连接层如果是二分类任务输出维度就是 2如果是多分类任务输出维度就是类别数。所以你会发现BERT 微调时新增的任务头往往很小。这也从侧面说明真正强的是 BERT 主体学到的表示。11. 词级任务为什么不能只看[CLS]因为词级任务需要对每个 token 单独做判断例如命名实体识别里“张三” 是人名“北京” 是地名其他词可能是 O这时候显然不能只看整句一个[CLS]表示。而必须拿每个 token 对应位置的输出表示分别做分类。所以词级任务微调一般是Y_hat classifier(encoded_X)其中对每个位置都输出标签分布。12. BERT 微调为什么通常比从零训练效果好原因可以从三个层面理解。第一参数初始化更好BERT 已经不是随机参数而是有大量语言知识的参数。第二样本效率更高下游任务哪怕数据不算很多也能借助预训练知识取得不错效果。第三泛化能力更强因为模型在大语料中见过各种语言现象不容易只记住小数据集里的表面模式。所以微调的核心优势本质上就是把大规模语料上学到的共性知识迁移到具体任务。13. 微调时 BERT 主体参数一定全部更新吗通常是会更新的。这也是标准 fine-tuning 的定义。不过实践中也有不同策略标准微调BERT 主体更新任务头也更新部分冻结冻结部分底层层只更新高层和任务头只训练任务头把 BERT 当特征提取器但如果按照“典型 BERT 微调”来讲最常见的默认理解还是整个模型联合训练这样模型能更充分适应新任务。14. 为什么微调学习率通常要更小因为预训练好的 BERT 参数已经很有价值。如果学习率太大容易把这些学好的知识一下“冲坏”。所以微调时常见做法是学习率比从零训练更小训练 epoch 不一定很多更注意稳定优化这背后的直觉很简单微调不是大改造而是细修正。所以“fine-tuning”里这个 fine其实就有“精细调整”的意思。15. 为什么微调任务头可以很简单因为 BERT 主体已经承担了最难的部分学高质量上下文化表示所以在很多任务里新增输出头只需要做很简单的映射例如一个线性层或少量 MLP就足够了。这和早期很多需要复杂任务特定结构的模型形成鲜明对比。也就是说BERT 的强大之处在于把复杂度尽量前移到预训练阶段让下游任务变得更轻。16. BERT 微调时输入格式还和预训练一样吗大体思路类似但会根据任务稍作调整。单句任务通常输入格式是[CLS] sentence [SEP]句对任务通常输入格式是[CLS] sentence_A [SEP] sentence_B [SEP]然后继续构造token idssegment idsvalid lengths所以你会发现BERT 预训练和微调在输入组织形式上是相通的。这也是它迁移方便的一个原因。17. 为什么自然语言推理特别适合拿来讲 BERT 微调因为自然语言推理NLI本身就是一个非常典型的句对理解任务。它的输入通常是前提句premise假设句hypothesis目标是判断两者关系例如蕴含矛盾中立这和 BERT 的句对输入形式高度契合[CLS] premise [SEP] hypothesis [SEP]所以在教学中NLI 非常适合作为 BERT 微调案例。这也是为什么你目录后面紧接着就是自然语言推理数据集BERT 微调代码18. BERT 微调和前面 BERT 预训练的关系怎么理解这两者一定要串起来看。预训练目标是在大规模无标注数据上学通用语言表示微调目标是在小得多的任务标注数据上把这些表示调到更适合具体任务所以这不是两个割裂阶段而是一个非常完整的 pipeline先学“通用能力”再学“任务能力”这正是 BERT 影响整个 NLP 范式的核心。19. 李沐这一节最想让你理解什么这一节最核心的不是立刻写很多代码而是先建立下面这条主线第一BERT 的真正威力在“预训练 微调”不是只看预训练本身。第二不同下游任务的区别主要体现在输出头而不是都要重新设计底层模型。第三句级任务常用[CLS]表示词级任务则用每个 token 的表示。第四微调通常会联合更新 BERT 主体和任务头这是标准 fine-tuning 思路。所以这一节其实是在完成一个非常关键的认知转变BERT 不是某个固定任务模型而是一个可迁移到很多任务的语言底座。20. 本节总结这一节我们学习了 BERT 微调核心内容可以总结为以下几点。20.1 BERT 微调是在预训练好的模型基础上适配具体下游任务而不是从零开始训练。20.2 下游任务通常只需在 BERT 顶部增加一个较小的任务头这体现了 BERT 作为通用底座的价值。20.3 句级任务通常使用[CLS]表示例如文本分类、自然语言推理等。20.4 词级任务通常使用每个 token 的输出表示例如命名实体识别、序列标注等。20.5 微调是“预训练 微调”范式中的第二步也是 BERT 真正落地应用的关键21. 学习感悟这一节特别重要因为它让你真正明白预训练模型的价值不在于“训练完放在那里”而在于“它能被迁移到很多具体任务里”。BERT 之所以成为一个时代转折点并不是因为它只在某一个 benchmark 上强而是因为它把 NLP 任务统一到了一种更优雅的工作流上先学语言再做任务这种范式影响一直延续到今天。

更多文章