首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >聊聊预训练模型的微调

聊聊预训练模型的微调

作者头像
Ryan_OVO
发布于 2023-10-19 11:56:15
发布于 2023-10-19 11:56:15
70000
代码可运行
举报
文章被收录于专栏:程序随笔程序随笔
运行总次数:0
代码可运行

翻译自:Fine-tuning a model with the Trainer API

Transformers 提供了一个 Trainer 类,处理微调在数据集上提供的任何预训练模型。 完成所有数据预处理工作后,只需执行几个步骤即可定义 Trainer。 最困难的部分可能是准备运行 Trainer.train() 的环境,因为它在 CPU 上运行速度非常慢。 如果没有设置 GPU,可以在 Google Colab 上访问免费的 GPU 或 TPU。 下面的代码示例假设已经完成了数据预处理的操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from datasets import load_dataset
from transformers import AutoTokenizer, DataCollatorWithPadding

raw_datasets = load_dataset("glue", "mrpc")
checkpoint = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)

def tokenize_function(example):
    return tokenizer(example["sentence1"], example["sentence2"], truncation=True)

tokenized_datasets = raw_datasets.map(tokenize_function, batched=True)
data_collator = DataCollatorWithPadding(tokenizer=tokenizer)

map函数与DataCollatorWithPadding函数请查阅:Processing the data

Traning(训练)

定义 Trainer 之前的第一步是定义一个 TrainingArguments 类,该类将包含 Trainer 用于训练和评估的所有超参数。 必须提供的唯一参数是保存训练模型的目录以及checkpoint。 对于其余所有内容,可以保留默认值,这对于基本的微调应该非常有效。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from transformers import TrainingArguments

training_args = TrainingArguments("test-trainer")

第二步是定义我们的模型。 使用 AutoModelForSequenceClassification 类,它带有两个标签:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from transformers import AutoModelForSequenceClassification

model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2)

一旦我们有了模型,我们就可以通过传递迄今为止构建的所有对象来定义 Trainer---Modeltraining_argstrainingvalidation datasetsdata_collatortokenizer

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from transformers import Trainer

trainer = Trainer(
    model,
    training_args,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["validation"],
    data_collator=data_collator,
    tokenizer=tokenizer,
)

要在数据集上微调模型,我们只需调用训练器的 train() 方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
trainer.train()

这将开始微调(在 GPU 上应该需要几分钟)并每 500 步报告一次训练损失。 但是,它不会告诉你模型的表现有多好(或多差)。 这是因为:

  1. 我们没有告诉训练器在训练期间通过将evaluation_strategy设置为“steps”(评估每个eval_steps)或“epoch”(在每个epoch结束时评估)来进行评估。
  2. 我们没有为训练器提供compute_metrics()函数来在所述评估期间计算指标(否则评估只会打印损失,这不是一个非常直观的数字)。

Evaluation(评估)

让我们看看如何构建一个有用的compute_metrics()函数并在下次训练时使用它。 该函数必须采用 EvalPrediction 对象(这是一个带有预测字段和 label_ids 字段的命名元组),并将返回一个将字符串映射到浮点数的字典(字符串是返回的指标的名称,浮点数是它们的值)。 为了从我们的模型中获得一些预测,我们可以使用 Trainer.predict() 方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
predictions = trainer.predict(tokenized_datasets["validation"])
print(predictions.predictions.shape, predictions.label_ids.shape)

## 输出
(408, 2) (408,)

Predict() 方法的输出是另一个具有三个字段的命名元组:预测、label_ids 和指标。 指标字段将仅包含传递的数据集的损失,以及一些时间指标(预测所需的总时间和平均时间)。 一旦我们完成了compute_metrics()函数并将其传递给Trainer,该字段还将包含compute_metrics()返回的指标。 结果所展示的预测是一个形状为 408 x 2 的二维数组(408 是我们使用的数据集中的元素数量)。 这些是我们传递给predict()的数据集每个元素的logits。 为了将它们转换为可以与标签进行比较的预测,我们需要在第二个轴上获取最大值的索引:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np

preds = np.argmax(predictions.predictions, axis=-1)

我们现在可以将这些预测与标签进行比较。 为了构建我们的compute_metric()函数,我们将依赖于HuggingFace Evaluate库中的指标。 我们可以像加载数据集一样轻松地加载与 MRPC 数据集关联的指标,这次使用evaluate.load() 函数。 返回的对象有一个compute()方法,我们可以用它来进行度量计算:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import evaluate

