Microsoft UniLM v1:统一语言模型预训练技术详解
2025-07-05 08:22:38作者:霍妲思
项目概述
Microsoft UniLM(Unified Language Model)是微软研究院开发的一种统一预训练语言模型,其核心创新在于通过不同的注意力掩码机制,实现了对自然语言理解(NLU)和自然语言生成(NLG)任务的统一建模。UniLM v1版本在2019年发布,在多项自然语言生成任务上取得了当时的SOTA(State-of-the-Art)结果。
技术原理
UniLM的核心思想是通过设计不同的注意力掩码模式,使同一个Transformer模型能够支持三种语言建模目标:
- 单向语言模型(从左到右):适用于文本生成任务
- 双向语言模型:适用于文本理解任务
- 序列到序列语言模型:适用于需要理解输入并生成输出的任务
这种统一架构使得模型能够共享参数和知识,在不同任务间实现更好的迁移学习效果。
环境配置
Docker环境搭建
推荐使用Docker容器运行UniLM代码,以下是配置步骤:
# 创建并启动Docker容器
alias=`whoami | cut -d'.' -f2`
docker run -it --rm --runtime=nvidia --ipc=host --privileged \
-v /home/${alias}:/home/${alias} \
pytorch/pytorch:1.1.0-cuda10.0-cudnn7.5-devel bash
在容器内部,需要安装必要的依赖:
# 基础工具安装
apt-get update && apt-get install -y vim wget ssh
# 安装混合精度训练所需的apex库
cd $(mktemp -d)
git clone -q https://github.com/NVIDIA/apex.git
cd apex
git reset --hard 1603407bf49c7fc3da74fceb6a6c7b47fece2ef8
python setup.py install --user --cuda_ext --cpp_ext
# 安装Python依赖
pip install --user tensorboardX six numpy tqdm path.py pandas \
scikit-learn lmdb pyarrow py-lz4framed methodtools py-rouge \
pyrouge nltk
python -c "import nltk; nltk.download('punkt')"
pip install -e git://github.com/Maluuba/nlg-eval.git#egg=nlg-eval
预训练模型
UniLM提供了两种规模的预训练模型:
-
Base版模型:
- 12层Transformer
- 768维隐藏层
- 12个注意力头
- 1.1亿参数
-
Large版模型:
- 24层Transformer
- 1024维隐藏层
- 16个注意力头
- 3.4亿参数
这些模型使用Wikipedia和BookCorpus语料进行预训练,采用与BERT相同的模型配置和WordPiece词表。
下游任务微调
UniLM支持多种自然语言生成任务的微调,下面介绍几个典型任务的应用方法。
1. 摘要生成任务(Gigaword数据集)
Gigaword是一个新闻标题生成数据集,UniLM在该任务上表现出色:
10K样本微调结果:
模型 | ROUGE-1 | ROUGE-2 | ROUGE-L |
---|---|---|---|
Transformer | 10.97 | 2.23 | 10.42 |
UniLM | 34.21 | 15.28 | 31.54 |
完整数据集微调结果:
模型 | ROUGE-1 | ROUGE-2 | ROUGE-L |
---|---|---|---|
MASS | 38.73 | 19.71 | 35.96 |
UniLM | 38.90 | 20.05 | 36.00 |
微调命令示例:
python biunilm/run_seq2seq.py --do_train --fp16 --amp \
--bert_model bert-large-cased --new_segment_ids \
--data_dir ${DATA_DIR} --src_file train.src --tgt_file train.tgt \
--output_dir ${OUTPUT_DIR} \
--model_recover_path ${MODEL_RECOVER_PATH} \
--max_seq_length 192 --max_len_b 64 \
--train_batch_size 128 --learning_rate 0.00003 \
--num_train_epochs 30
2. 问题生成任务(SQuAD数据集)
在SQuAD问题生成任务上,UniLM同样取得了优异表现:
标准数据划分结果:
模型 | BLEU-4 | METEOR | ROUGE-L |
---|---|---|---|
前最佳 | 18.37 | 22.65 | 46.68 |
UniLM | 22.78 | 25.49 | 51.57 |
微调命令示例:
python biunilm/run_seq2seq.py --do_train \
--bert_model bert-large-cased --new_segment_ids \
--data_dir ${DATA_DIR} --src_file train.pa.tok.txt --tgt_file train.q.tok.txt \
--max_seq_length 512 \
--train_batch_size 32 --learning_rate 0.00002 \
--num_train_epochs 10
模型解码与评估
完成微调后,可以使用以下命令进行解码和评估:
# 解码
python biunilm/decode_seq2seq.py --bert_model bert-large-cased \
--input_file ${DATA_DIR}/test.src --model_recover_path ${MODEL_RECOVER_PATH} \
--max_seq_length 192 --max_tgt_length 32 \
--batch_size 64 --beam_size 5
# 评估
python gigaword/eval.py --pred ${PRED_FILE} --gold ${GOLD_FILE} --perl
技术优势
- 统一架构:单一模型支持理解和生成任务
- 高效预训练:通过注意力掩码实现多任务学习
- 迁移能力强:在低资源场景下表现优异
- 生成质量高:在多个生成任务上达到SOTA
UniLM的创新设计为后续的统一预训练模型研究提供了重要参考,其思想也被许多后续工作所借鉴和发展。