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

NLP:微调BERT进行文本分类

本篇博客的重点在于BERT的使用。
transformers包版本:4.44.2

1. 微调BERT进行文本分类

  这里我们使用stanford大学的SST2数据集来演示BERT模型的微调过程。SST-2数据集(Stanford Sentiment Treebank 2)是一个用于情感分类的经典数据集,常用于自然语言处理(NLP)领域的情感分析任务。

  • 第1步: 下载数据。其代码如下:
import pandas as pd
from transformers import BertTokenizer
from datasets import DatasetDict, Dataset
from torch.utils.data import DataLoader
from transformers import AutoModelForSequenceClassification, Trainer, TrainingArgumentssplits = {'train': 'data/train-00000-of-00001.parquet', 'validation': 'data/validation-00000-of-00001.parquet', 'test': 'data/test-00000-of-00001.parquet'}
train = pd.read_parquet("hf://datasets/stanfordnlp/sst2/" + splits["train"])
validation = pd.read_parquet("hf://datasets/stanfordnlp/sst2/" + splits["validation"])
test = pd.read_parquet("hf://datasets/stanfordnlp/sst2/" + splits["test"])
dataset = DatasetDict({'train': Dataset.from_pandas(train), 'validation': Dataset.from_pandas(validation), 'test': Dataset.from_pandas(test)})

要注意一下,这里并没有使用datasets包从hugging face上直接下载数据集的方式来获取数据,这是因为使用load_datesets方法获取数据时仍然会提示:NotImplementedError: Loading a dataset cached in a LocalFileSystem is not supported。样例数据集如下:
在这里插入图片描述

  • 第2步: 构造训练集、验证集和测试集

SST2数据集中训练集(train)共67349条,验证集(validation)共872条,而测试集(test)共1821条。因为训练集数目较大微调会比较耗时,所以从这三个数据集分别抽取出了1000条、200条、200条进行后续的任务。具体代码如下:

dataset['train'] = dataset['train'].shuffle(seed=42).select(range(1000))
dataset['validation'] = dataset['validation'].shuffle(seed=42).select(range(200))
dataset['test'] = dataset['test'].shuffle(seed=42).select(range(200))
print(dataset)

其输出结果如下:

Dataset({features: ['idx', 'sentence', 'label'],num_rows: 1000
})
Dataset({features: ['idx', 'sentence', 'label'],num_rows: 200
})
Dataset({features: ['idx', 'sentence', 'label'],num_rows: 200
})
  • 第3步:从bert中提取嵌入

训练集、验证集及测试集生成后,接着需要将这些语料全都转化成embedding向量。具体代码如下:

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
def tokenize_function(examples):return tokenizer(examples['sentence'], padding='max_length', truncation=True)
dataset =dataset.map(tokenize_function, batched=True)
dataset=dataset.remove_columns(['sentence',"idx"])
dataset=dataset.rename_column("label","labels")
dataset.set_format("torch")
train_dataset=dataset['train']
eval_dataset=dataset['validation']
test_dataset=dataset['test']
  • 第4步:模型训练。 具体代码如下:
model=BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2)
training_args = TrainingArguments(output_dir='results',         per_device_train_batch_size=8,  per_device_eval_batch_size=8,      num_train_epochs=1,
)
trainer = Trainer(model=model,                         args=training_args,                 train_dataset=train_dataset,        eval_dataset=eval_dataset,
)
trainer.train()
eval_result=trainer.evaluate(eval_dataset)
print(eval_result)
test_dataset=test_dataset.remove_columns(["labels"])
pred_result = trainer.predict(test_dataset=test_dataset)
print(pred_result)

关于上述代码,有以下几点需要说明:

  • 训练模型的选择: tranformers库中有多个分类模型,其中BertForSequenceClassification类适用于序列分类任务,比如情感分析和文本分类;而BertForTokenClassification类适用于token级的分类任务,比如命名实体识别。
  • TrainingArguments方法中的主要参数及其作用如下表所示:
参数名作用
output_dir指定模型和训练日志保存的记录;
num_train_epochs设置训练的周期数(即遍历整个训练数据集的次数,指的是整个训练集将被遍历多少次以进行训练);
per_device_train_batch_size设置每个设备(如GPU)上的训练批次大小,训练批次是指在一次训练迭代中,模型同时处理的数据样本数量;bert微调时会将整个训练数据集分成多个批次逐步进行训练;
per_device_eval_batch_size设置每个设备上的评估批次大小;
logging_dir指定训练日志的保存目录;
evaluation_strategy设置评估策略。可以是 ‘no’(不评估)、‘steps’(每隔一定步数评估)或 ‘epoch’(每个周期评估);
save_total_limit设置保存模型检查点的总数限制,超过限制的检查点会被删除;
fp16启用半精度浮点数(FP16)训练,以减少显存使用并加速训练(需要支持 FP16 的硬件);
max_steps最大迭代次数
  • pred_result中的predictions通常指的是模型的预测结果,是每个样本属于各个类别的原始分数(logits)或概率(如果模型输出层后接有softmax或sigmoid激活函数)。

参考资料

  • BERT基础教程:Transformer大模型实战
  • https://blog.csdn.net/zoe9698/article/details/124579973

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • VMware Fusion虚拟机Mac版 安装Win10系统教程
  • 插入排序详解
  • 物理感知扩散的 3D 分子生成模型 - PIDiff 评测
  • 索引设计的5个原则
  • 一文详解Unity下RTMP推送|轻量级RTSP服务|RTSP|RTMP播放模块说明
  • 盘点3款.NetCore(C#)开源免费商城系统
  • 管理依赖版本-maven工程parent项目巧配置
  • C语言CRC16_CCITT_FALSE函数法和查表法实现
  • 【梯度下降算法学习笔记】
  • 基于开源鸿蒙(OpenHarmony)的【智能家居综合应用】系统
  • 评价类——熵权法(Entropy Weight Method, EWM),完全客观评价
  • 老年人养生之道:岁月静好,健康常伴
  • 代码随想录 八股文训练营40天总结
  • Cypress初次安装启动常见问题
  • PyQt5 导入ui文件报错 AttributeError: type object ‘Qt‘ has no attribute
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • angular2 简述
  • E-HPC支持多队列管理和自动伸缩
  • Hibernate【inverse和cascade属性】知识要点
  • IOS评论框不贴底(ios12新bug)
  • Javascript Math对象和Date对象常用方法详解
  • JavaScript的使用你知道几种?(上)
  • Lucene解析 - 基本概念
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • php面试题 汇集2
  • Python中eval与exec的使用及区别
  • redis学习笔记(三):列表、集合、有序集合
  • Xmanager 远程桌面 CentOS 7
  • 电商搜索引擎的架构设计和性能优化
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 技术发展面试
  • 那些年我们用过的显示性能指标
  • 十年未变!安全,谁之责?(下)
  • 听说你叫Java(二)–Servlet请求
  • 小程序开发之路(一)
  • 写代码的正确姿势
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 06-01 点餐小程序前台界面搭建
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • ​补​充​经​纬​恒​润​一​面​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #etcd#安装时出错
  • #vue3 实现前端下载excel文件模板功能
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (2022 CVPR) Unbiased Teacher v2
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (zhuan) 一些RL的文献(及笔记)
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二)正点原子I.MX6ULL u-boot移植
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (三)模仿学习-Action数据的模仿
  • (一)Neo4j下载安装以及初次使用
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景