实战:采用字mask和wwm mask在中文领域内finetune bert模型
随着google发布bert模型,bert改进版本已经到来,bert-wwm、 bert-wwm-ext、 Roberta-wwm-ext、ENRIE、XLNET各种变种版本都出现了,本人主要这对google开源的bert版本,修改其源码,数据处理上上采用字mask和wwmmask,框架依然采用tensoflow,但是将源码中estimator显式训练,个人认为estimator训练过程是个黑盒子,对于模型损失函数和准确率不好调试。
代码地址
https://github.com/yanqiuxia/BERT-PreTrain
与google开源代码更改地方
1. 移除 google estimator,采用自己train方法
google 开源bert run_pretraining.py代码
改写的train 代码 可以显式观察模型训练情况
2.数据预处理
google源码中文只支持字mask,对于wwm mask需要修改,所以将源码改成既支持字mask,和wwm mask。字mask和源代码相同,下面主要讲wwm mask。
wwm 数据预处理脚本 modi_create_pretraining_data.py,输入数据格式是:一行为一句,篇章之间分割采用行分割,空格为已经分好词语。采用 modi_tokenization.py进行分词,例如词'市长'将被分为'市','##长'两个词,在进行'create_masked_lm_predictions'需要把'##'去掉,具体见代码。
将##x替换为x
3.输入模型数据的修改
预先将字mask和wwm mask数据存储为tf_record格式,读入数据直接采用reader_tfrecord
read tfrecord
生成训练和验证batch