本文不探讨原理知识,这方面可以自行看论文。本文旨在运用开源UniLM实现中文文本摘要。这里要感谢开源者:知乎详解
0. 准备工作
- UniLM开源地址:UniLM中文模型
- 环境:python3.6、pytorch、win/linux
步骤:
git clone
上面的github项目,将目录改名为UNILM
,然后新建data
文件夹- 下载torch模型:百度网盘,密码
etwf
。下载后文件夹重命名为“model”,然后把内容拖入UNILM/data/
文件夹 - 下载微调数据集:百度云盘,密码
htmh
。下载后重命名为“weibo”,然后把weibo文件夹拖入UNILM/data/
文件夹。如何用自己数据集进行fine-tuning会在后面讲 - 在data下新建文件夹:
UNILM/data/output_dir
pip install transformers==2.5.1
,其他版本的transformers会报错
最终结构如下图:
1. 实现文本摘要
1.1 fine-tuning
所谓微调,就是在已有模型上,利用自己的数据集继续训练,以更偏向自己的数据集。这里开源的“pytorch_model.bin”已经能直接用了,如果想直接拿来用,可以跳过这一步,进入下一步。
这里用的是weibo的数据集进行微调,打开"weibo/train_data.json"可以发现,其每一行类似于:
{'src_text':'正文部分','tgt_text':'摘要部分'}
因此,如果我们想用自己的数据集进行微调,也需要将自己的数据集处理成这个形式,而且还不用自己分词分句(貌似开源代码里已经处理好了,有空读源码了再来记录)。
我们可以在UNILM
目录下运行powershell或者git-bash,执行命令,且说明如下:
python -u run_seq2seq.py --data_dir ./data/weibo/ --src_file train_data.json --model_type unilm --model_name_or_path ./data/model/ --output_dir ./data/output_dir/ --max_seq_length 512 --max_position_embeddings 512 --do_train --do_lower_case --train_batch_size 2 --learning_rate 1e-5 --num_train_epochs 3
- github上是后台运行,但我想实时调试,所以去掉的nohup相关部分
- 由于我是windows平台,因此每个地址前面都要加上
.
标识当前目录,否则无法识别地址。 - data_dir:微调数据集存放地址
- src_file:训练文件
- model_name_or_path:model地址。我们想拿pytorch_model.bin继续训练,就把地址指向该模型所在文件夹。
- output_dir:微调后训练出的新model的存放文件夹
- train_batch_size:如果出现CUDA内存不足,就修改它吧。我的辣鸡6g显存只能运行batchsize=2,github上可是32…人都麻了。
- num_train_epochs:你想继续训练几轮。默认继续3轮差不多了。
1.2 文本摘要
上面微调结束后,会生成"model.3.bin"的model文件,我们就是要用它了。如果你跳过了微调阶段,那就直接拿"pytorch_model.bin"就行,注意下面参数里修改一下模型所在的文件地址就可。
- 首先在"weibo"文件夹下新建空白"predict.json"文件,否则最后输出时候会因为找不到文件报错。
- 运行如下命令:
python -u decode_seq2seq.py --model_type unilm --model_name_or_path ./data/model/ --model_recover_path ./data/output_dir/model.3.bin --max_seq_length 512 --input_file ./data/weibo/test_data.json --output_file ./data/weibo/predict.json --do_lower_case --batch_size 8 --beam_size 5 --max_tgt_length 128
然后打开predict.json就可以发现,准确性蛮高的。