metric = evaluate.load("glue", "mrpc")
metric.compute(predictions=preds, references=predictions.label_ids)

## 输出:
{'accuracy': 0.8578431372549019, 'f1': 0.8996539792387542}

获得的确切结果可能会有所不同,因为Model Head部分的随机初始化可能会改变它实现的指标。 在这里,我们可以看到我们的模型在验证集上的准确率为 85.78%,F1 得分为 89.97。 这些是用于评估 GLUE 基准的 MRPC 数据集结果的两个指标。 BERT 论文中的表格报告了基本模型的 F1 分数为 88.9,这是非case的模型,而我们目前使用的是case的模型,这解释了更好的结果。 将所有内容包装在一起,我们得到了compute_metrics()函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def compute_metrics(eval_preds):
    metric = evaluate.load("glue", "mrpc")
    logits, labels = eval_preds
    predictions = np.argmax(logits, axis=-1)
    return metric.compute(predictions=predictions, references=labels)

为了查看它在每个epoch结束时报告指标的实际使用情况,下面是我们如何使用这个compute_metrics()函数定义一个新的Trainer:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
training_args = TrainingArguments("test-trainer", evaluation_strategy="epoch")
model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2)

trainer = Trainer(
    model,
    training_args,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["validation"],
    data_collator=data_collator,
    tokenizer=tokenizer,
    compute_metrics=compute_metrics,
)

请注意,我们创建了一个新的 TrainingArguments,其评估策略设置为“epoch”和一个新模型 - 否则,我们将继续训练已经训练过的模型。 要启动新的训练运行,我们执行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
trainer.train()

