/NLP_BERT_multi_label

使用BERT构建多标签标注模型

Primary LanguagePython

详细的图文说明可以通过如下链接:https://mp.weixin.qq.com/s?__biz=MzU1NjYyODQ4NA==&mid=2247483838&idx=1&sn=2770f875d6e47ee90cbf4207f2c01cd2&chksm=fbc36ed5ccb4e7c3cdc239b99d45994b567a08ef55aa22997a0cd7113cfdb3eb693855fa273a&token=1058483009&lang=zh_CN#rd

多标签标注项目主要分成四个部分:

  1. bert预训练模型 广告系列的第二篇已经讲过BERT是预训练+fine-tuning的二阶段模型。这里简单的提一句,预训练过程就相当于我们使用大量的文本训练语料,使得BERT模型学会很多语言学知识。而这部分就是学习语言学知识得到的相关参数。

之前二分类器的模型使用的是基于google的TensorFlow框架的keras_bert完成的二分类器。后面因为实际项目中慢慢往pytorch框架迁移,所以这个多标签标注模型是基于pytorch框架的fast_ai开发完成的。fast_ai类似keras_bert,采用非常简单的代码结构即可将BERT模型用于我们的NLP任务中。

Pytorch将BERT模型进行改造,各个版本的路径及下载地址如下:

bert-base-uncased
https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-uncased.tar.gz

bert-large-uncased
https://s3.amazonaws.com/models.huggingface.co/bert/bert-large-uncased.tar.gz

bert-base-cased
https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-cased.tar.gz

bert-base-multilingual
https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-multilingual.tar.gz

bert-base-chinese
https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-chinese.tar.gz

因为实际项目中我们主要识别中文,所以选择最后一个“bert-base-chinese”作为我们的BERT预训练模型。下载完成解压之后会得到bert_config.json和pytorch_model.bin两个文件,然后加上之前的词表vocab.txt一起复制到我们的bert_model目录下。该过程即可完成。

  1. 训练数据集

之前说过二分类器模型的数据输入格式是ocr,label样式的。ocr是用户query,也是我们需要识别的目标。Label则代表这句query是不是对某个标签感兴趣,取值为0或者1,1代表感兴趣,0代表没有兴趣。

多标签标注任务中,数据输入格式分成两部分,第一部分也是ocr,是我们需要识别的用户query。第二部分由多个字段组成,需要识别几个标签,就有几个字段。举例来说,我们现在需要识别用户的query是不是属于五个标签。那么现在我们训练集的格式就是ocr,lable1,label2,label3,label4,label5。实际数据举例如下:

“成龙大哥代言的一刀传奇好玩么?”,1,0,0,1,1。这条数据代表用户这条query同时属于标签1、标签4和标签5。

训练数据集分成训练集和测试集。模型训练中我们会用训练集去完成模型训练。然后用这个训练好的模型去测试集上检查模型的识别能力。这里训练集和测试集是完全互斥的,所以通过查看测试集的效果能一定程度上反映这个模型上线之后的识别能力。因为线上的数据和测试集的数据分布可能不同,所以测试集的效果可能和线上效果存在差异。

  1. 模型代码及脚本

之前二分类器项目中只有代码。很多小伙伴私信反应说在训练、验证和测试过程中可能还要修改相关参数,比较麻烦。这里在多标签模型中通过shell脚本调用python代码能很好的解决这个问题。只要数据输入格式和上面讲的相同。针对不同的任务只需要修改shell脚本即可完成模型。

模型代码主要分成三部分: multi_label_train.py:模型训练代码。 这里通过具体使用模型训练任务的脚本来详细说明模型训练代码的输入和输出。对应train_multi_tag.sh脚本:

输入:模型训练需要使用BERT预训练模型和训练集,所以需要配置的参数有训练数据的路径TRAIN_DATA和BERT预训练任务的路径BERT_MODEL_NAME

输出:模型训练完成之后会得到一个xxxx.pth文件,所以需要配置的参数有MODEL_SAVE_PATH。因为在模型训练阶段,可能多进行多次训练,所以需要存储不同的模型,这个通过配置LAB_FLAG来识别实验。

具体模型训练只需要在服务器下直接通过sh train_multi_tag.sh开始训练任务。

multi_label_validate.py:模型验证代码。 模型验证部分主要是为了验证模型的各项效果指标,我们主要使用准确率、精度、召回率、f1得分等来评估模型。 输入:模型验证需要上一个训练过程得到的模型和测试集。对应脚本中需要配置的参数有TEST_DATA和MODEL_LOAD_PATH

输出:模型输出为测试集上的预测数据以及模型的各项指标数据,对应脚本中的TEST_PREDICT_DATA和MODEL_EVALUATE_DATA。

multi_label_predict.py:模型预测代码。 当整个模型开发完成之后,会使用训练集和测试集同时作为新的训练集去训练模型,得到一个最终的模型。这个模型也是要拿到线上去跑的。 输入:这里需要最终得到的模型和线上需要真正预测的数据,对应脚本中的TEST_DATA和MODEL_LOAD_PATH。

输出:预测输出的部分就是线上真正预测的结果数据,对应脚本中TEST_PREDICT_DATA参数。

  1. 训练完成得到的模型

这一部分就是上面训练过程的结果。我们需要使用这个训练好的模型去部署上线进行线上数据的预测。这里和之前二分类器有所不同,二分类器得到的是一个XX.hdf5文件,而多标签标注模型得到的是一个XX.pth文件。其他和之前讲过的二分类器类似,这里不再赘述。

总结下,我们通过项目实战完成一个多标签标注模型,从模型训练到模型验证,再到最后上线预测流程。模型通用性较强,我们只需要更改脚本代码即可迅速完成线上任务。