transformers训练(NLP)阅读理解(多项选择)
简介
在阅读理解任务中,有一种通过多项选择其中一个答案来训练机器的阅读理解。比如:给定一个或多个文档h,以及一个问题S和对应的多个答案候选,输出问题S的答案E,E是答案候选中的某一个选项。
这样的目的就是通过文档,问题,多个答案选其中一个,就是让机器更好文档中的含义,提高机器的阅读理解。
是不是感觉似陈相识,这不就是语文考试的必考题,阅读理解吗。。。。。。。。。。。。。。
给机器训练的数据集示例
如:
- Context:老师把一个大玻璃瓶子带到学校,瓶子里装着满满的石头、玻璃碎片和沙子。之后,老师请学生把瓶子里的东西都倒出来,然后再装进去,先从沙子开始。每个学生都试了试,最后都发现没有足够的空间装所有的石头。老师指导学生重新装这个瓶子。这次,先从石头开始,最后再装沙子。石头装进去后,沙子就沉积在石头的周围,最后,所有东西都装进瓶子里了。老师说:“如果我们先从小的东西开始,把小东西装进去之后,大的石头就放不进去了。生活也是如此,如果你的生活先被不重要的事挤满了,那你就无法再装进更大、更重要的事了。”
- Question:正确的装法是,先装?
- Choices / Candidates:[“小东西”,“大东西”,“轻的东西”,“软的东西” ]
- Answer:大东西
技术实现思路
多项选择任务,技术实现,这里难点涉及数据处理和训练与推理。其实就是将数据处理好,喂给模型进行训练与推理,让其理解文本。
这里采用格式是:
[CLS] 文本内容 [SEP] 问题 答案 [SEP]
这里涉及在多个候选答案中只取一个答案,让大模型理解文本。所以需要将文本、问题、答案,拆分为4条数据喂给大模型,在告知它正确答案,这样处理大模型才能读懂数据,也是它读取数据逻辑。
代码部分
# 导入包
import evaluate
import numpy as np
from datasets import DatasetDict
from transformers import AutoTokenizer, AutoModelForMultipleChoice, TrainingArguments, Trainer# 读取数据集
c3 = DatasetDict.load_from_disk("./c3/")# 打印训练的前条数据开下接口
examples=c3["train"][:5]print(examples)# 将数据处理为训练和测试
c3.pop("test")# 加载分词器,模型已下载到本地
tokenizer = AutoTokenizer.from_pretrained("chinese-macbert-large")# 对数据集进行处理,验证数据处理阶段
question_choice = []
labels = []
for idx in range(len(examples["context"])):ctx = "\n".join(examples["context"][idx])question = examples["question"][idx]choices = examples["choice"][idx]for choice in choices:context.append(ctx)question_choice.append(question + " " + choice)if len(choices) < 4:for _ in range(4 - len(choices)):context.append(ctx)question_choice.append(question + " " + "不知道")print("========:", choices.index(examples["answer"][idx]))labels.append(choices.index(examples["answer"][idx]))
tokenized_examples = tokenizer(context, question_choice, truncation="only_first", max_length=256, padding="max_length") # input_ids: 4000 * 256,
for k, v in tokenized_examples.items():print("k:", k, "v:", v)
tokenized_examples = {k: [v[i: i + 4] for i in range(0, len(v), 4)] for k, v in tokenized_examples.items()} # 1000 * 4 *256
tokenized_examples["labels"] = labels# 处理数据函数
def process_function(examples):# examples, dict, keys: ["context", "quesiton", "choice", "answer"]# examples, 1000context = []question_choice = []labels = []for idx in range(len(examples["context"])):ctx = "\n".join(examples["context"][idx])question = examples["question"][idx]choices = examples["choice"][idx]for choice in choices:context.append(ctx)question_choice.append(question + " " + choice)if len(choices) < 4:for _ in range(4 - len(choices)):context.append(ctx)question_choice.append(question + " " + "不知道")labels.append(choices.index(examples["answer"][idx]))# 使用分词器,对数据进行分词处理 tokenized_examples = tokenizer(context, question_choice, truncation="only_first", max_length=256, padding="max_length") # input_ids: 4000 * 256,tokenized_examples = {k: [v[i: i + 4] for i in range(0, len(v), 4)] for k, v in tokenized_examples.items()} # 1000 * 4 *256tokenized_examples["labels"] = labelsreturn tokenized_examples# 处理数据
tokenized_c3 = c3.map(process_function, batched=True)# 加载模型
model = AutoModelForMultipleChoice.from_pretrained("chinese-macbert-large")# 创建评估函数
accuracy = evaluate.load("accuracy")def compute_metric(pred):predictions, labels = predpredictions = np.argmax(predictions, axis=-1)return accuracy.compute(predictions=predictions, references=labels)# 配置训练参数
args = TrainingArguments(output_dir="./muliple_choice",per_device_train_batch_size=16,per_device_eval_batch_size=16,num_train_epochs=1,logging_steps=50,eval_strategy="epoch",save_strategy="epoch",load_best_model_at_end=True,fp16=True
) # 创建训练器
trainer = Trainer(model=model,args=args,tokenizer=tokenizer,train_dataset=tokenized_c3["train"],eval_dataset=tokenized_c3["validation"],compute_metrics=compute_metric
) # 模型训练
trainer.train()# 模型预测
from typing import Any
import torchclass MultipleChoicePipeline:def __init__(self, model, tokenizer) -> None:self.model = modelself.tokenizer = tokenizerself.device = model.devicedef preprocess(self, context, quesiton, choices):cs, qcs = [], []for choice in choices:cs.append(context)qcs.append(quesiton + " " + choice)return tokenizer(cs, qcs, truncation="only_first", max_length=256, return_tensors="pt")def predict(self, inputs):inputs = {k: v.unsqueeze(0).to(self.device) for k, v in inputs.items()}return self.model(**inputs).logitsdef postprocess(self, logits, choices):predition = torch.argmax(logits, dim=-1).cpu().item()return choices[predition]def __call__(self, context, question, choices) -> Any:inputs = self.preprocess(context, question, choices)logits = self.predict(inputs)result = self.postprocess(logits, choices)return resultpipe = MultipleChoicePipeline(model, tokenizer)
pipe("小明在北京上班", "小明在哪里上班?", ["北京", "上海", "河北", "海南", "河北", "海南"])
以上就是完整多项选择阅读理解的大模型训练代码
问题
1,这里的难点就是多项选择如何让大模型进行阅读理解训练思想,这里参考的就是语文里的阅读理解。
2,将数据处理成什么样子,大模型才能理解,才能去进行正确的训练。
相关文章:
transformers训练(NLP)阅读理解(多项选择)
简介 在阅读理解任务中,有一种通过多项选择其中一个答案来训练机器的阅读理解。比如:给定一个或多个文档h,以及一个问题S和对应的多个答案候选,输出问题S的答案E,E是答案候选中的某一个选项。 这样的目的就是通过文档,…...
微软企业邮箱:安全可靠的企业级邮件服务!
微软企业邮箱的设置步骤?如何注册使用烽火域名邮箱? 微软企业邮箱作为一款专为企业设计的邮件服务,不仅提供了高效便捷的通信工具,更在安全性、可靠性和功能性方面树立了行业标杆。烽火将深入探讨微软企业邮箱的多重优势。 微软…...
什么是分布式锁
定义 分布式锁是控制分布式系统或集群中不同节点对共享资源访问的一种机制。在分布式环境下,多个节点(如多个服务器或多个进程)可能会同时访问诸如数据库中的某条记录、一个共享文件或者一个全局计数器等共享资源。分布式锁的目的是确保在同一…...
【含开题报告+文档+PPT+源码】基于SpringBoot的艺术培训学校管理系统的设计与实现
开题报告 艺术培训学校管理在现代教育行业中发挥着至关重要的作用,旨在为学员提供及时、专业且高效的课程服务,同时也激励培训机构不断提升教学质量与管理水平。然而,传统的艺术培训学校管理模式常面临一系列挑战,如课程报名程序…...
【网络安全 | 漏洞挖掘】绕过SAML认证获得管理员面板访问权限
未经许可,不得转载。 文章目录 什么是SAML认证?SAML是如何工作的?SAML响应结构漏洞结果什么是SAML认证? SAML(安全断言标记语言)用于单点登录(SSO)。它是一种功能,允许用户在多个服务之间切换时无需多次登录。例如,如果你已经登录了facebook.com,就不需要再次输入凭…...
Flutter:列表分页,上拉加载下拉刷新,在GetBuilder模板使用方式
GetBuilder模板使用方式参考上一节 本篇主要代码记录如何使用上拉加载下拉刷新, 接口请求和商品组件的代码不包括在内 pubspec.yaml装包 cupertino_icons: ^1.0.8# 分页 上拉加载,下拉刷新pull_to_refresh_flutter3: 2.0.2商品列表:controlle…...
硬件基础22 反馈放大电路
目录 一、反馈的基本概念与分类 1、什么是反馈 2、直流反馈与交流反馈 3、正反馈与负反馈 4、串联反馈与并联反馈 5、电压反馈与电流反馈 二、负反馈四种组态 1、电压串联负反馈放大电路 2、电压并联负反馈放大电路 3、电流串联负反馈放大电路 4、电流并联负反馈放大…...
挑战用React封装100个组件【001】
项目地址 https://github.com/hismeyy/react-component-100 组件描述 组件适用于需要展示图文信息的场景,比如产品介绍、用户卡片或任何带有标题、描述和可选图片的内容展示 样式展示 代码展示 InfoCard.tsx import ./InfoCard.cssinterface InfoCardProps {ti…...
linux高级系统编程之进程
进程 一个正在进行的程序 并行与并发 并行:执行的程序在不同CPU上同时执行 并发:一个CPU,多个进程交替执行,因为交替速度很快,所以从宏观上来看是同时执行的,但是从围观的角度是交替执行的 单道与多道 单道程序设计:所有进程一个一个排队执行,若A阻塞,B只能等待,,即使CPU处于空…...
nextjs+nestjs+prisma写todolist全栈项目
技术栈 nextjsnestjsprisma所学知识 Nextjs组件渲染,状态,路由docker启动Mysql容器prisma操作Mysql(CRUD)允许跨域请求APITanStack Query异步状态管理fetch api服务器组件预请求数据nestjs 管道和异常处理检测id是否正整数Docker启动Mysql容器 compose.yml name: todoLis…...
基于Matlab的图像去噪算法仿真
中值滤波的仿真 本节选用中值滤波法对含有高斯噪声和椒盐噪声的图像进行去噪,并用Matlab软件仿真。 (1)给图像加入均值为0,方差为0.02的高斯噪声,分别选择33模板、55模板和77模板进行去噪 Matlab部分代码࿱…...
Docker pull镜像拉取失败
因为一些原因,很多镜像仓库拉取镜像失败,所以需要更换不同的镜像,这是2024/11/25测试可用的仓库。 标题1、 更换镜像仓库的地址,编辑daemon.json文件 vi /etc/docker/daemon.json标题2、然后将下面的镜像源放进去或替换掉都可以…...
fastjson不出网打法—BCEL链
前言 众所周知fastjson公开的就三条链,一个是TemplatesImpl链,但是要求太苛刻了,JNDI的话需要服务器出网才行,BCEL链就是专门应对不出网的情况。 实验环境 fastjson1.2.4 jdk8u91 dbcp 9.0.20 什么是BCEL BCEL的全名应该是…...
vue2 中使用 Ag-grid-enterprise 企业版
文章目录 问题Vue2 引入企业版不生效npm run dev 时卡住了94% after seal 卡在这里了测试打包源 git 解决方案记录 问题 我想用企业版的树状表格 Vue2 引入企业版不生效 编译引入 // vue.config.js module.exports {transpileDependencies: ["ag-grid-enterprise"…...
Redis开发03:常见的Redis命令
1.输入以下命令,启动redis。 sudo service redis-server start 如果你是直接安装在WSL的,搜索栏搜索Ubuntu或者点击左下角Windows图表找到U那一栏,直接打开Ubentu,输入账密后,输入“sudo service redis-server start”…...
研0找实习【学nlp】14--BERT理解
以后做项目,一定要多调查,选用不同组合关键词多搜索! BERT论文解读及情感分类实战_bert模型在imdb分类上的准确率已经到达了多少的水平-CSDN博客 【深度学习】-Imdb数据集情感分析之模型对比(4)- CNN-LSTM…...
mysql之基本常用的语法
mysql之基本常用的语法 1.增加数据2.删除数据3.更新/修改数据4.查询数据4.1.where子句4.2.order by4.3.limit与offset4.4.分组与having4.5.连接 5.创建表 1.增加数据 insert into 1.指定列插入 语法:insert into table_name(列名1,列名2,....,列名n) values (值1,值…...
基于Linux的patroni搭建标准
作者:Digital Observer(施嘉伟) Oracle ACE Pro: Database PostgreSQL ACE Partner 11年数据库行业经验,现主要从事数据库服务工作 拥有Oracle OCM、DB2 10.1 Fundamentals、MySQL 8.0 OCP、WebLogic 12c OCA、KCP、PCTP、PCSD、P…...
2024年第十三届”认证杯“数学中国数学建模国际赛(小美赛)
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓...
Unity类银河战士恶魔城学习总结(P149 Screen Fade淡入淡出菜单)
【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了进入游戏和死亡之后的淡入淡出动画效果 UI_FadeScreen.cs 1. Animator 组件的引用 (anim) 该脚本通过 Animator 控制 UI 元…...
(四)3D视觉机器人的手眼标定(眼在手外)
内容 1.背景介绍1.1 思路T_target_to_cam求解公式求解 2.操作流程 1.背景介绍 3D视觉机器人指的是机器人通过3D相机提供的3D点云视觉信息,完成某些实际的功能。 目标是将场景信息从相机坐标系变换至机械臂坐标系中,最终是获得相机到机械臂基座的空间…...
安达发|制造业APS智能优化排产软件的四类制造模型解决方案
在制造业中,APS(高级计划和排程系统)智能优化排产软件的应用越来越广泛。它通过集成先进的算法和模型,帮助企业提高生产效率、降低成本并提升客户满意度。针对不同类型的生产需求,APS软件提供了四类制造模型解决方案&a…...
命令行使用ssh隧道连接远程mysql
本地电脑A 跳板机B 主机2.2.2.2 用户名 B ssh端口号22 登录密码bbb 远程mysql C 地址 3.3.3.3 端口号3306 用户名C 密码ccc A需要通过跳板机B才能访问C; navicat中配置ssh可以实现在A电脑上访问C 如何实现本地代码中访问C呢? # 假设本地使…...
力扣第 71 题 简化路径
一、题目描述 给定一个字符串 path,表示一个由目录名和斜杠 "/" 组成的绝对路径,请简化该路径,使其变为规范路径。 在 Unix 风格的文件系统中: 一个点 "." 表示当前目录本身;两个点 "..&q…...
使用ENSP实现OSPF
一、项目拓扑 二、项目实现 1.路由器AR1配置 进入系统试图 sys将路由器命名为R1 sysname R1关闭信息中心 undo info-center enable 进入g0/0/0接口 int g0/0/0将g0/0/0接口IP地址配置为1.1.1.1/24 ip address 1.1.1.1 24进入g0/0/1接口 int g0/0/1将g0/0/1接口IP地址配置为2…...
分布式下怎么优化处理数据,怎么代替Join
分布式下怎么优化处理数据,怎么代替Join 简单来说, 可以采用 数据冗余,有意地存储一些重复的数据,以此减少关联查询的需求 数据拆分与多次查询,将一次获取的多表数据,拆分多个单独的查询 使用数据仓库…...
51单片机快速入门之中断的应用 2024/11/23 串口中断
51单片机快速入门之中断的应用 基本函数: void T0(void) interrupt 1 using 1 { 这里放入中断后需要做的操作 } void T0(void): 这是一个函数声明,表明函数 T0 不接受任何参数,并且不返回任何值。 interrupt 1: 这是关键字和参…...
[Java]微服务配置管理
介绍 代码拆分为微服务后, 每个服务都有自己的配置文件, 而这些配置文件中有很多重复的配置, 并且配置变化后需要重启服务, 才能生效, 这样就会影响开发体验和效率 配置管理服务可以帮助我们集中管理公共的配置, 并且nacos就可以实现配置管理服务 配置共享 我们可以把微服务共…...
c/c++ 用easyx图形库写一个射击游戏
#include <graphics.h> #include <conio.h> #include <stdlib.h> #include <time.h>// 定义游戏窗口的大小 #define WINDOW_WIDTH 800 #define WINDOW_HEIGHT 600// 定义玩家和目标的尺寸 #define PLAYER_SIZE 50 #define TARGET_SIZE 20// 玩家的结构…...
Rust eyre 错误处理实战教程
在《Rust 错误处理库: thiserror 和 anyhow》中我们介绍了Rust简化处理错误策略,本文解释eyre错误处理库,并通过多个实际示例进行说明,最后于anyhow库进行对比,让你更好理解其应用场景。 eyre是一个用于 Rust 的错误处理库&#x…...
e福州怎么代缴医保/seo搜索引擎推广
灵动微MM32SPIN系列MCU产品是针对直流无刷电机驱动量身打造,由灵动微电机团队提供专业的定制化电机驱动芯片创新技术和精准控制马达方案,可帮助客户提升产品竞争力,搭配客户不同的应用方案及环境的需求,还能提供高集成度、高整合度…...
展示型网站设计案例/bing搜索引擎下载
从以下几个方面来回答这个问题:为什么会有延迟这个问题要从Virtual Dom说起,Vue的使用者只负责处理状态就行了,真正的页面渲染都交给Virtual Dom来做。并不是我们做的每一次状态修改都会立即触发页面Viritual Dom,会等主任务执行完…...
公司做网站会计凭证怎么做/企业软文范例
1026 程序运行时间(15)(15 分) 要获得一个C语言程序的运行时间,常用的方法是调用头文件time.h,其中提供了clock()函数,可以捕捉从程序开始运行到clock()被调用时所耗费的时间。这个时间单位是clock tick,即…...
app开发公司职位/短视频seo询盘获客系统
很多小伙伴都遇到过win7系统VMware虚拟机电脑安装系统提示虚拟内存不足的困惑吧,一些朋友看过网上零散的win7系统VMware虚拟机电脑安装系统提示虚拟内存不足的处理方法,并没有完完全全明白win7系统VMware虚拟机电脑安装系统提示虚拟内存不足是如何解决的…...
怎么把网站放到服务器/外贸网站推广
概述 切片是基于数据中连续片段的引用,是一个引用类型。与数组相比,切片的长度可以在运行时修改,可以将切片看作是长度可变的动态数组。 切片的实现是由一个底层数组以及其上面的动态位置,尺寸来实现。由指向底层数组的指针、访问…...
如何免费建设自己稳定的网站/新闻头条最新消息今天发布
py基础系列(三):python容器数据类型(下)可变类型和不可变类型不可变数据类型可变数据类型不可变数据变量之间的赋值可变数据变量之间的赋值问题不可变类型可以作为键浅复制和深复制浅复制深复制可变类型和不可变类型 …...