本着一颗开源之心,我司开源了中文版的base_unilm模型。
链接地址如下:https://github.com/YunwenTechnology/Unilm
UniLM论文全名为Unified Language Model Pre-training for Natural Language Understanding and Generation,译为自然语言理解与生成的统一预训练语言模型,来自于微软研究院。
论文地址:paper
UniLM模型之所以强大,是因为它既可以应用于自然语言理解(NLU)任务,又可以应用于自然语言生成(NLG)任务。结构与BERT一致,是由一个多层Transformer网络构成,通过修改训练时的Mask矩阵,使模型拥有更多的能力。详细论文解读如下:
刘聪NLP:UniLM论文阅读笔记zhuanlan.zhihu.com
Pre-train
预训练数据:CLUE中的维基百科数据和新闻语料数据,链接:github。
训练参数:在模型预训练过程中,在一个训练batch中,使用1/3的数据进行双向语言模型优化,1/3的数据进行序列到序列语言模型优化,1/6的数据进行从左向右的单向语言模型优化,1/6的数据进行从右向左的单向语言模型优化。
模型结构与BERT-base模型一致,由一个12层768隐藏节点和12个头的Transformer编码器组成,并由训练好的BERT-base模型初始化参数。token掩码的概率为15%,在被掩掉的token中,有80%使用[MASK]替换,10%使用字典中随机词进行替换,10%保持越来token不变,与BERT模型一致。此外,在80%的情况下,每次随机掩掉一个token,在剩余的20%情况下,掩掉一个二元token组或三元token组。
学习率是3e-5,最大长度是512,batch_size大小是80。共训练为16.4万步。使用4张Nvidia Telsa V100 16GB GPU卡,通过混合精度训练。
Fine-tune
如何使用该模型进行NLU任务?
可以直接使用BERT代码,只需加载unilm的model、config、vocab即可。如何使用该模型进行NLG任务?
nohup python3 -u run_seq2seq.py --data_dir /data/unilm/data_file/ --src_file train_data.json --model_type unilm --model_name_or_path /data/unilm/yunwen_unilm/ --output_dir /data/unilm/output_dir/ --max_seq_length 512 --max_position_embeddings 512 --do_train --do_lower_case --train_batch_size 32 --learning_rate 1e-5 --num_train_epochs 3 > log.log 2>&1 &
详细代码见GitHub
python3 -u decode_seq2seq.py --model_type unilm --model_name_or_path /data/unilm/yunwen_unilm/ --model_recover_path /data/unilm/output_dir/model.bin --max_seq_length 512 --input_file /data/unilm/data_file/test.json --output_file /data/unilm/data_file/predict_.json --do_lower_case --batch_size 32 --beam_szie 5 --max_tgt_length 128
注:根据论文,在NLU任务时,type_token_id为[0,1];在NLG任务时,type_token_id为[4,5]。
Test-Result
在CLUE中的部分分类数据集和阅读理解数据集上进行了简单测试,具体效果如下:
对CLUE中新闻摘要数据,训练了摘要模型,并进行的简单的测试,具体效果如下:
具体生成的摘要如下:
标准摘要:
生成摘要: