聊聊预训练模型的微调

news2024/9/22 11:33:22

前言

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)

一旦我们有了模型,我们就可以通过传递迄今为止构建的所有对象来定义 TrainerModeltraining_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)。

最后

感谢你们的阅读和喜欢,我收藏了很多技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你。

因为这个行业不同于其他行业,知识体系实在是过于庞大,知识更新也非常快。作为一个普通人,无法全部学完,所以我们在提升技术的时候,首先需要明确一个目标,然后制定好完整的计划,同时找到好的学习方法,这样才能更快的提升自己。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

五、面试资料

我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下。
在这里插入图片描述

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1944911.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全面解析:如何开发智能的食堂采购管理系统

今天,小编将全面解析如何开发一个智能的食堂采购系统,包括需求分析、系统设计、技术选择、开发过程以及测试和部署等方面。 一、需求分析 在开发智能食堂采购系统之前,首先需要进行详细的需求分析。这一步至关重要,因为它直接决定…

【Java 数据结构】ArrayList类介绍

ArrayList类介绍 初识List接口ArrayList类ArrayList类是什么顺序表的模拟实现初始化增加元素删除元素查找元素修改元素 ArrayList类使用构造方法ArrayList源码阅读常用方法及其注意事项 初识List接口 List 是集合框架中的一个接口, 它的里面包含了一些方法, 例如add(), remove…

【Python系列】详解 open 函数:文件操作的基石

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

OpenAI 发完 GPT-4o,国内大模型行业还有哪些机会?

AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量 全世界范围内的很多人,我也不例外,想象中的GPT5发布时间应该是24年中,但实际上OpenAI在这个时间点最强的模型是GPT4o&#xff0…

利用一维数组计算今天是今年的第几天

分析: 在一维数组里初始化12个月份,在进行判断是不是闰年,是闰年就把数组的二月的下标改为29,否则不变就按照平年计算,最后把想要计算的月份减1累加到sum里,在进行计算该月份的天也要累加。例如&#xff1a…

Python:对常见报错导致的崩溃的处理

Python的注释: mac用cmd/即可 # 注释内容 代码正常运行会报以0退出,如果是1,则表示代码崩溃 age int(input(Age: )) print(age) 如果输入非数字,程序会崩溃,也就是破坏了程序,终止运行 解决方案&#xf…

FPGA-ROM IP核的使用(2)

前言 接着昨天的进行一个小的实验验证ROM IP核。 实验效果 读取上一期生成的IP核中的数据,并将其显示在数码管上。 具体流程 ROM IP核存放数据0~255,之后每隔0.2s,从0的地址开始读数据,并显示在数码管上;接着先后…

力扣 快慢指针

1 环形链表 141. 环形链表 - 力扣(LeetCode) 定义两个指针,一快一慢。慢指针每次只移动一步,而快指针每次移动两步。初始时,慢指针和快指针都在位置 head,这样一来,如果在移动的过程中&#x…

Flink入门(更新中)

目录 一、Flink 1.1 基本概念 1.1.1 flink简介 1.2 flink编程模版 1.3 常用概念 1.2.1 datastream 1.2.2 算子、Task 1.2.3 多流操作 1.2.6 时间语义 二、Flink编程实战(Java) 2.1 wordcount 一、Flink 1.1 基本概念 1.1.1 flink简介 1.图片介绍 性能&#xff1a…

Python 爬虫(爬取百度翻译的数据)

前言 要保证爬虫的合法性,可以从以下几个方面着手: 遵守网站的使用条款和服务协议:在爬取数据之前,仔细阅读目标网站的相关规定。许多网站会在其 robots.txt 文件中明确说明哪些部分可以爬取,哪些不可以。 例如&…

Java语言程序设计基础篇_编程练习题**15.19 (游戏:手眼协调)

**15.19 (游戏:手眼协调) 请编写一个程序,显示一个半径为10像素的实心圆,该圆放置在面板上的随机位置,并填充随机的顔色,如图15-29b所示。单击这个圆时,它会消失,然后在另一个随机的位置显示新的随机颜色的…

PySimpleGUI的安装、使用介绍

PySimpleGUI的安装等介绍 如果直接使用pip命令是无法下载免费版的,通过设置的python Interpreter也不可以下载到5.0.0之前的版本了。 现在已经无法通过pycharm直接获取到PySimpleGUI的免费(无需登录)版,不过听说可以登入官网然后进…

OpenTeleVision复现及机器人迁移

相关信息 标题 Open-TeleVision: Teleoperation with Immersive Active Visual Feedback作者 Xuxin Cheng1 Jialong Li1 Shiqi Yang1 Ge Yang2 Xiaolong Wang1 UC San Diego1 MIT2主页 https://robot-tv.github.io/链接 https://robot-tv.github.io/resources/television.pdf代…

JavaWeb连接(JDBC)数据库实现增删改查

JavaWeb连接(JDBC)数据库实现增删改查 1、数据库结构 (1)、创建数据库(source_db) (2)、创建数据表(tb_source),结构如下 字段名说明字段类型长度备注id编号int主键,自增,增量为 1name名称v…

通过Docker安装KingbaseES V8并激活开发License

人大金仓最大连接数的修改跟pgsql差不多,就是修改kingbase.conf文件,修改里面的max_connections 10 ,有时候会发现修改后不成功的问题,最直接的表现就是在修改后重启服务,控制台还是提示重置为10,最大的原…

区块链浏览器开发指南分享

01 概括 区块链浏览器是联盟链上的一种数据可视化工具,用户可以通过web页面,直接在浏览器上查看联盟链的节点、区块、交易信息和子链信息、标识使用信息等,用以验证交易等区块链常用操作。 02功能模块 区块链网络概览 区块链网络概览显示…

leetcode日记(47)螺旋矩阵Ⅱ

这题思路不难,就是找规律太难了。 我首先的思路是一行一行来,根据规律填入下一行的数组,第i行是由前i个数字(n-2*i)个增序数列后i个数字组成,后来觉得太难找规律了就换了一种思路。 思路大致是先计算出需…

【音视频之SDL2】Ubuntu编译配置SDL2环境

文章目录 前言SDL2 是什么编译SDL2下载必备的包下载SDL2.30.5源码 编写CMake模板项目测试代码 总结 前言 SDL2(Simple DirectMedia Layer 2)是一个用于开发跨平台多媒体应用程序的广泛使用的库,特别是在游戏开发中。它为音频、键盘、鼠标、操…

pageoffice常见问题处理

pageoffice是由卓正软件公司开发的一套在线编辑office的插件。要在自己的系统中使用,需要进行集成开发,把pageoffice嵌入到自己的系统中。以下记录在使用过程中常见的问题和解决方法: 1.PageOffice对客户端的要求 office 不能是家庭版&#x…

【区块链+绿色低碳】基于区块链的碳排放管理系统 | FISCO BCOS应用案例

目前业内的碳排放核查方式主要依靠于第三方人工核查、手动填报数据,然后由具备有认证资质的机构进行核验 盖章。但在此过程中存在数据造假的情况,给碳排放量核算的准确性、可靠性带来挑战。 中科易云采用国产开源联盟链 FISCO BCOS,推出基于…