XLNet 阅读笔记

CottonGene 发布于11月前

背景:自编码与自回归语言模型的缺陷

BERT 预训练方式属于自编码AE (Auto Encoder)。原因在于 BERT 预训练目标为根据上下文语境复原被 [MASK]随机遮挡的文字。此过程与降噪自编码机的原理一致,属于 自编码模型 。自编码模型的缺陷是 [MASK] 标记出现在预训练中,却未出现在下流任务的微调中(比如阅读理解,文本分类等任务)。可能出现预训练与微调任务目标不一致的问题。另外,BERT对多个 [MASK] 的预测互相独立。比如文中举例,对语句 “New York is a city." 进行掩码,得到“ [MASK] [MASK] is a city.“,BERT 预测两个 [MASK] 下的 New 与 York 是独立进行的,非联合概率。

 

而 XLNet 预测York时,使用了之前得到的 New 的信息。

GPT 或 LSTM 的训练方式属于自回归 AR (Auto Regressive)。即一个语句出现的概率可以因式分解为一长串条件概率的乘积。

XLNet 阅读笔记

比如,x = “My daughter likes WuHan” 的概率可以表示成:

XLNet 阅读笔记

自回归模型的缺陷是要么从前往后做自回归,要么从后往前做自回归,没有像 BERT 一样使用双向编码。文章举了一个例子说明单向自回归在抽取式问答任务中的失败原因。

比如前向自回归的 GPT 阅读了上面的句子后,我们提问 “Who likes WuHan"? 自回归因式分解中不存在 XLNet 阅读笔记 这样的分解方式,不能以最直接的方式给出答案。

XLNET 的改进

自回归乱序分解

综合自编码和自回归模型的优缺点,XLNET 采用 NADE 模型提出的排列组合语言模型 。具体来说,普遍使用的自回归要么从前往后,要么从后往前,但对于长度为 N 的语句,自回归的因式分解方式有 XLNet 阅读笔记 种。比如上面的例子,设 XLNet 阅读笔记 ,构造自回归因子分解的时候,可以有多种排列方式选择:

XLNet 阅读笔记 是上面例子中给的从前往后构造自回归因式分解方法。

XLNet 阅读笔记 是从后往前构造自回归的方式。

XLNet 阅读笔记 是打乱了顺序的一种自回归方式。

构造排列组合自回归的过程是从 XLNet 阅读笔记 个排列方式中抽样,对每一个输入语句,随机选择了一种自回归方式。因为不同的自回归排列共享神经网络的参数,所以经过训练,第 i 个位置的目标词 XLNet 阅读笔记 学会了从这个序列中所有的排列抓取上下文信息,不仅有顺序,倒序,还有抽样上下文的乱序。这样神经网络在做抽取式问答任务时,可能直接给出 的概率。

因为没有使用 [MASK], 所以解决了BERT 预训练与微调目标不匹配的问题。

因为是自回归,得到的前一个[MASK]的值,会用作下一个[MASK] 的预测,可计算联合概率。

这种排列组合的语言模型学自 NADE。跟 NADE 不同的是,NADE 给出的词是乱序的,等价于词袋模型。在 XLNET 中,自回归概率的因式分解是乱序的,但每个字在语句中的顺序被保留了下来。保留方法是提供每个字在原始语句序列中的位置向量 (Position Embedding)。

双流注意力

使用乱序自回归之后,传统的 Transformer 自注意力机制会失效,因为上下文顺序打乱了,缺少待预测词的位置信息。改进的方式是预测 XLNet 阅读笔记 时加入位置编码 XLNet 阅读笔记

 

但如何用神经网络表示函数 XLNet 阅读笔记 呢?在 BERT 里,词内容编码和位置编码是相加之后一起输到下一层的,两者不分家。XLNet 在预测 XLNet 阅读笔记 时,希望两者分家,只用位置编码;知道 的内容编码和位置编码后,预测其他词的内容编码时又希望两者不分家,同时使用 的内容编码和位置编码。 为了兼顾,只好搞出双流注意力,时分时合。

下载运行

代码可以从作者 Github 下载, https:// github.com/zihangdai/xl net

运行如下脚本运行,需要 4 个 NVIDIA V100 GPU。注意 github 上提供的脚本里写的是 model_config.json,但下载的预训练权重文件夹里给出的是 xlnet_config.json。下方的脚本已经做了修正。

export LARGE_DIR="path_to/pretrained_models/xlnet_cased_L-24_H-1024_A-16"
export GLUE_DIR="path_to/lustre/bert/glue_data"
CUDA_VISIBLE_DEVICES=0,1,2,3 python run_classifier.py \
  --do_train=True \
  --do_eval=False \
  --task_name=sts-b \
  --data_dir=${GLUE_DIR}/STS-B \
  --output_dir=proc_data/sts-b \
  --model_dir=exp/sts-b \
  --uncased=False \
  --spiece_model_file=${LARGE_DIR}/spiece.model \
  --model_config_path=${LARGE_DIR}/xlnet_config.json \
  --init_checkpoint=${LARGE_DIR}/xlnet_model.ckpt \
  --max_seq_length=128 \
  --train_batch_size=1 \
  --num_hosts=1 \
  --num_core_per_host=4 \
  --learning_rate=5e-5 \
  --train_steps=1200 \
  --warmup_steps=120 \
  --save_steps=600 \
  --is_regression=True

目前运行遇到问题,GPU 显存总显示不够。等顺利运行后再来更新。

参考文献

【1】 XLNet: Generalized Autoregressive Pretraining for Language Understanding

查看原文: XLNet 阅读笔记

  • tinycat