快速上手UER

  • 模型及数据集
    • 书评语料
      • MLM目标任务
      • LSTM(代替transformer)
      • ELMo
      • 微调GatedCNN模型
      • 分类任务上交叉验证

模型及数据集

我们首先使用BERT模型和豆瓣书评分类数据集。我们在书评语料上对模型进行预训练,然后在书评分类数据集上对其进行微调。这个过程有三个输入文件:书评语料,书评分类数据集和中文词典。
模型链接:UER-py

书评语料

书评语料是由书评分类数据集去掉标签得到的。我们将一条评论从中间分开,从而形成一个两句话的文档,具体可见corpora文件夹中的book_review_bert.txt

分类数据集的格式如下:

词典文件的格式是一行一个单词,我们使用谷歌提供的包含21128个中文字符的词典文件models/google_zh_vocab.txt
我们首先对书评语料进行预处理。预处理阶段需要指定模型的目标任务(–target):

python3 preprocess.py --corpus_path corpora/book_review_bert.txt --vocab_path models/google_zh_vocab.txt --dataset_path dataset.pt \--processes_num 8 --target bert

预处理非常耗时,使用多个进程可以大大加快预处理速度(–processes_num)。
原始文本在预处理之后被转换为pretrain.py的可以接受的输入,dataset.pt。然后下载Google中文预训练模型google_zh_model.bin,并将其放在 models 文件夹中。接着加载Google中文预训练模型,在书评语料上对其进行增量预训练。预训练模型由词向量层,编码层和目标任务层组成。因此要构建预训练模型,我们应明确指定模型的词向量层(–embedding),编码器层(–encoder 和 --mask)和目标任务层(–target)的类型。假设我们有一台带有2个GPU的机器:

python3 pretrain.py --dataset_path dataset.pt --vocab_path models/google_zh_vocab.txt --pretrained_model_path models/google_zh_model.bin \--output_model_path models/book_review_model.bin  --world_size 2 --gpu_ranks 0 1 --batch_size 8 \--total_steps 5000 --save_checkpoint_steps 1000 --embedding word_pos_seg --encoder transformer --mask fully_visible --target bert

(注:当只使用第一块GPU时,world_size 1 gpu_ranks 0。当只使用第二块GPU,在pretrain.py脚本前需要加export CUDA_VISIBLE_DEVICES=1,world_size改为1,gpu_ranks为0)
–mask 指定注意力网络中使用的遮罩类型。BERT使用双向语言模型,句子中的任意一个词可以看到所有词的信息,因此我们使用 fully_visible 遮罩类型。默认情况下,配置文件为 models/bert/base_config.json 。配置文件指定了模型的超参数。 请注意,pretrain.py输出的模型会带有记录训练步数的后缀,这里我们可以删除后缀以方便使用。

mv models/book_review_model.bin-5000 models/book_review_model.bin

然后,我们在下游分类数据集上微调预训练模型,我们可以用 google_zh_model.bin:

python3 run_classifier.py --pretrained_model_path models/google_zh_model.bin --vocab_path models/google_zh_vocab.txt \--train_path datasets/douban_book_review/train.tsv --dev_path datasets/douban_book_review/dev.tsv --test_path datasets/douban_book_review/test.tsv \--epochs_num 3 --batch_size 8 --embedding word_pos_seg --encoder transformer --mask fully_visible

测试结果为:

Test set evaluation.
Confusion matrix:
tensor([[4358,  514],[ 752, 4376]])
Report precision, recall, and f1:
Label 0: 0.894, 0.853, 0.873
Label 1: 0.853, 0.895, 0.874
Acc. (Correct/Total): 0.8734 (8734/10000)

或者使用 pretrain.py 的输出book_review_model.bin

python3 run_classifier.py --pretrained_model_path models/book_review_model.bin --vocab_path models/google_zh_vocab.txt \--train_path datasets/douban_book_review/train.tsv --dev_path datasets/douban_book_review/dev.tsv --test_path datasets/douban_book_review/test.tsv \--epochs_num 3 --batch_size 8 --embedding word_pos_seg --encoder transformer --mask fully_visible
Test set evaluation.
Confusion matrix:
tensor([[4335,  519],[ 775, 4371]])
Report precision, recall, and f1:
Label 0: 0.893, 0.848, 0.870
Label 1: 0.849, 0.894, 0.871
Acc. (Correct/Total): 0.8706 (8706/10000)

实验结果显示,谷歌BERT模型在书评分类任务测试集上的准确率为87.3;book_review_model.bin 在其上的准确率为87.0。

