基于微调BERT的中文评论情感分类模型(支持CPU、GPU)

基于微调BERT的中文评论情感分类模型

迁移中文bert模型(chinese-bert-wwm),完成对20000余条评论数据的情感分类,分为0-很好,1-一般,2-较差。
学习到bert模型的强大之后,不禁感叹,之前比赛用的模型太垃圾了,完全不够看,思考用bert训练模型来模拟比赛,
于是该bert模型在自己的数据集上进行了迁移和训练

采用ktrain库进行文本分类

0.分配GPU(CPU版略过)

%reload_ext autoreload
%autoreload 2
%matplotlib inline
import os
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID";
os.environ["CUDA_VISIBLE_DEVICES"]="0";   #指定GPU

配置GPU移步
1.win10环境下python3.7+cuda10.1+cudnn7.6+tensorflow-gpu1.13的安装

2.其中请注意CUDA和cuDNN的安装(环境变量)

3.TensorFlow-GPU版本、cuda版本和python等版本对应下载
结合这三篇下载安装

1.加载数据

#0-很好 1-一般 2-差
import pandas as pd
import numpy as np
train = pd.read_excel('D:/python相关/数据/train_sentiment.xls')
test = pd.read_excel('D:/python相关/数据/test_sentiment.xls')

2.打乱数据

X_data=train.content
y_data=np.asarray(train.cls, dtype=np.float32)
x_data_test=test.content
y_data_test=np.asarray(test.cls, dtype=np.float32)
nums = []
nums_ = []
x_train = []
y_train = []
x_test = []
y_test = []
nums = np.arange(9999)
np.random.shuffle(nums)
for i in nums:
    x_train.append(X_data[i])
    y_train.append(y_data[i])
nums_ = np.arange(3602)
np.random.shuffle(nums_)
for i in nums_:
    x_test.append(x_data_test[i])
    y_test.append(y_data_test[i])
y_train=np.asarray(y_train, dtype=np.int)
y_test=np.asarray(y_test, dtype=np.int)

3.预处理数据并构造一个中文trasnformer模型

import ktrain
from ktrain import text
MODEL_NAME = 'hfl/chinese-bert-wwm'
t = text.Transformer(MODEL_NAME, maxlen=300, class_names=[0,1,2])#300有点小,可以设置400/500
trn = t.preprocess_train(x_train, y_train)
val = t.preprocess_test(x_test, y_test)
model = t.get_classifier()
learner = ktrain.get_learner(model, train_data=trn, val_data=val, batch_size=1)
#GPU容量限制,参数尽量调小了,结果相应会受到影响

*[preprocessing train…
language: zh-cn
Is Multi-Label? False
preprocessing test…
language: zh-cn]

估计一个较好的学习率

对于transformer模型来讲,结合经验和大神测试总结,学习率(learning rate)取2e-5 - 5e-5 会取得较好的性能. 这里,我们可以利用lr_find方法尝试在特定数据及寻找一个较好的学习率

这里为我们只运行1个epoch(因为时间太久,GPU的同学可以试试其他参数)

learner.lr_find(show_plot=True, max_epochs=1)

基于微调BERT的中文评论情感分类模型(支持CPU、GPU)
用损失函数确定最好学习率,loss越小越好

训练模型

参数设置:learning_rate = 2e-5, epochs = 4
CPU时间特别久,GPU是CPU十倍以上

learner.fit_onecycle(2e-5, 4)

基于微调BERT的中文评论情感分类模型(支持CPU、GPU)

评估模型

learner.validate(class_names=t.get_classes())

基于微调BERT的中文评论情感分类模型(支持CPU、GPU)
类别:0 的准确率明显低于其他两类的原因可能是数据量问题

在新的数据上进行测试

找到loss最大的样本

learner.view_top_losses(n=1, preproc=t)

#id:397 | loss:7.4 | true:0 | pred:2)

* #查看错误情况,这个错误原因很明确是因为数据标注错误,这是一个反例(类别2:差评)*
说明模型还是挺不错的。

print(x_test[397])

#1、由于键盘的设计,某些键按起来不是很方便。2、摄像头的镜头没有保护,裸露在外,如果镜头表面不小心留下划痕,会影响到拍照的效果。3、手机稍微大了点,重了点,携带不是特别方便。4、机身附带的音箱效果不是很好,音量较大时会有一些杂音。5、电池的使用时间稍微有点

在新的数据上进行测试

predictor = ktrain.get_predictor(learner.model, preproc=t)
predictor.predict('怎么成现在这样儿了……就是抄好莱坞结构,也不至于啊!“7天假”啊,“春节第一天”啊,明显是投机这个档期。煽情点呢,死两个长辈')

2 #结果(评价较差)

predictor.explain('怎么成现在这样儿了……就是抄好莱坞结构,也不至于啊!“7天假”啊,“春节第一天”啊,明显是投机这个档期。煽情点呢,死两个长辈')

保存模型,以便之后调用

predictor.save('/my_commentgroup_predictor')
reloaded_predictor = ktrain.load_predictor('/my_commentgroup_predictor')

结果分析

利用bert模型实现中文评论情感分类,数据来自某次比赛案例数据,共20000条,硬件问题,训练难度高,于是减小到训练数据9999条,测试数据3602条可能是数据本身不够准确和调参的问题,准确率结果为88%。利用英文模型对英文分类的案例中展示的结果更好。在进行预训练之前查看不少博客,学习了过程,但是上手仍然有难度。电脑GPU容量较小,不支持更大的模型训练,也直接造成模型参数的可调性。

实验总结

结果用作比赛还可以做优化,难度主要在模型预训练的调试上,电脑CPU训练较慢,过程中有不少坑,于是配置GPU环境,但是一直报错,还是遇到很多坑,踩得心累。环境配置好了,但是算力和容量限制,这次实验暂时到这里吧。进一步提醒了自己的能力,前路漫漫,加油!

上一篇:阿里云高校计划视觉AI五天训练营教程 Day 2 - 身份证识别系统搭建


下一篇:基本型号 14 英寸 MacBook Pro 可能没有您想象中那么快