这次,除了训练损失之外,它将在每个时期结束时报告验证损失和指标。 同样,由于模型的Model Head初始化,你达到的确切准确度/F1 分数可能与我们发现的有所不同,但它应该处于相同的范围内。 Trainer 将在多个 GPU 或 TPU 上开箱即用,并提供许多选项,例如混合精度训练(在训练参数中使用 fp16 = True)。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-09-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【大模型学习 | BERT 量化实战(1)】
👉 这种量化方式虽然简单,但存在一个明显的问题,这是方式是 HuggingFace 基于 bitsandbytes 库 实现的轻量量化方式,背后用的是:
九年义务漏网鲨鱼
2025/06/27
7000
Huggingface🤗NLP笔记8:使用PyTorch来微调模型「初级教程完结撒花ヽ(°▽°)ノ」
在Huggingface官方教程里提到,在使用pytorch的dataloader之前,我们需要做一些事情:
beyondGuo
2021/10/20
2.1K0
Huggingface🤗NLP笔记7:使用Trainer API来微调模型
不得不说,这个Huggingface很贴心,这里的warning写的很清楚。这里我们使用的是带ForSequenceClassification这个Head的模型,但是我们的bert-baed-cased虽然它本身也有自身的Head,但跟我们这里的二分类任务不匹配,所以可以看到,它的Head被移除了,使用了一个随机初始化的ForSequenceClassificationHead。
beyondGuo
2021/10/08
8.9K0
transformers快速上手:实体识别和词性标注
大家好,我是多多,最近在学习整理预训练模型和transformers。这是本系列的第3篇。文字和代码较多,建议点赞、在看、收藏食用。
AI部落联盟
2021/05/11
3K0
transformers快速上手:实体识别和词性标注
Huggingface🤗NLP笔记6:数据集预处理,使用dynamic padding构造batch
从这一集,我们就正式开始使用Transformer来训练模型了。今天的部分是关于数据集预处理。
beyondGuo
2021/10/08
5.2K2
使用LORA微调RoBERTa
模型微调是指在一个已经训练好的模型的基础上,针对特定任务或者特定数据集进行再次训练以提高性能的过程。微调可以在使其适应特定任务时产生显着的结果。
deephub
2024/02/21
5870
使用LORA微调RoBERTa
Transformer 模型实用介绍:BERT
在 NLP 中,Transformer 模型架构是一场革命,极大地增强了理解和生成文本信息的能力。
数据科学工厂
2023/08/10
6400
Transformer 模型实用介绍:BERT
Transformers 4.37 中文文档(一)
下表表示库中对这些模型的当前支持,它们是否有 Python 分词器(称为“slow”)。由🤗 Tokenizers 库支持的“fast”分词器,它们是否在 Jax(通过 Flax)、PyTorch 和/或 TensorFlow 中有支持。
ApacheCN_飞龙
2024/06/26
1.6K0
Transformers 4.37 中文文档(一)
从LLaMA-Factory项目认识微调
LLaMA-Factory是一个在github上开源的,专为大模型训练设计的平台。项目提供中文说明,可以参考官方文档:https://github.com/hiyouga/LLaMA-Factory/blob/main/README_zh.md
HUC思梦
2024/04/18
9.1K1
从LLaMA-Factory项目认识微调
【AI大模型】Transformers大模型库(十一):Trainer训练类
这里的Transformers指的是huggingface开发的大模型库,为huggingface上数以万计的预训练大模型提供预测、训练等服务。
LDG_AGI
2024/08/13
1.4K0
Transformers 4.37 中文文档(二)
除了🤗 Transformers 的 notebooks 之外,还有示例脚本演示如何使用PyTorch、TensorFlow或JAX/Flax训练模型的方法。
ApacheCN_飞龙
2024/06/26
9400
Transformers 4.37 中文文档(二)
训练日志刷屏使我痛苦,我开发了VLog
例如,通过callback嵌入到lightgbm/catboost/transformers/ultralytics,乃至keras库的训练代码流程中~
lyhue1991
2023/11/13
3440
训练日志刷屏使我痛苦,我开发了VLog
Transformers 4.37 中文文档(四)
www.youtube-nocookie.com/embed/KWwzcmG98Ds
ApacheCN_飞龙
2024/06/26
5280
Transformers 4.37 中文文档(四)
基于腾讯云HAI + DeepSeek 开发企业知识库
自从年后大家都开始关注deepseek,我们公司年后特别忙,上面的老板及其他部门都提出了需求。 之前各个部门对AI模型都不了解,经过网上铺天盖地的新闻后,大家都知道AI比较厉害,所以都提出来部门的想法看如何把deepseek引入到部门中,原因大家想必都知道,就是提高大家的工作效率,节省人力。
七条猫
2025/03/08
4172
基于腾讯云HAI + DeepSeek 开发企业知识库
探秘Transformers:用Hugging Face预训练模型实现命名实体识别!
命名实体识别(NER)是自然语言处理中的一项关键任务,旨在从文本中识别并提取出具有特定意义的实体,如人名、地名、组织机构名等。通过NER,计算机可以更好地理解文本,帮助我们从海量文本数据中快速获取有用信息,是许多NLP应用的基础,如信息提取、问答系统等。
Tom2Code
2024/03/02
1.7K0
探秘Transformers:用Hugging Face预训练模型实现命名实体识别!
Trapper: Transformer模型都在此!
Trapper(Transformers wrapper)是一个NLP库,旨在使基于下游任务的transformer模型的训练更加容易。该库提供transformer模型实现和训练机制,它为使用transformer模型时遇到的常见任务定义了带有基类的抽象。此外,它还提供了依赖注入机制,并允许通过配置文件定义训练和评估实验。通过这种方式,可以使用不同的模型、优化器等进行实验,只需在配置文件中更改它们的值,而无需编写任何新代码或更改现有代码。这些特性促进了代码重用,减少了代码.
炼丹笔记
2021/12/02
4750
Trapper: Transformer模型都在此!
科大讯飞 中文成语填空挑战赛baseline
中国文化博大精深源远流长,其中成语更是中国文化的精华。成语大多由四个字组成,一般都有典故或出处。有些成语从字面上不难理解,如“小题大做”、“后来居上”等。有些成语必须知道来源或典故才能懂得意思,如“朝三暮四”、“杯弓蛇影”等。
致Great
2021/11/24
5800
科大讯飞 中文成语填空挑战赛baseline
Transformers 4.37 中文文档(三)
www.youtube-nocookie.com/embed/ajPx5LwJD-I
ApacheCN_飞龙
2024/06/26
3240
使用 Transformers 在你自己的数据集上训练文本分类模型
最近实在是有点忙,没啥时间写博客了。趁着周末水一文,把最近用 huggingface transformers 训练文本分类模型时遇到的一个小问题说下。
Alan Lee
2021/12/07
2.6K0
AI新手村:Huggingface
Hugging Face 最早作为 NLP 模型的社区中心,成立于 2016 年,但随着 LLM 的大火,主流的 LLM 模型的预训练模型和相关工具都可以在这个平台上找到,此外,上面也有很多计算机视觉(Computer Vision)和音频相关的模型。
dsy
2025/04/11
2030
AI新手村:Huggingface
推荐阅读
相关推荐
【大模型学习 | BERT 量化实战(1)】
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验