自然语言处理之预训练技术

引言

本文旨在根据论文粗略地整理自然语言处理中预训练技术的发展脉络及各模型的思路。

  1. NNLM
  2. Word2Vec
  3. ELMo
  4. GPT
  5. BERT
  6. XLNet(待读,泛化自回归预训练方法)
  7. CoVe(待读,用 MT 进行预训练)
  8. ERNIE (待读,加入了外部知识)
  9. MASS(待读,用来处理 seq2seq 问题)

Word Embedding

自然语言处理中早期的预训练技术是 Word Embedding,将词汇表中的单词或者短语映射到向量空间中,用以解决 One-hot 等技术所面临的稀疏性高、捕捉信息不足等缺点。

在谈 Word Embedding 之前,必须先简单地提一下神经概率语言模型,一是因为早期表现出色的 Word2Vec 的灵感来源其中,二是因为目前 NLP 里面大部分预训练都是用语言模型任务来完成。

语言模型,即是计算一个句子符合语言表达习惯概率的模型。在此,默认大家都具备统计语言模型的相关知识,不再赘述。

NNLM

NNLM

Paper Code Pretrained
A Neural Probabilistic Language Model (Citation: 4,750) \ \

该论文由 Bengio 等人于 2003 年发表在 JMLR 上,文中提出了一个神经网络语言模型(以下简称 NNLM),与 N-gram 一样,同样假设当前词出现的概率只与前 $n-1$ 个词语相关,从语料库中随机选取长度为 $n$ 的文本,即图中 $w_{t-n+1}, …, w_{t-2}, w_{t-1}$,根据这前 $n-1$ 个词预测下一个词 $w_{t}$。

NNLM

为了便于理解,将神经网络语言模型可以分为四层,即输入层、投影层、隐藏层、输出层。

  1. 输入层

    将每一个词转换为 One-hot 的形式作为输入。

  2. 投影层

    存在共享矩阵 $C$(大小为 $\vert V \vert \times m$,其中 $\vert V \vert$ 表示词表的大小,$m$ 表示词向量的维度),又称为 look-up table,随机初始化后反向传播学习得到。通过从矩阵中取出对应的一行,将词 $w$ 的 One-hot 表示转换为 $C(w)$,即词 $w$ 所对应的词向量。

  3. 隐藏层

    将词向量 $C(w_{t-n+1}), …, C(w_{t-2}), C(w_{t-1})$ 首尾拼接,形成长度为 $(n-1) \times m$的向量,记作 $x$,用 tanh 作为激活函数进行非线性变换。

  4. 输出层

    得到输出层 $\vert V \vert$ 个节点,其中每个节点 $y_i$ 表示下一个词为 $i$ 的未归一化对数概率,

    \[y = b + Wx + U \tanh (d+Hx)\]

    其中,$W$ 表示从 Embedding 层到输出层的直连边权重矩阵。在实验部分发现,如果使用该直连边,可以减少一半的迭代次数;但如果没有该直连边,可以生成性能更好的语言模型。

    最后通过 softmax 归一化得到预测结果。

该神经网络语言模型不仅得到语言模型,同时还有副产物——词向量,也就是我们之后谈论的重点。

Word2Vec

Word2Vec

Paper Code Pretrained
Efficient Estimation of Word Representations in Vector Space (Citation: 10,842) C Word2Vec
Distributed representations of words and phrases and their compositionality (Citation: 13,356) \ \

词向量相对于 One-hot 而言具有两大优点:

  • 降维操作,减少稀疏性;
  • 包含相似度信息。

很多下游任务将词向量作为输入取得了不错的效果,因此,如何更快更好地获取词向量成为热点,2013 年 Google 团队发表了 Word2Vec 工具,针对 NNLM 中模型复杂度过高的缺点进行改进,取消了非线性隐藏层,并摒弃传统的语言模型任务,设计出了 CBOW 模型和 Skip-gram 模型,其中 CBOW 模型的核心思想是根据上下文预测中间的词(类似完形填空),而 Skip-gram 模型则相反,根据中间的词预测其上下文。其中 Skip-gram 在大型语料库中表现更好。

Word2Vec

与 NNLM 相同,从输入层到映射层所学习到的矩阵则是我们最终期待的词向量。

获得 look up table 之后,将其作为下游任务 One-hot 层到 Embedding 层的初始化参数,一般进行两类操作:

  • Frozen,保持该参数固定不动;
  • Fine-Tuning,在任务相关模型上训练时一起更新参数。

