ACL2020 Best Paper有一篇论文提名奖,《Don’t Stop Pretraining: Adapt Language Models to Domains and Tasks》。这篇论文做了很多语言模型预训练的实验,系统的分析了语言模型预训练对子任务的效果提升情况。有几个主要结论:

  • 在目标领域的数据集上继续预训练(DAPT)可以提升效果;目标领域的语料与RoBERTa的原始预训练语料越不相关,DAPT效果则提升更明显。

  • 在具体任务的数据集上继续预训练(TAPT)可以十分“廉价”地提升效果。

  • 结合二者(先进行DAPT,再进行TAPT)可以进一步提升效果。

  • 如果能获取更多的、任务相关的无标注数据继续预训练(Curated-TAPT),效果则最佳。

  • 如果无法获取更多的、任务相关的无标注数据,采取一种十分轻量化的简单数据选择策略,效果也会提升。

知乎专栏《高能NLP》

https://zhuanlan.zhihu.com/p/149210123

虽然在bert上语言模型预训练在算法比赛中已经是一个稳定的上分操作。但是上面这篇文章难能可贵的是对这个操作进行了系统分析。大部分中文语言模型都是在tensorflow上训练的,一个常见例子是中文roberta项目。可以参考

https://github.com/brightmart/roberta_zh

使用pytorch进行中文bert语言模型预训练的例子比较少。在huggingface的Transformers中,有一部分代码支持语言模型预训练(不是很丰富,很多功能都不支持比如wwm)。为了用最少的代码成本完成bert语言模型预训练,本文借鉴了里面的一些现成代码。也尝试分享一下使用pytorch进行语言模型预训练的一些经验。主要有三个常见的中文bert语言模型

  1. bert-base-chinese

  2. roberta-wwm-ext

  3. ernie

1 bert-base-chinese

