简介
什么是预训练,预训练能做什么呢?我们通过图片的预训练来介绍预训练在干什么事情,之后再慢慢深入到 BERT 这个预训练模型中去。
博客配套视频链接: https://space.bilibili.com/383551518 配套 github 链接:https://github.com/nickchen121/Pre-training-language-model 配套博客链接:https://www.cnblogs.com/nickchen121/p/15105048.html
一、预训练的定义
预训练是指:在大规模数据集(如 ImageNet)上预先训练一个深度学习模型(通常称为"预训练模型"),获得模型参数后,再将这些参数(尤其是浅层参数)迁移到下游具体任务中进行微调的过程。
【补充】 从机器学习的角度看,预训练本质上是一种迁移学习(Transfer Learning)技术,旨在将在源任务(Source Task)上学到的知识迁移到目标任务(Target Task)上,解决目标任务数据不足的问题。
二、为什么需要预训练?
2.1 深度学习的特点
深度学习的一个显著特点是:需要大数据支持。这与传统的机器学习(如支持向量机、决策树、线性回归等)形成对比——机器学习方法偏数学统计,对数据量要求相对较低。
【补充】 传统机器学习方法的代表著作如李航老师的《统计学习方法》,侧重于数学推导和统计建模;而深度学习则依赖于大规模数据和算力支撑。
2.2 现实问题
实际项目中,很多任务往往面临小数据困境:
例如:给你 100 张猫和狗的图片,要求分类出图片中是猫还是狗。
- 如果用深度学习从头训练:100 张图片太少了,1000 张或 1 万张才勉强可行
- 如果从头训练 100 层卷积神经网络:几乎不可能实现,或精度极低
2.3 预训练的解决思路
原视频例子:有研究者做了 10 万张鹅和鸭的图片分类任务,获得模型 A。
解决方案是跨任务迁移: - 任务 A(源任务):10 万张鹅鸭图片 → 已训练好模型 A - 任务 B(目标任务):100 张猫狗图片 → 需要模型 B
核心观察:卷积神经网络的浅层特征是通用的(如横竖撇捺等基础纹理)。
【补充】 这个现象称为特征可迁移性(Feature Transferability)。研究表明,神经网络的底层倾向于学习底层特征(如边缘、纹理),这些特征在视觉任务是通用的;而高层特征则更任务相关。
三、预训练的核心思想(难点重点)
3.1 迁移浅层参数
预训练的核心思想是:复用在大数据任务上训练好的浅层参数,结合小数据任务微调深层参数。
以卷积神经网络为例: - 浅层(底层):学习通用特征(横竖撇捺、边缘、纹理)→ 可跨任务复用 - 深层(顶层):学习任务相关特征 → 需要用目标任务数据训练
3.2 两种实现方式:冻结(Freezing)与微调(Fine-tuning)
| 方式 | 浅层参数 | 说明 |
|---|---|---|
| 冻结(Freezing) | 固定不变 | 完全复用预训练参数,不参与反向传播更新 |
| 微调(Fine-tuning) | 随训练更新 | 在目标任务上继续训练,浅层参数也会适应目标任务 |
【补充】 实际应用中,微调更为常用。因为即使浅层特征是"通用的",目标任务的数据分布与源任务仍可能有差异,微调可以让浅层参数在保留通用特征的同时,也适应目标任务的特点。
原视频原话:"微调的话,我是会一直都会变的。冻结就是浅层参数你永远都不变。"
3.3 预训练的局限性
预训练有一个重要前提:任务 A 与任务 B 必须高度相似。
例如:用鹅鸭分类任务训练的模型,可以迁移到猫狗分类任务(都是二分类、都是图像),但: - 很难迁移到命名实体识别(NLP 任务) - 很难迁移到视频描述(视频 + 文本任务)
原视频原话:"模型 A 是在分类鹅和鸭,任务 B 是分类猫和狗,这两个任务极其相似。BERT 包括 Transformer 强大在哪里呢?强大在把这个局限性给解决了。"
【补充】 这正是 BERT 和 Transformer 出现的背景——它们通过更好的预训练任务设计(如语言模型)和更通用的架构(Transformer),突破了视觉预训练的任务相似性限制。
四、预训练怎么用?
4.1 代码层面
原视频提到使用 transformers 库加载预训练好的 BERT 模型:
from transformers import BertModel, BertTokenizer # 补充:标准用法
【补充】 当前主流做法是使用 Hugging Face 的 transformers 库,其提供了大量预训练模型(如 BERT、GPT、T 5 等),只需几行代码即可加载并微调:
from transformers import AutoModelForSequenceClassification, AutoTokenizer
model = AutoModelForSequenceClassification.from_pretrained("bert-base-chinese")
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
4.2 应用场景
预训练模型可广泛应用于: - 文本分类 - 命名实体识别 - 问答系统 - 机器翻译 - 文本生成
五、总结
原视频原话:"预训练是什么?就是任务 A 和任务 B 极其相似,通过大数据训练出模型 A,得到模型 B,有两种方式:一是微调,二是冻结。"
【补充】 从更宏观的视角看,预训练范式的出现标志着深度学习从"从零训练(Train from Scratch)"走向"预训练 + 微调"的新范式。这一范式大幅降低了下游任务的数据需求和训练成本,是现代 NLP(乃至整个深度学习)最重要的突破之一。
六、面试题
基础概念题
- 请用自己的话解释什么是预训练?为什么需要预训练?
- 预训练和迁移学习是什么关系?
- 深度学习与传统机器学习在数据需求上有什么区别?
技术原理题
- 为什么 CNN 的浅层参数可以跨任务迁移?请从特征抽象层次解释。
- 请解释"冻结"和"微调"的区别,什么时候该用哪种方式?
- 预训练存在哪些局限性?如何克服?
深入理解题
- 为什么说预训练思想最早来源于计算机视觉而非 NLP?
- 预训练模型在 NLP 的突破(如 BERT)相比 CV 领域的预训练有哪些不同?为什么?
- 如果目标任务数据非常少(如只有 10 条),你如何设计预训练策略?
开放思考题
- 预训练技术还有哪些潜在的应用场景?它还能解决什么问题?
- 你认为未来预训练技术可能往哪些方向发展?