这就是在 BERT 等模型出来之前,用 Word Embedding 来做预训练的典型流程。

但,不难看出,Word2Vec 存在着一个巨大的缺点:多义词问题。在训练过程中,同一单词的不同上下文的信息都编码进了一个固定的词向量中,混合了多种语义,导致无法根据不同的上下文区分不同的语义。

Contextualized Word Embeddings

为了解决上述问题,开始了根据上下文对 Word Embedding 进行动态调整的研究思路,先后出现了 ELMo、GPT、BERT 等一系列的预训练模型,自 2018 年起在众多 NLP 任务上表现强势,开启了 NLP 新的预训练技术时代。

该预训练模型区别于如何在下游任务中使用分为两类:

  • Feature-based,提取出向量作为特征补充到下游任务中,代表为 ELMo 模型;
  • Fine-Tuning,在预训练模型的基础上进行微调,代表为 GPT 与 BERT 模型。

但其界限并不明显,BERT 模型同样也可用于作为特征补充到下游任务中,ELMo 也同样可用于微调,我们以论文中所阐述的方法为准进行介绍。

ELMo

ELMo

Paper Code Pretrained
Deep contextualized word representations (Citation: 788) Pytorch/TF AllenNLP/TF-Hub

该论文于 2018 年被评为 NAACL 最佳论文,文中基于认为词向量应当包含丰富的句法与语义信息并且能通过上下文对多义词建模的目的,提出了 ELMo 预训练模型。

ELMo 分为两个阶段,第一阶段利用双向语言模型进行预训练,第二阶段是从预训练模型中提取对应单词的 Word Embedding 作为新特征补充到下游任务中。

ELMo

该图为预训练阶段,利用大量无标签语料库,采用双层双向 LSTM 联合训练双向语言模型,其目标函数为:

\[\begin{array}{l}{\sum_{k=1}^{N}\left(\log p\left(t_{k} | t_{1}, \ldots, t_{k-1} ; \Theta_{x}, \overrightarrow{\Theta}_{L S T M}, \Theta_{s}\right)+\log p\left(t_{k} | t_{k+1}, \ldots, t_{N} ; \Theta_{x}, \overleftarrow{\Theta}_{L S T M}, \Theta_{s}\right)\right)}\end{array}\]

第二阶段,将任务相关的语料输入已训练完成的网络中,每个单词 $t_k$ 都能从模型每层提取到与之对应的不同信息层次的 Embeddings:

  • 输入层通过 CNN-BIG-LSTM 获得的 Word Embedding,$h_{k,0}^{LM}$;
  • 第一层双向 LSTM 对应的 Syntax Embedding,\(\left[\overrightarrow{\mathbf{h}}_{k, 1}^{L M} ; \overleftarrow{\mathbf{h}}_{k, 1}^{L M}\right]\);
  • 第二层双向 LSTM 对应的 Semantics Embedding,\(\left[\overrightarrow{\mathbf{h}}_{k, 2}^{L M} ; \overleftarrow{\mathbf{h}}_{k, 2}^{L M}\right]\)。

将三个 Embeddings 按照学习到的权重 $\gamma$ 组合后,整合成为一个向量 $ELMo_k^{task}$:

\[{ELMo}_{k}^{task}=\gamma^{\operatorname{task}} \sum_{j=0}^{L} s_{j}^{task} \mathbf{h}_{k,j}^{LM}\]

最后,将向量 $ELMo_k^{task}$ 与上下文无关向量 $x_k$ 进行拼接后,作为输入传入下游模型中。

ELMo

该模型优雅地解决了词向量上下文无关的问题,同时作者在 6 个 NLP 任务上进行了实验,根据不同的任务搭建了不同的模型作为 baseline,再加入 ELMo,发现性能都有不同幅度地提升,并且都超过了 SOTA。

GPT

GPT

Paper Code Pretrained
Improving Language Understanding by Generative Pre-Training (Citation: 177) TF GPT

该论文提出的 Generative Pre-Training,同样分为了两个阶段,第一阶段利用单向语言模型进行无监督预训练,第二阶段通过有监督式 Fine-Tuning 的方式解决下游任务。

GPT 在 ELMo 上最大的改进在于采用了 Google 于 2017 年提出的 NLP 特征提取器新贵——Transformer,TF 相比于 RNN 和 CNN 而言,同时具备并行性强、捕获长距离特征能力强的优点。但 GPT 主要采用的是 Multi-layer Transformer Decoder,事后来看,此举对下文文本进行遮盖从而限制了对文本双向获取信息的能力。

