当前位置: 首页 > article >正文

自然语言处理NLP入门 -- 第七节预训练语言模型

1 什么是预训练模型?

在自然语言处理(NLP)里,训练一个好模型通常需要很多数据和计算资源。为了解决这个难题,就出现了“预训练模型”。

  • 预训练模型 是指我们先在海量文本(比如网络上爬到的大量文章、对话等)上训练出一个“懂语言”的大模型。它已经学会了如何理解和使用语言的大部分规律。
  • 之后,你只需要在自己的“小数据”上稍微训练一下(叫“微调”),就能让这个大模型学会完成具体的任务,比如情感分析、文本分类等。

打个比方:

  • 预训练模型就好比一个学生先在“全国语文教材”上学习了超多词汇和语法。
  • 现在,你只需要教他一些更专业的知识,他就能快速上手,不用从零开始。

2 代表性的预训练模型:BERT、GPT、T5

说到预训练模型,就不能不提到三个“明星选手”:

  1. BERT

    • 最擅长“理解”文本,因为它可以同时看一个词左右两边的内容,得到上下文信息。
    • 常常用于情感分析、阅读理解、问答、文本分类等。
  2. GPT

    • 最擅长“生成”文本,因为它擅长猜测“下一个词”应该是什么。
    • 对话机器人、文本续写、智能写作等场景,会经常用到它。
  3. T5

    • 强调“把各种NLP任务都当成文本输入和文本输出”的形式。
    • 可以做翻译、摘要、分类、问答等等,一种方法适合很多任务。

3 使用 Hugging Face 加载 BERT 进行文本分类

现在,让我们用一个非常具体的小例子,来看看如何利用Hugging Face这个流行的Python库,去调用“预训练好的BERT模型”做文本分类,比如判断一句评论是“正面”还是“负面”。

3.1 环境准备
  1. 安装 transformers
    pip install transformers
    
  2. 安装 PyTorch(或 TensorFlow),我们这里用 PyTorch:
    pip install torch
    
3.2 推理阶段:从文本到结果

下面的代码会演示:

  1. 加载分词器模型
  2. 把一句话变成“模型能看懂的数字”
  3. 得到模型对这句话的情感判断结果
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch

# 1. DistilBERT (已经在SST-2情感分析上微调好)
model_name = "distilbert-base-uncased-finetuned-sst-2-english"

# 2. 加载分词器和模型
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)

# 3. 预测示例
text = "I really love this movie. The acting is wonderful!"
inputs = tokenizer(text, return_tensors="pt")

with torch.no_grad():
    outputs = model(**inputs)

# 4. 返回分类结果
logits = outputs.logits
predicted_class_id = torch.argmax(logits, dim=1).item()
print("Predicted Class ID:", predicted_class_id)

示例输出:

Predicted Class ID: 1

下面分别解释一下每一步:

  1. 加载分词器

    • 文字本质上是“字符串”,而模型只能理解数字。
    • 分词器会把你的句子,比如“love this movie”,变成 [ 101, 2293, 2023, 3185, ... ] 这样的数字列表,然后给出必要的格式信息(attention_mask等)。
  2. 加载模型

    • 这里的模型是已经训练好的“DistilBERT情感分析模型”版本,能直接判断文本的情感倾向。
    • 你不需要自己写BERT网络结构或训练逻辑,Hugging Face直接帮你搞定了。
  3. 输入文本并转换成PyTorch需要的张量

    • inputs 是一个字典,里面包含了 input_idsattention_mask 等,是模型需要的输入格式。
  4. 前向传播(Forward Pass)

    • 就是把输入数据喂给模型,模型内部做一系列计算后,输出结果(outputs)。
    • 因为我们只是想要预测结果,不需要计算梯度,所以用 with torch.no_grad(): 能节省内存和加速。
  5. 得到预测分类

    • 最后,把模型的输出分数 (logits) 里最大的那一个类别当作预测结果。
    • 不同模型会给出不同类别数。

3.3 如果要训练或微调模型?