微调后的模型的默认路径是models/finetuned_model.bin, 然后我们利用微调后的分类器模型进行预测:

python3 inference/run_classifier_infer.py --load_model_path models/finetuned_model.bin --vocab_path models/google_zh_vocab.txt \--test_path datasets/douban_book_review/test_nolabel.tsv \--prediction_path datasets/douban_book_review/prediction.tsv --labels_num 2 \--embedding word_pos_seg --encoder transformer --mask fully_visible

–test_path 指定需要预测的文件test_nolabel.tsv;
–prediction_path 指定预测结果的文件prediction.tsv;
–labels_num 指定分类任务标签的个数,这里是二分类任务。

MLM目标任务

预测是否是下一个句子(NSP)是BERT的目标任务之一,但是,NSP任务不适合句子级别的评论,因为我们需要将句子切分为多个部分去构造文档。 UER-py可以让用户自由选择不同的目标任务。这里我们选择使用遮罩语言模型(MLM)作为目标任务。

python3 preprocess.py --corpus_path corpora/book_review.txt --vocab_path models/google_zh_vocab.txt --dataset_path dataset.pt \--processes_num 8 --target mlmpython3 pretrain.py --dataset_path dataset.pt --vocab_path models/google_zh_vocab.txt --pretrained_model_path models/google_zh_model.bin \--output_model_path models/book_review_mlm_model.bin  --world_size 1 --gpu_ranks 0 \--total_steps 5000 --save_checkpoint_steps 2500 --batch_size 8 --embedding word_pos_seg --encoder transformer --mask fully_visible --target mlm
mv models/book_review_mlm_model.bin-5000 models/book_review_mlm_model.binpython3 run_classifier.py --pretrained_model_path models/book_review_mlm_model.bin --vocab_path models/google_zh_vocab.txt \--train_path datasets/douban_book_review/train.tsv --dev_path datasets/douban_book_review/dev.tsv --test_path datasets/douban_book_review/test.tsv \--epochs_num 3 --batch_size 8 --embedding word_pos_seg --encoder transformer --mask fully_visible

注意到当预训练目标被改为MLM后,我们使用的预训练语料为 corpora/book_review.txt 而不是 corpora/book_review_bert.txt。
结果:

Test set evaluation.
Confusion matrix:
tensor([[4454,  567],[ 656, 4323]])
Report precision, recall, and f1:
Label 0: 0.887, 0.872, 0.879
Label 1: 0.868, 0.884, 0.876
Acc. (Correct/Total): 0.8777 (8777/10000)

LSTM(代替transformer)

BERT参数量大,计算较慢。我们希望加速模型的同时让模型仍然在下游任务上有好的表现。这里我们选择2层LSTM编码器来替代12层Transformer编码器。

我们首先下载2层LSTM编码器的预训练模型cluecorpussmall_lstm_lm_model.bin。这个预训练模型在CLUECorpusSmall语料上训练了50万步:

python3 preprocess.py --corpus_path corpora/cluecorpussmall.txt --vocab_path models/google_zh_vocab.txt --dataset_path dataset.pt \--processes_num 8 --seq_length 256 --target lmpython3 pretrain.py --dataset_path dataset.pt --vocab_path models/google_zh_vocab.txt \--output_model_path models/cluecorpussmall_lstm_lm_model.bin \--config_path models/rnn_config.json \--world_size 1 --gpu_ranks 0 \--total_steps 500000 --save_checkpoint_steps 100000 \--learning_rate 1e-3 --batch_size 8 \--embedding word --remove_embedding_layernorm --encoder lstm --target lm

把预训练模型记录训练步数的后缀去掉,然后在下游分类数据集上对其进行微调:

python3 run_classifier.py --pretrained_model_path models/cluecorpussmall_lstm_lm_model.bin --vocab_path models/google_zh_vocab.txt --config_path models/rnn_config.json \--train_path datasets/douban_book_review/train.tsv --dev_path datasets/douban_book_review/dev.tsv --test_path datasets/douban_book_review/test.tsv \--learning_rate 1e-3 --batch_size 8 --epochs_num 5 \--embedding word --remove_embedding_layernorm --encoder lstm --pooling meanpython3 inference/run_classifier_infer.py --load_model_path models/finetuned_model.bin --vocab_path models/google_zh_vocab.txt \--config_path models/rnn_config.json --test_path datasets/douban_book_review/test_nolabel.tsv \--prediction_path datasets/douban_book_review/prediction.tsv \--labels_num 2 --embedding word --remove_embedding_layernorm --encoder lstm --pooling mean

我们在MLM书评分类任务测试集上得到87.7准确率,相比之下,我们使用相同的LSTM编码器,但是不加载预训练模型,得到的准确率却不如87.7。

ELMo

在Chnsenticorp数据集上使用ELMo进行预训练和微调的示例:

python3 preprocess.py --corpus_path corpora/chnsenticorp.txt --vocab_path models/google_zh_vocab.txt --dataset_path dataset.pt \--processes_num 8 --seq_length 192 --target bilmpython3 pretrain.py --dataset_path dataset.pt --vocab_path models/google_zh_vocab.txt --pretrained_model_path models/mixed_corpus_elmo_model.bin \--config_path models/birnn_config.json \--output_model_path models/chnsenticorp_elmo_model.bin --world_size 1 --gpu_ranks 0  \--total_steps 5000 --save_checkpoint_steps 2500 --batch_size 8 --learning_rate 5e-4 \--embedding word --encoder bilstm --target bilm
mv models/chnsenticorp_elmo_model.bin-5000 models/chnsenticorp_elmo_model.binpython3 run_classifier.py --pretrained_model_path models/chnsenticorp_elmo_model.bin --vocab_path models/google_zh_vocab.txt --config_path models/birnn_config.json \--train_path datasets/chnsenticorp/train.tsv --dev_path datasets/chnsenticorp/dev.tsv --test_path datasets/chnsenticorp/test.tsv \--epochs_num 5  --batch_size 8 --seq_length 192 --learning_rate 5e-4 \--embedding word --encoder bilstm --pooling mean

结果:

Test set evaluation.
Confusion matrix:
tensor([[562,  42],[ 30, 566]])
Report precision, recall, and f1:
Label 0: 0.930, 0.949, 0.940
Label 1: 0.950, 0.931, 0.940
Acc. (Correct/Total): 0.9400 (1128/1200)

微调GatedCNN模型

python3 run_classifier.py --pretrained_model_path models/wikizh_gatedcnn_lm_model.bin \--vocab_path models/google_zh_vocab.txt \--config_path models/gatedcnn_9_config.json \--train_path datasets/chnsenticorp/train.tsv --dev_path datasets/chnsenticorp/dev.tsv --test_path datasets/chnsenticorp/test.tsv \--epochs_num 5  --batch_size 8 --learning_rate 5e-5 \--embedding word --encoder gatedcnn --pooling maxpython3 inference/run_classifier_infer.py --load_model_path models/finetuned_model.bin --vocab_path models/google_zh_vocab.txt \--config_path models/gatedcnn_9_config.json \--test_path datasets/chnsenticorp/test_nolabel.tsv \--prediction_path datasets/chnsenticorp/prediction.tsv \--labels_num 2 --embedding word --encoder gatedcnn --pooling maxpython3 inference/run_classifier_infer.py --load_model_path models/finetuned_model.bin --vocab_path models/google_zh_vocab.txt \--config_path models/gatedcnn_9_config.json \--test_path datasets/chnsenticorp/test_nolabel.tsv \--prediction_path datasets/chnsenticorp/prediction.tsv \--labels_num 2 --embedding word --encoder gatedcnn --pooling max

结果:

Test set evaluation.
Confusion matrix:
tensor([[563,  47],[ 29, 561]])
Report precision, recall, and f1:
Label 0: 0.923, 0.951, 0.937
Label 1: 0.951, 0.923, 0.937
Acc. (Correct/Total): 0.9367 (1124/1200)

分类任务上交叉验证

python3 run_classifier_cv.py --pretrained_model_path models/google_zh_model.bin \--vocab_path models/google_zh_vocab.txt \--config_path models/bert/base_config.json \--output_model_path models/classifier_model.bin \--train_features_path datasets/smp2020-ewect/virus/train_features.npy \--train_path datasets/smp2020-ewect/virus/train.tsv \--epochs_num 3 --batch_size 8 --folds_num 5 \--embedding word_pos_seg --encoder transformer --mask fully_visible