(https://huggingface.co/bert-base-chinese)

这是最常见的中文bert语言模型,基于中文维基百科相关语料进行预训练。把它作为baseline,在领域内无监督数据进行语言模型预训练很简单。只需要使用官方给的例子就好。

https://github.com/huggingface/transformers/tree/master/examples/language-modeling

(本文使用的transformers更新到3.0.2)

方法就是

python run_language_modeling.py \--output_dir=output \--model_type=bert \--model_name_or_path=bert-base-chinese \--do_train \--train_data_file=$TRAIN_FILE \--do_eval \--eval_data_file=$TEST_FILE \--mlm

其中$TRAIN_FILE 代表领域相关中文语料地址。

2 roberta-wwm-ext

(https://github.com/ymcui/Chinese-BERT-wwm)

哈工大讯飞联合实验室发布的预训练语言模型。预训练的方式是采用roberta类似的方法,比如动态mask,更多的训练数据等等。在很多任务中,该模型效果要优于bert-base-chinese。

对于中文roberta类的pytorch模型,使用方法如下

import torch
from transformers import BertTokenizer, BertModel
tokenizer = BertTokenizer.from_pretrained("hfl/chinese-roberta-wwm-ext")
roberta = BertModel.from_pretrained("hfl/chinese-roberta-wwm-ext")

切记不可使用官方推荐的

tokenizer = AutoTokenizer.from_pretrained("hfl/chinese-roberta-wwm-ext")
model = AutoModel.from_pretrained("hfl/chinese-roberta-wwm-ext")

因为中文roberta类的配置文件比如vocab.txt,都是采用bert的方法设计的。英文roberta模型读取配置文件的格式默认是vocab.json。对于一些英文roberta模型,倒是可以通过AutoModel自动读取。这就解释了huggingface的模型库的中文roberta示例代码为什么跑不通。https://huggingface.co/models?

如果要基于上面的代码run_language_modeling.py继续预训练roberta。还需要做两个改动。

  • 下载roberta-wwm-ext到本地目录hflroberta,在config.json中修改“model_type”:"roberta"为"model_type":"bert"。

  • 对上面的run_language_modeling.py中的AutoModel和AutoTokenizer都进行替换为BertModel和BertTokenizer。

再运行命令

python run_language_modeling_roberta.py \--output_dir=output \--model_type=bert \--model_name_or_path=hflroberta \--do_train \--train_data_file=$TRAIN_FILE \--do_eval \--eval_data_file=$TEST_FILE \--mlm

3 ernie

(https://github.com/nghuyong/ERNIE-Pytorch)

ernie是百度发布的基于百度知道贴吧等中文语料结合实体预测等任务生成的预训练模型。这个模型的准确率在某些任务上要优于bert-base-chinese和roberta。如果基于ernie1.0模型做领域数据预训练的话只需要一步修改。

  • 下载ernie1.0到本地目录ernie,在config.json中增加字段"model_type":"bert"。

python run_language_modeling.py \--output_dir=output \--model_type=bert \--model_name_or_path=ernie \--do_train \--train_data_file=$TRAIN_FILE \--do_eval \--eval_data_file=$TEST_FILE \--mlm

最后,huggingface项目中语言模型预训练用mask方式如下。仍是按照15%的数据随机mask然后预测自身。如果要做一些高级操作比如whole word masking或者实体预测,可以自行修改transformers.DataCollatorForLanguageModeling。

本文实验代码库。拿来即用!

https://github.com/zhusleep/pytorch_chinese_lm_pretrain

往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑获取一折本站知识星球优惠券,复制链接直接打开:https://t.zsxq.com/yFQV7am本站qq群1003271085。加入微信群请扫码进群:

【NLP】Pytorch中文语言模型bert预训练代码相关推荐

  1. 【Whole Word Mask】中文 bert wwm 预训练代码,预训练你自己的模型

    基于 transformers 来进行 bert 的 wwm (全词掩码)预训练,让你的模型可以领域适配 提示:文章偏向于NLP进阶,大佬请绕路-- 文章目录 基于 transformers 来进行 ...

  2. 天池零基础入门NLP竞赛实战:Task4-基于深度学习的文本分类3-基于Bert预训练和微调进行文本分类

    Task4-基于深度学习的文本分类3-基于Bert预训练和微调进行文本分类 因为天池这个比赛的数据集是脱敏的,无法利用其它已经预训练好的模型,所以需要针对这个数据集自己从头预训练一个模型. 我们利用H ...

  3. CV和NLP中的无监督预训练(生成式BERT/iGPT和判别式SimCLR/SimCSE)

    文 | Smarter 在之前的文章中讲过unsupervised learning主要分为生成式和判别式,那么unsupervised pretrain自然也分为生成式和判别式.目前CV和NLP都出 ...

  4. 获得Bert预训练好的中文词向量

    安装肖涵博士的bert-as-service: pip install bert-serving-server pip install bert-serving-client 下载训练好的Bert中文 ...

  5. NLP专栏|图解 BERT 预训练模型!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:张贤,哈尔滨工程大学,Datawhale原创作者 本文约7000字 ...

  6. RoBERTa:一种鲁棒地优化BERT预训练的方法

    RoBERTa:一种鲁棒地优化BERT预训练的方法 文章目录 RoBERTa:一种鲁棒地优化BERT预训练的方法 前言 背景 实验 静态 VS 动态 Masking 输入形式与NSP任务 更大的bat ...

  7. 自然语言处理中的语言模型与预训练技术的总结

    目录 0. 背景 1. 统计语言模型(Statistical Language Model) 马尔科夫假设(Markov Assumption) N-Gram模型 拉普拉斯平滑(Laplace Smo ...

  8. Bert预训练新法则!

    论文简介:还应在遮蔽语言模型中使用 15% 的遮蔽概率吗? 论文标题:Should You Mask 15% in Masked Language Modeling? 论文链接:https://arx ...

  9. BERT 预训练学习(数据:样本构建、输入格式;算法:transformer、mlm和nsp任务)

    任务:MLM完形填空.下一句预测 数据:构建样本数据及label,输入格式 参考: 1)**https://github.com/DA-southampton/TRM_tutorial/tree/ma ...

最新文章

  1. Docker Remote API使用准备
  2. PHP监控linux服务器负载
  3. GetOverlappedResult函数详细解答
  4. hadoop使用lzo压缩文件笔记
  5. C语言Prims求最小生成树MST的算法(附完整源码)
  6. 【Linux】sudo用户权限管理
  7. 《从零开始学ASP.NET CORE MVC》课程介绍
  8. 算法--库函数实现全排列
  9. python假设有一段英文、其中有单独的字母_峰终定律是诺贝尔奖获得者丹尼尔卡尼曼提出的。他发现,我们对一件事的整体评价,是全过程中所有元素体验的平均分。...
  10. MySQL课堂练习 20162315
  11. ASP.NETSpring.NETNHibernate最佳实践(七)——第3章人事子系统(4)人事子系统小结...
  12. 优云automation实践技巧:简单4步完成自动化构建与发布
  13. unity 更换standard shader
  14. asp.net 微信jsapi支付
  15. 阿里云发布首款云电脑“无影”,价格仅传统电脑的一半
  16. json模块 dunms,loads, dum,load 函数介绍
  17. Quartus 13.0和Modelsim SE 10.1a 联合仿真
  18. 《一胜九败3》李彦宏百度在试错中前行-读书笔记
  19. PlayMaker之开发案例
  20. 深度优先搜索练习之神奇的矩环

热门文章

  1. Dart.Powerweb.livecontrols应用
  2. 229. Majority Element II
  3. 列表(list)之一定义 添加 删除 排序 反转 索引等其他操作
  4. tkinter窗口居中方法
  5. CentOS中安装mysql
  6. psd页面切割成html技巧总结
  7. 如何快速查看mysql数据文件存放路径?
  8. jsdk php,jsdk.php · webeautiful/dashpianku - Gitee.com
  9. python末位1的位置_用Python黑了整个学院学姐的电话和QQ,爬虫牛皮!兄弟们耗子尾之!...
  10. 细胞冻存及细胞计数的技巧