GPT

该图为预训练阶段,利用大量无标签语料库,采用 multi-layer Transformer decoder,训练单向语言模型,其目标函数为:

\[L_{1}(\mathcal{U})=\sum_{i} \log P\left(u_{i} | u_{i-k}, \ldots, u_{i-1} ; \Theta\right)\]

GPT

Fine-Tuning 阶段,在设计下游任务模型的时候,针对不同的任务设定不同的输入结构,直接在预训练模型的基础上进行改造,最后一层接上 softmax 作为任务输出层,并利用第一步预训练好的参数初始化网络结构,将预训练所学知识引入下游任务中,再根据任务相关数据有监督式地训练进行参数微调,得到针对下游任务的已训练模型。

下游任务将语言模型作为辅助目标帮助微调,能够提升有监督模型的泛化能力,同时加速收敛。因此,该阶段目标函数为:

\[L_{2}(\mathcal{C})=\sum_{(x, y)} \log P\left(y | x^{1}, \ldots, x^{m}\right)\] \[L_{3}(\mathcal{C})=L_{2}(\mathcal{C})+\lambda * L_{1}(\mathcal{C})\]

GPT 同样表现出色,在 12 个任务中,9 个达到了 SOTA。

GPT

可以看出,GPT 的效果要比 ELMo 更好。

GPT

从上面的消除实验可以看出,Transformer 的性能比 LSTM 更好。

BERT

BERT

Paper Code Pretrained
BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding (Citation: 660) TF/Pytorch BERT

当了解了 ELMo 以及 GPT 后,发现 BERT 其实并不是前无古人的工作,事实上 BERT 的模型结构和预训练方法都与 GPT 非常相似,最大的改进就在于,针对 ELMo 与 GPT 的模型都未真正实现双向,BERT 提出了使用 Transformer Encoder 以及 Masked Language Model 的目标任务。

BERT 采用和 GPT 完全相同的两个阶段,第一阶段是双向语言模型预训练,第二阶段是采用 Fine-Tuning 的方式解决下游任务。

BERT

第一阶段的双向语言模型与训练,进行的 Masked Language Model 与 Next Sentence Prediction 两个任务,采用的是 Transformer Decoder 作为特征提取器,从而达到真正的双向,而且提升了对句子间关系有依赖的下游任务。

Task #1: Masked Language Model

随机选取语料中 15% 的单词进行处理,其中 80% 的单词被替换成 [MASK] 标记,10% 的单词被随机替换成语料库中其它单词,最后 10% 的单词保持不变。

但该做法仍然只能减缓在 Fine-Tuning 阶段看不到 [MASK] 的情况,而无法完全避免。

Task #2: Next Sentence Prediction

分两种情况选择句子对 A 与 B,50% 的情况下 B 确实在语料库中跟在 A 的后面,50% 的情况下 B 是从语料库中随机抽取的句子。

预训练的任务分别是预测被遮掩的单词以及是否为上下句。

BERT

Fine-Tuning 阶段与 GPT 一样,针对不同的任务设置不一样的输入与输出层。

BERT

在模型的输入表示方面,BERT 将两个句子用分隔符 [SEP] 分割,在最前和最后分别增加了两个标识符号 [CLS] 和 [SEP],其中 [CLS] 部分留作 Next Sentence Prediction 的预测输出使用,且每个单词为三个 Embedding 之和:

  • Token Embedding,采用 WordPiece embedding 作为词向量;
  • Segment Embedding,表示分属于 A 句或 B 句;
  • Position Embedding,对位置信息进行编码。

BERT 在 11 个 NLP 任务上取得了 SOTA,并且在各界都引起了广泛关注。

BERT

在预训练实验分析上可以看到,提出的两种目标任务都非常有效。

BERT

同时,作者也采用 Feature-based 的方法进行了实验,与 ELMo 进行对比,也表明其有效性。

XLNet

XLNet

Paper Code Pretrained
XLNet: Generalized Autoregressive Pretraining for Language Understanding (Citation: N/A) TF XLNet

番外篇

CoVe

CoVe

Paper Code Pretrained
Learned in Translation: Contextualized Word Vectors (Citation: 161) Pytorch/Keras CoVe

ERNIE

ERNIE

Paper Code Pretrained
ERNIE: Enhanced Language Representation with Informative Entities (Citation: 1) Pytorch ERNIE

MASS

MASS

Paper Code Pretrained
MASS: Masked Sequence to Sequence Pre-training for Language Generation (Citation: 2) \ \