UER-py快速上手相关推荐

  1. thinkcmf5调用指定分类的二级_Tengine快速上手系列教程amp;视频:基于Python API的图片分类应用入门丨附彩蛋...

    前言:近期,Tengine团队加班加点,好消息接踵而来,OpenCV 4.3.0发布,OPEN AI LAB AIoT智能开发平台Tengine与OpenCV合作共同加速边缘智能,Tengine再获业 ...

  2. yolo python_YOLO目标检测快速上手

    介绍 YOLO是基于深度学习端到端的实时目标检测系统,YOLO将目标区域预测和目标类别预测整合于单个神经网络模型中,实现在准确率较高的情况下快速目标检测与识别,更加适合现场应用环境.本案例,我们快速实 ...

  3. pyqt5从子目录加载qrc文件_PyQt5快速上手基础篇10-QSettings用法

    前言 本节我们学习使用PyQt5的QSettings的用法,使用QSettings可以记住用户操作UI界面设置的参数,下次打开软件的时候,会直接加载用户上一次设置的参数. 一.基础知识 1.QSett ...

  4. 导入python标准数学函数模块的语句_《Python编程快速上手——让繁琐工作自动化》——2.8 导入模块...

    本节书摘来自异步社区<Python编程快速上手--让繁琐工作自动化>一书中的第2章,第2.8节,作者[美] Al Sweigart,王海鹏 译,更多章节内容可以访问云栖社区"异步 ...

  5. 《Python编程快速上手 让繁琐工作自动化》pdf

    <div id="article_content" class="article_content tracking-ad" data-mod=" ...

  6. PyTorch 分布式训练DDP 单机多卡快速上手

    PyTorch 分布式训练DDP 单机多卡快速上手 本文旨在帮助新人快速上手最有效的 PyTorch 单机多卡训练,对于 PyTorch 分布式训练的理论介绍.多方案对比,本文不做详细介绍,有兴趣的读 ...

  7. PyQt5入门——手把手教你配置环境,快速上手GUI程序开发(Anaconda+PyCharm+Qt Designer+pyuic)

    文章目录 引言 1. 安装python环境 1.1 安装anaconda 1.2 创建虚拟环境 2. 安装PyQt库 3. 安装pycharm 4. 在pycharm中配置PyQt 4.1 配置PyQ ...

  8. python的requests快速上手、高级用法和身份认证

    https://blog.csdn.net/qq_25134989/article/details/78800209 快速上手 迫不及待了吗?本页内容为如何入门 Requests 提供了很好的指引.其 ...

  9. 【Python五篇慢慢弹】快速上手学python

    快速上手学python 作者:白宁超 2016年10月4日19:59:39 摘要:python语言俨然不算新技术,七八年前甚至更早已有很多人研习,只是没有现在流行罢了.之所以当下如此盛行,我想肯定是多 ...

最新文章

  1. Spring boot删除员工
  2. linux7开启ntp服务,【NTP】CentOS7.2配置NTP服务
  3. antd From 中 Form.Item里含有自己封装的组件,获取不到值的解决方法
  4. 升级ADT22.6后,Android模拟器无法创建
  5. 剑指Offer - 面试题64. 求1+2+…+n(递归)
  6. word、excel、ppt 办公文件 在线预览
  7. C++_004异常处理
  8. 因果推断笔记——python 倾向性匹配PSM实现示例(三)
  9. Android中native进程内存泄露的调试技巧
  10. zbbz加载成功用不了_cad加载应用程序不能加载
  11. matlab支持向量回归,支持向量回归 MATLAB代码
  12. Python模拟登录淘宝
  13. 如何在iPhone上禁用Apple CarPlay
  14. 如何编写一个短线交易策略(收藏)
  15. 聊聊旷厂黑科技 | 五彩斑斓的黑,旷视“算”出来了!
  16. 文件上传漏洞揭密剖析(一)-文件上传漏洞原理
  17. java不是关键字_以下( )不是Java的关键字。_学小易找答案
  18. 【520521】程序员中的“芳心纵火犯”, 这就是面向对象编程吗?
  19. 一种编程语言必备的功能
  20. ValueError: At least one stride in the given numpy array is negative解决方案

热门文章

  1. SkyEye硬件模拟平台
  2. Android自动伸展动画,Android:展开/折叠动画
  3. Python-Django毕业设计“小世界”私人空间(程序+Lw)
  4. Dr. Agrawal(Dharma P. Agrawal)
  5. 关于云计算存储虚拟化技术三个层次上的实现
  6. android 屏幕没反应了,手机屏幕失灵了怎么办?安卓手机屏幕失灵解决方法
  7. Web前端和后端之区分
  8. CDR类CAD制作室内装修平面图
  9. 吴裕雄--天生自然 诗经:鹊踏枝·谁道闲情抛弃久
  10. 用Ultra-Light-Fast-Generic-Face-Detector-1MB寻找人眼