aec nlp 源码 nlms nlp开源模型_语言模型


本着一颗开源之心,我司开源了中文版的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

aec nlp 源码 nlms nlp开源模型_json_02


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中的部分分类数据集和阅读理解数据集上进行了简单测试,具体效果如下:


aec nlp 源码 nlms nlp开源模型_数据_03


对CLUE中新闻摘要数据,训练了摘要模型,并进行的简单的测试,具体效果如下:


aec nlp 源码 nlms nlp开源模型_aec nlp 源码 nlms_04


具体生成的摘要如下:

标准摘要:


aec nlp 源码 nlms nlp开源模型_seq2seq模型_05


生成摘要: