聊聊预训练模型的微调

聊聊,训练,模型,微调 · 浏览次数 : 188

小编点评

**Fine-tuning a Model with the Trainer APITransformers** The `Trainer` class is provided by the `Trainer APITransformers` module, which allows fine-tuning a model on a given dataset. **Preparation** 1. Load the pre-trained model checkpoint. 2. Create a `TrainingArguments` object with the training and evaluation strategies. 3. Define the model architecture (e.g., `AutoModelForSequenceClassification`). 4. Build the training data collator and tokenizer. **Training** 1. Define the training arguments and dataset. 2. Instantiate the `Trainer` object with the model, arguments, and datasets. 3. Call the `train()` method to begin fine-tuning. **Evaluation** 1. Define a `compute_metrics()` function for calculating evaluation metrics. 2. Load the evaluation metrics from the dataset. 3. Use `Trainer.predict()` to get predictions for the validation dataset. 4. Calculate the final accuracy and F1 score. **Output** The `compute_metrics()` function returns a dictionary containing metrics such as accuracy and F1 score. **Example** ```python # Load datasets tokenized_datasets = load_dataset("glue", "mrpc") # Define model and arguments model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) training_args = TrainingArguments("test-trainer", evaluation_strategy="epoch") # Define training and evaluation datasets train_dataset = tokenized_datasets["train"] eval_dataset = tokenized_datasets["validation"] # Create and train the Trainer trainer = Trainer(model, training_args, train_dataset, eval_dataset) # Evaluate the model metrics = trainer.evaluate(eval_dataset) # Print accuracy and F1 score print(f"Accuracy: {metrics['accuracy']}") print(f"F1 Score: {metrics['f1']}") ``` **Note** - `Trainer.train()` runs the model in a multi-GPU environment. - The evaluation strategy is set to "epoch" by default. - The `compute_metrics()` function requires the HuggingFace Evaluate library.

正文

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

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

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。 对于其余所有内容,可以保留默认值,这对于基本的微调应该非常有效。

from transformers import TrainingArguments

training_args = TrainingArguments("test-trainer")

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

from transformers import AutoModelForSequenceClassification

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

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

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() 方法:

trainer.train()

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

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

Evaluation(评估)

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

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。 为了将它们转换为可以与标签进行比较的预测,我们需要在第二个轴上获取最大值的索引:

import numpy as np

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

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

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()函数:

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:

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”和一个新模型 - 否则,我们将继续训练已经训练过的模型。 要启动新的训练运行,我们执行:

trainer.train()

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

与聊聊预训练模型的微调相似的内容:

聊聊预训练模型的微调

翻译自:[Fine-tuning a model with the Trainer API](https://huggingface.co/learn/nlp-course/chapter3/3?fw=pt "Fine-tuning a model with the Trainer API") `T

聊聊Hugging Face

## 概述 HuggingFace是一个开源社区,提供了开源的AI研发框架、工具集、可在线加载的数据集仓库和预训练模型仓库。HuggingFace提出了一套可以依照的标准研发流程,按照该框架实施工程,能够在一定程度上规避开发混乱、开发人员水平不一致的问题,降低了项目实施的风险及项目和研发人员的耦合度

聊聊基于Alink库的随机森林模型

概述 随机森林(Random Forest)是一种集成学习(Ensemble Learning)方法,通过构建多个决策树并汇总其预测结果来完成分类或回归任务。每棵决策树的构建过程中都引入了随机性,包括数据采样和特征选择的随机性。 随机森林的基本原理可以概括如下: 随机抽样训练集:随机森林通过有放回抽

基于ChatGPT用AI实现自然对话

1.概述 ChatGPT是当前自然语言处理领域的重要进展之一,通过预训练和微调的方式,ChatGPT可以生成高质量的文本,可应用于多种场景,如智能客服、聊天机器人、语音助手等。本文将详细介绍ChatGPT的原理、实战演练和流程图,帮助读者更好地理解ChatGPT技术的应用和优势。 2.内容 在当今快

聊聊GLM-4-9B开源模型的微调loss计算

概述 Github官方地址:GLM-4 网上已经有很多关于微调的文章,介绍各种方式下的使用,这里不会赘述。我个人比较关心的是微调时的loss计算逻辑,这点在很多的文章都不会有相关的描述,因为大多数人都是关心如何使用之类的应用层,而不是其具体的底层逻辑,当然咱也说不清太底层的计算。 可了解其它loss

聊聊一个差点被放弃的项目以及近期的开源计划

前言 自从 StarBlog 和 SiteDirectory 之后,我还没写新的关于开源项目的系列,最近又积累了很多想法,正好写一篇博客来总结一下。 关于差点被放弃的项目,就是最近一直在做的单点认证(IdentityServerLite) IdentityServerLite 开发这个项目的起因,是

聊聊 JSON Web Token (JWT) 和 jwcrypto 的使用

哈喽大家好,我是咸鱼。 最近写的一个 Python 项目用到了 jwcrypto 这个库,这个库是专门用来处理 JWT 的,JWT 全称是 JSON Web Token ,JSON 格式的 Token。 今天就来简单入门一下 JWT。 官方介绍:https://jwt.io/introduction

聊聊MySQL是如何处理排序的

在MySQL的查询中常常会用到 order by 和 group by 这两个关键字,它们的相同点是都会对字段进行排序,那查询语句中的排序是如何实现的呢?

聊聊 Linux iowait

哈喽大家好,我是咸鱼。 我们在使用 top 命令来查看 Linux 系统整体 CPU 使用情况的时候,往往看的是下面这一列: %Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 68.0 wa, 0.0 hi, 0.0 si, 0.0 st 其中,man 手册解释 w

聊聊Mybatis框架原理

好久没有写博客了。最近工作中封装了一个类似ORM框架的东西。大概的原理就是将Excel数据初始化到本地sqlite数据库后,通过json配置文件,对数据库的数据做增删改查等操作。 其实大概的思考了下,就是半ORM框架mybatis的逻辑,只是我们自己封装的简陋蛮多。想想有现成的轮子没用,反而是自己写