1)是什么
迁移学习,简单说就是:
把在一个任务上学到的知识,迁移到另一个相关任务上,少走弯路,快出成果。
在NLP中,这通常意味着:
先在一个大语料库 (比如维基百科、网页文本)上训练一个模型(叫"预训练");
然后把这个"半成品模型"拿去微调(fine-tune),用来做具体任务,比如情感分析、问答、机器翻译等。
🧠 比喻一下:
就像一个学生先读了《十万个为什么》《红楼梦》《三体》......积累了丰富的语言和世界知识(预训练),
然后考试前只复习一道题:"鲁迅写过什么小说?"------他不需要从头学写作,直接调用已有知识答题(微调)。
这就是迁移学习的精髓:先广博,再专精。
2)为什么
为什么NLP要靠迁移学习?
✅ 原因一:数据太少,小任务撑不起大模型
- 你想做个"医疗问诊机器人",但只有几百条病患对话。
- 如果从零开始训练一个深度模型?------数据不足,容易"过拟合"(像背答案,不会举一反三)。
👉 迁移学习:先用百万级通用文本预训练,再用你的医疗数据微调,事半功倍。
✅ 原因二:语言是"共通的"
- "我爱吃苹果" 和 "苹果公司很厉害" 虽然意思不同,但"苹果"这个词的上下文特征是共享的。
- 预训练模型能学到这种词义、句法、语义结构的通用表示。
✅ 原因三:计算资源贵
- 从头训练BERT这样的模型需要上千块GPU跑几天。
- 迁移学习只需几小时微调,就能达到接近的效果。
💡 Tips:
BERT、RoBERTa、T5、GPT系列,都是靠迁移学习火起来的。它们不是"万能神",但它们是"知识仓库"。
3)什么时候用
当你遇到以下情况,果断用迁移学习:
| 场景 | 是否适用 |
|---|---|
| 小样本任务(数据 < 1万条) | ✅ 强烈推荐 |
| 任务与预训练语料相似(如中文→中文) | ✅ 推荐 |
| 需要快速上线原型 | 🚀 快速迭代 |
| 有现成优质预训练模型(如BERT、ChatGLM) | 🚗 直接上车 |
| 多任务学习(比如同时做分类+命名实体识别) | 🔁 可共享底层表示 |
📌 实例:
你做一个"电商评论情感分析",虽然只有5000条评论,但你可以用中文BERT先加载,再微调------效果远超从零训练。
4)什么时候不用
也不是所有情况都适合迁移学习。以下几种慎用或不用:
| 场景 | 原因 |
|---|---|
| 任务完全无关(如"数学公式推理" vs "诗歌生成") | 知识不匹配,迁移无效 |
| 数据量极大(>100万条) | 自己训练可能更优,且可定制更强 |
| 领域极端特殊(如古文、密码学文本) | 预训练模型没学过,反而引入噪声 |
| 对模型解释性要求极高 | 预训练模型是"黑盒",难以追踪决策路径 |
| 计算资源极其有限(连微调都跑不动) | 用轻量级模型或传统方法更合适 |
⚠️ 提醒:
有时候"迁移"会带来"负迁移"(negative transfer)------比如用英文BERT去处理中文,结果适得其反。
5)总结
🎯 "预训练是底子,微调是点睛,选对模型才不费劲。"
概念
1. 迁移学习概念
迁移学习(Transfer Learning) = 用一个任务中学到的知识,帮助另一个相关任务的学习。
在NLP中,最常见的形式是:
- 预训练 + 微调(Pretrain + Fine-tune)
- 先在一个大规模语料上训练模型(比如BERT)
- 再在特定任务上微调(比如情感分析)
🎯 核心思想:
"别从零开始,站在巨人的肩膀上。"
❌ 注意:
两个任务要"相关"才能迁移成功。
比如:用中文新闻训练的模型,去分英文垃圾邮件?------大概率"水土不服"。
2. NLP中的常用预训练模型
根据使用方式不同,预训练模型可以大致分为以下三类:
1)解码器模型
仅使用Transformer解码器,代表模型为GPT(Generative Pre-trained Transformer),其由 OpenAI于2018年6月提出,论文题为《Improving Language Understanding by Generative Pre-Training》。
2)编码器模型
仅使用Transformer 编码器,代表模型为BERT(Bidirectional Encoder Representations from Transformers),由Google于2018年10月提出,论文题为《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》。
3)解码器-编码器模型
同时使用Transformer编码器和解码器,代表模型为T5(Text-to-Text Transfer Transformer),由Google于2019年10月提出,论文题为《Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer》。
3. Hugging Face生态
Hugging Face 是一家致力于推动开源人工智能发展的公司,其目标是简化预训练模型的使用,加速机器学习项目的开发与落地。公司最初因 Transformers 库而广为人知------该库显著降低了使用 BERT、GPT、T5 等先进模型的技术门槛。如今,Hugging Face 已发展为一个功能完备的 AI 开发生态系统,广泛支持自然语言处理(NLP)、计算机视觉(CV)、语音处理以及多模态任务等多个领域。
该生态系统主要由以下两个核心部分构成:
1.Hugging Face Hub
Hugging Face Hub 是一个集中式的开源平台,用于托管、共享和发现模型、数据集及演示应用(Spaces)。

