6. 自然语言处理NLP - 迁移学习

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)。

通过 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工具包

相关推荐
juxieyiyi87818 小时前
CDN与PCDN在边缘计算中的分工
人工智能·边缘计算·cdn·pcdn·平台搭建·互联网项目·pcdn平台搭建双收益
fantasy_arch18 小时前
Transformer vs Stable Diffusion vs LLM模型对比
深度学习·stable diffusion·transformer
peixiuhui18 小时前
OpenPLC与RK3576边缘计算网关中结合应用的技术案例与分析
人工智能·边缘计算·rk3588·rk3568·openplc·rk3576·g8701
vyuvyucd18 小时前
Python库使用全攻略
人工智能
十三画者18 小时前
【文献分享】SpatialZ弥合从平面空间转录组学到三维细胞图谱之间的维度差距
人工智能·数据挖掘·数据分析·数据可视化
一条咸鱼_SaltyFish19 小时前
[Day13] 微服务架构下的共享基础库设计:contract-common 模块实践
开发语言·人工智能·微服务·云原生·架构·ai编程
童欧巴19 小时前
DeepSeek V4,定档春节
人工智能·aigc
爱学习的张大19 小时前
深度学习中稀疏专家模型研究综述 A REVIEW OF SPARSE EXPERT MODELS IN DEEP LEARNING
人工智能·深度学习
爱打代码的小林19 小时前
CNN 卷积神经网络 (MNIST 手写数字数据集的分类)
人工智能·分类·cnn