首页
/ Microsoft UniLM v1:统一语言模型预训练技术详解

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模型能够支持三种语言建模目标:

  1. 单向语言模型(从左到右):适用于文本生成任务
  2. 双向语言模型:适用于文本理解任务
  3. 序列到序列语言模型:适用于需要理解输入并生成输出的任务

这种统一架构使得模型能够共享参数和知识,在不同任务间实现更好的迁移学习效果。

环境配置

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提供了两种规模的预训练模型:

  1. Base版模型

    • 12层Transformer
    • 768维隐藏层
    • 12个注意力头
    • 1.1亿参数
  2. 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

技术优势

  1. 统一架构:单一模型支持理解和生成任务
  2. 高效预训练:通过注意力掩码实现多任务学习
  3. 迁移能力强:在低资源场景下表现优异
  4. 生成质量高:在多个生成任务上达到SOTA

UniLM的创新设计为后续的统一预训练模型研究提供了重要参考,其思想也被许多后续工作所借鉴和发展。