上面的代码只做了“推理”(预测结果)。要想“训练”或“微调(Fine-tuning)”这个模型,就需要多几个步骤:

  1. 准备好训练数据:比如有几千条电影评论,每条都打上“正面/负面”标签。
  2. 用 DataLoader 逐批读取:如果你有1万条数据,不可能一次全塞进模型里,那会占用很多内存。
    • PyTorch 提供 DataLoader 帮你分批次读数据,比如每次读32条。
  3. 前向传播 + 计算损失(Loss)
    • 跟推理一样会得到 outputs,但这回你要跟真实标签比对来算损失值,看模型猜的对不对。
  4. 反向传播 + 更新模型参数
    • 通过 optimizer.step() 等操作,根据损失值来调整模型的权重,让它下次预测更准。
    • 如此循环多次,直到训练结束。

总结一下:

  • “推理”只需要前向传播,看结果就好,不用算梯度;
  • “训练”还要加上计算损失值和反向传播的步骤。

4 为什么要用预训练模型?应用场景是啥?

  • 速度更快:不用从头把模型训练到能理解语言的地步,直接用已经“见多识广”的模型做少量微调就能用。
  • 效果更好:模型看过的“大量文本”会帮它学到很多词汇和语法知识,对小数据集很友好。
  • 适用面广:几乎任何涉及文本的场景都能用上,比如客服聊天机器人舆情分析文本审查问答系统等等。

5 课后练习与思考

  1. 自己尝试微调

    • 找到 IMDb 的电影评论数据,练习用 BERT 做正面/负面分类。
    • 调整学习率、批大小等超参数,看看对准确率有多大影响。
  2. 比较 BERT 和 GPT

    • GPT更擅长“生成文本”,BERT更擅长“理解文本”。如果你只想做分类,BERT常常更好;如果你想写文章、做对话,GPT是更好选手。
    • 不妨亲自试试,感受一下它们的差异。
  3. 试试 T5

    • 把分类任务也当成“文本生成”:输入:“This is an awesome movie.”,让模型输出:“positive”。看看 T5 表现如何。

总结

在这章里,我们了解了预训练模型的基本概念,认识了BERT、GPT、T5这三位“明星”;然后用一个小例子实际演示了如何用Hugging Face的工具快速完成“加载分词器—>转成张量—>前向传播—>预测结果”这四步。我们还提到,如果想“训练”或“微调”,需要多加“计算损失”和“反向传播”这两个步骤。

掌握了这些,你就能灵活运用现有的大模型来完成各种NLP任务,再也不用从零写代码、找海量数据、苦哈哈地训练啦!这也是现在NLP最常见、最高效的做法。祝你学习愉快!


http://www.kler.cn/a/567457.html

相关文章:

  • 解决Docker Desktop启动后Docker Engine stopped问题
  • 【QGIS二次开发】
  • 9、HTTP/2与HTTP/1.1的区别?【高频】
  • Mysql100道高频面试题
  • BKA-CNN基于黑翅鸢算法优化卷积神经网络的数据多特征分类预测Matlab
  • Phpstudy中的MySQL无法正常启动或启动后自动暂停,以及sqlilab环境搭建出现的问题解决方法
  • Word 插入图片会到文字底下解决方案
  • 紧致性准则(Compactness Criterion)与维数灾难(Curse of Dimensionality)——模式识别中对特征的要求
  • Express + MongoDB 实现文件上传
  • grok3设计一个自动驾驶VLM模型
  • 第十四站:生成对抗网络(GAN)
  • 基于SpringBoot的美妆购物网站系统设计与实现现(源码+SQL脚本+LW+部署讲解等)
  • Spark 介绍
  • final 关键字在不同上下文中的用法及其名称
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_open_file
  • 性能测试监控工具jmeter+grafana
  • ave-form.vue 组件中 如何将产品名称发送给后端 ?
  • Unity插件-Mirror使用方法(二)组件介绍
  • 【学术会议论文投稿】Spring Boot实战:零基础打造你的Web应用新纪元
  • C++之 “” 用法(总结)