- 官方网站:https://huggingface.co/
- 国内镜像站点(提升访问与下载速度):https://hf-mirror.com/
通过 Hub,开发者可以轻松获取社区贡献或官方发布的资源,并一键集成到自己的项目中。
2.工具链(Libraries)
Hugging Face 提供了一整套模块化且高度协同的 Python 工具库,覆盖从数据准备到模型训练、推理的完整 AI 开发流程。

主要组件包括:
- Datasets
用于高效加载和处理各种格式的数据集(如 CSV、JSON、Parquet 等),支持在线从 Hub 下载或读取本地文件。提供清洗、过滤、映射、分片等预处理功能,输出可直接用于模型训练的结构化数据。 - Tokenizers
负责将原始文本转换为模型可接受的输入格式。支持快速分词、编码为 token ID,并自动生成 attention mask、padding、token type ID 等必要信息。每个分词器通常与特定模型配套,可通过统一接口加载使用。 - Transformers
Hugging Face 最核心的库,提供数百种预训练模型(如 BERT、GPT、T5、ViT 等)的统一接口。用户仅需一行代码 from_pretrained() 即可加载模型,用于推理、微调或进一步研究,极大提升了开发效率与模型复用性。
3.1 管道 Pipeline
🎯 定义:
pipeline 是 Hugging Face 提供的高级接口,让你不用写代码就能运行预训练模型。
| task 名称 | 功能 | 示例 |
|---|---|---|
| text-classification | 文本分类 | 判断"这部电影很烂"是正面还是负面 |
| feature-extraction | 特征提取 | 获取句子的向量表示(用于聚类、检索) |
| fill_mask | 完形填空 | "我喜欢吃[MASK]。" → 预测"苹果" |
| question-answering | 阅读理解 | 问:"谁发明了电话?" → 答:"亚历山大·贝尔" |
| summarization | 文本摘要 | 把长文章压缩成一句话 |
| ner | 命名实体识别 | 识别"张三在北京工作"中的"张三=人名","北京=地名" |
🧪 使用示例(一行代码搞定)
python
from transformers import pipeline
# 创建管道
classifier = pipeline("text-classification", model="bert-base-chinese")
# 直接使用
result = classifier("这家餐厅服务很好!")
print(result)
# 输出:[{'label': 'POSITIVE', 'score': 0.98}]
✅ 优点:
- 不需要懂模型结构;
- 自动加载 tokenizer 和 model;
- 支持多种任务,开箱即用。
❌ 缺点:
- 不适合复杂定制(如微调、多任务);
- 可能不够灵活。
3.2 自动模型 AutoModel类
🎯 定义:
AutoModel 是 Hugging Face 的自动加载机制,根据任务自动选择合适的模型架构。
| 类名 | 用途 | 对应任务 |
|---|---|---|
| AutoModelForSequenceClassification | 分类任务 | text-classification |
| AutoModelForTokenClassification | 序列标注 | ner, pos-tagging |
| AutoModelForQuestionAnswering | 问答 | question-answering |
| AutoModelForMaskedLM | 完形填空 | fill_mask |
| AutoModelForSeq2SeqLM | 生成任务 | summarization, translation |
🧪 使用示例
python
from transformers import AutoTokenizer, AutoModelForSequenceClassification
# 加载模型和 tokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
model = AutoModelForSequenceClassification.from_pretrained("bert-base-chinese", num_labels=2)
# 输入编码
inputs = tokenizer("这家餐厅真差!", return_tensors="pt")
outputs = model(**inputs)
logits = outputs.logits
✅ 优点:
- 不用关心具体模型名称(如 BertForSequenceClassification);
- 自动匹配架构;
- 支持所有 Hugging Face 模型。
⚠️ 注意:
- AutoModel 是基础类,通常配合 AutoModelFor... 使用;
- 如果你要微调,必须用 AutoModelFor...。
3.3 具体模型 SpecificModel
🎯 定义:
这是具体的模型类,比如 BertForSequenceClassification、T5ForConditionalGeneration。
| 模型类 | 用途 | 例子 |
|---|---|---|
| BertForSequenceClassification | BERT 做分类 | 情感分析 |
| BertForTokenClassification | BERT 做 NER | 实体识别 |
| T5ForConditionalGeneration | T5 做生成 | 摘要、翻译 |
| GPT2LMHeadModel | GPT-2 做生成 | 写文章 |
🧪 使用示例
python
from transformers import BertForSequenceClassification
model = BertForSequenceClassification.from_pretrained(
"bert-base-chinese",
num_labels=2
)
✅ 优点:
- 更精确控制;
- 适合研究和调试;
- 可以查看内部结构。
❌ 缺点:
- 要知道模型名字;
- 不够通用。
3.4 Tokenizer的加载与使用
🎯 定义 :
Tokenizer 是把原始文本转换为数字 ID 序列的工具。
| 功能 | 说明 |
|---|---|
| tokenize() | 把文本切分成 token(字/词/subword) |
| convert_tokens_to_ids() | 把 token 转成 ID |
| encode() / encode_plus() | 一键完成分词 + 转 ID + 添加特殊 token |
python
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
# 分词
tokens = tokenizer.tokenize("我喜欢吃苹果")
print(tokens) # ['我', '喜', '欢', '吃', '苹', '果']
# 转 ID
ids = tokenizer.convert_tokens_to_ids(tokens)
print(ids) # [101, 116, 117, 118, 119, 120]
# 一键编码(加 [CLS], [SEP])
encoded = tokenizer("我喜欢吃苹果", return_tensors="pt")
print(encoded["input_ids"]) # tensor([[101, 116, 117, 118, 119, 120, 102]])
✅ 重要提示:
- 每个模型有自己的 tokenizer(BERT ≠ GPT ≠ T5);
- 必须和模型配套使用!
3.5 Datasets库
🎯 定义:
datasets 是 Hugging Face 的数据集库,提供海量标准数据集(如 SQuAD、GLUE、IMDB)。
| 数据集 | 任务 | 语言 |
|---|---|---|
| imdb | 文本分类 | 英文 |
| squad | 问答 | 英文 |
| msra-ner | 命名实体识别 | 中文 |
| lcqmc | 句子对分类 | 中文 |
| cmrc2018 | 中文问答 | 中文 |
🧪 使用示例
python
from datasets import load_dataset
# 加载数据集
dataset = load_dataset("imdb")
# 查看前几条
print(dataset["train"][0])
# 输出:{'text': 'This movie is terrible...', 'label': 0}
✅ 优点:
- 无需手动下载和清洗数据;
- 支持中文和英文;
- 可直接用于训练。
⚠️ 注意:
- 数据格式可能不同,需处理;
- 大部分数据集默认是英文,中文较少但也在增长。
3.6 总结
| 组件 | 作用 | 类比 | 适合场景 |
|---|---|---|---|
| Pipeline | 一键推理 | 自动售货机 | 快速试用、Demo |
| AutoModel | 自动加载模型 | 智能快递员 | 快速开发、微调 |
| SpecificModel | 具体模型类 | 工厂工人 | 研究、调试 |
| Tokenizer | 文本转数字 | 摩斯电码机 | 所有任务必备 |
| Datasets | 数据管理 | 超市货架 | 训练、评估 |
补充点:fasttext工具包