(PyTorch)BERT文本分类:七种模型架构
🌟 1. 介绍
使用BERT完成文本分类任务(如情感分析,新闻文本分类等等)对于NLPer已经是很基础的工作了!虽说已迈入LLM时代,但是BERT这类较小的传统预训练模型的作用同样不可小觑,常常在某些场景下达到出乎意料的效果。本文介绍了一个利用BERT完成文本分类的开源项目,项目源码 Bert-Text-Classification。项目包含了7条基线,每条基线运行起来所需的显存都很小,用来作baseline非常的不错。
为方便下载:夸克网盘链接,大家也可直接进入GitHub地址访问项目(同时给作者点个🌟哈哈哈)
另外,当前很多的BERT文本分类项目都是很老的包了,可能在配置环境时会出现问题。但本项目使用的包在当前主流的服务器上肯定可以配置成功!按照本项目的依赖文件去安装肯定不会出问题!
🔍 2. 模型架构解析
模型类型 | 模型描述 | 适用场景 |
---|---|---|
BertOrigin | 标准BERT实现 | 基线对比实验 |
BertATT | 动态注意力机制增强 | 长文本关键信息提取 |
BertLSTM | RNN时序建模能力融合 | 序列依赖性强的任务 |
BertCNN | 局部特征提取器设计 | 短文本模式识别 |
BertDPCNN | 深度金字塔卷积架构 | 层次化特征学习 |
BertRCNN | RNN-CNN混合架构 | 上下文敏感的分类任务 |
BertCNNPlus | 全局-局部特征融合机制 | 需要综合语义理解的场景 |
🛠 3. 快速开始
话不多说,直接开始复现步骤(作者已按照以下步骤完成复现,若遇到问题,欢迎在评论区提出,或者在GitHub的issue中提出,issue中提出问题会有邮件通知作者)
3.1 环境要求
- Python 3.8
- 依赖安装:
pip install -r requirements.txt
# 创建conda环境
conda create -n bert2text python=3.8
# 安装依赖
cd xx/xx/Bert-Text-Classification
pip install -r requirements.txt
3.2 数据准备
- 文本分类数据集,包含训练集、验证集、测试集
- 单条数据格式:
label \t text
,如: -
0 我爱北京天安门 1 这个电影真好看
- 数据集存放路径:
data/
,数据集文件名:train.tsv
、dev.tsv
、test.tsv
源码中的数据集因版权,只保留了前100条数据,若需要情感二分类SST2的完整数据集,可通过链接 SST2 访问下载。若是自己的数据集,请自行按照以上格式修改(注意分类类别需自行转换为数字标签)!比如:0对应“消极”,1对应“积极"
3.3 模型训练和评估
0️⃣ 修改相应的运行文件的配置信息,如run_STT2.py
:
# 数据集路径
data_dir = "./data/SST2"
# 标签列表
label_list = ["0", "1"] # SST2数据集标签列表(SST2是情感二分类数据集)
# 所需运行的模型名称列表
model_name_list = ["BertOrigin", "BertATT", "BertCNN", "BertCNNPlus", "BertDPCNN", "BertRCNN", "BertLSTM"] # 运行七条基线模型
# 模型保存路径、缓存保存路径、日志保存路径
output_dir = "./sst2_output/"
cache_dir = "./sst2_cache/"
log_dir = "./sst2_log/"
# BERT预训练模型路径,中文数据集使用"bert-base-chinese",英文数据集使用"bert-base-uncased"
model_name_or_path = "XXXX/XXX/bert-base-uncased"
需要运行几条基线,就在model_name_list 中保留哪几个模型的名称。中文文本分类需要使用中文版的BERT。
1️⃣ 运行训练脚本:
# 注意修改执行的数据集脚本名称,如运行SST2数据集时,run.sh中应该是python3 run_SST2.py
CUDA_VISIBLE_DEVICES=0 bash run.sh
# run.sh中的参数说明:
max_seq_length:句子截断长度
num_train_epochs:训练轮数
do_train:是否训练
gpu_ids:使用的GPU编号,注意单卡训练时,gpu_ids为0
gradient_accumulation_steps:梯度累积步数
print_step:打印训练信息的步数(验证频率)
early_stop:早停步数,即验证集准确率连续early_stop次不再提升时,停止训练。当设置很大时,相当于关闭了早停功能。
train_batch_size:训练批次大小
第一次跑可以直接使用默认配置,看是否能运行成功。若爆显存可修改max_seq_length和train_batch_size大小。
2️⃣ 测试模型:
# 训练完成后,模型保存在`output_dir`目录下,如`./sst2_output/BertOrigin/`,包含模型文件、词表文件、配置文件等。
# 移除`run.sh`中的`do_train`参数,运行测试脚本
CUDA_VISIBLE_DEVICES=0 bash run.sh
在源码的设置中,其实每训练一个epoch后,都在测试集上进行了预测,同时记录了对应的结果。所以做不做步骤2其实都可以。保存的结果在
./sst2_output/BertXXX/BertXXX/metric_info_for_test.json
中。记录的指标包含:{ "epoch": 1, "auc": 0.5, "accuracy": 66.69859514687101, "P_macro_avg": 44.97381885071993, "R_macro_avg": 45.84622325341583, "F1_macro_avg": 44.36622804917629, "P_weighted_avg": 63.133033572230936, "R_weighted_avg": 66.69859514687101, "F1_weighted_avg": 63.44510333347591 }
注意,若分类类别大于2,则AUC指标设置为0.5不变。
3.4 训练监控
可通过TensorBoard查看训练日志,日志路径示例:
./sst2_log/
tensorboard的使用在此处就不再赘述了,若有需要可自行搜索教程!