一文盘点预训练神经语言模型

©PaperWeekly 原创 · 作者 | 西南交一枝花

学校 | 西南交通大学CCIT实验室

研究方向 | 命名实体识别

本文是参考了现有的相关研究,加以作者的理解,如发现问题,望不吝赐教。

语言模型(Language Model, LM)包括统计语言模型和神经语言模型,能够表示自然语言文本在语料中的概率分布,可用于判断语句是否为正常描述,也可理解为判断文本是否为“人话”。

本文主要介绍了神经语言模型以及预训练语言模型 PTMs,首先列出所需的预备知识(只是简单介绍);紧接着,概述统计语言模型 n-gram;然后,以词向量为过渡引出神经语言模型;最后,对各种模型进行介绍(自回归语言模型:NNLM, Word2Vec, ELMO, GPT, XLNet、自编码语言模型:BERT)。

补充两个概念:

自回归语言模型:根据前一段文本序列预测下一词的概率(反之亦然,即根据后一段文本序列预测上一个词概率),这类语言模型被称为自回归语言模型。简单记之,单向语言模型。

有人可能会有疑问,ELMO 利用了上文和下文信息,应该是自编码模型。虽然 ELMO 是做了两个方向的信息整合(通过拼接),但是我认为两者并未交互,所以本质是一个自回归语言模型的结合。此外,在知乎的一个提问中,也进行了一些探讨,希望在评论区有一些新的讨论。

提问:“双向语言模型的实现像 ELMo,考虑两个单向的 LSTM 来完成,为什么不直接用一个 BiLSTM 实现呢?

https://www.zhihu.com/question/337165915

自编码语言模型:BERT 通过 mask 机制,能够依据当前词的上下文,预测当前词。这其实就是典型的去噪自编码器 DAE 思想,mask 词可以看作加入的噪声

目录

  1. 预备知识

  2. n-gram 语言模型

  3. 词向量

  4. 神经概率语言模型

  5. Word2Vec

  6. Glove

  7. ELMO

  8. BERT

  9. XLNET

  10. GPT-1, GPT-2, GPT-3

  11. 总结

预备知识

  • 马尔科夫假设、马尔科夫链

  • 贝叶斯公式

  • 哈夫曼树

  • 激活函数 sigmoid\softmax

  • 交叉熵损失函数

  • 神经网络结构:CNN\LSTM\GRU\Transformer\Attention机制等

n-gram语言模型

以下主要参考 [1]《统计自然语言处理》。

语言模型可以描述为字符串 s 的概率分布 p(s),p(s) 表示 s 作为一个正确句子出现的频率,正确句子即符合我们常理认知的文本描述。若 s 由 n 个词构成,p(s) 可以表示为:

从上式可以看出计算第 i 个词的概率,依赖于前 i-1 个词。容易想到,如果前面有 i-1 个词,就会存在 种不同的序列,上述概率计算必须考虑在所有序列下的第i个词的概率,计算量过大,很难从训练集数据中估计出这些参数。

考虑到这种情况,可以将前 i-1 文本序列按照某种方式映射到某种等价类,且这个等价类的序列远远小于前面所提到的所有不同序列。

n 元文法 n-gram 是上述某种映射方式的一种,当 n=1 时,可以认为 独立于前面位置的序列,这种一元文法又被称为 unigram;当 n=2 时, 仅与前一个词语 有关,二元文法可以称为一阶马尔科夫链,记做 bigram;n=3 时,二阶马科夫链,记作 trigram。

以 bigram 为例,上述计算公式可以被转换为:

词向量 Word Vector

之所以先提一下词向量,主要是为下面章节做个铺垫。构造词向量的方法有很多,下面主要基于的神经网络语言模型角度出发进行介绍。

词,可以看作一个输入单元,在英文当中一个单词为一个单元,中文中词语或字可以看作一个单元。词的嵌入表示从独热编码到词向量(分布式表示),使得现在 NLP 中各个领域的表现性能有了很大的进展。

形如:one-hot ,其中 N 表示词的个数,可以看出该表示非常稀疏,且无法度量词之间的距离(表述远近)。

Word Vector

N 表示词的个数,D 表示向量的维度,D 远远小于 N,即低维、稠密、实值表示。

词向量是在 word2vec 之后,被大家所熟知(可能一致专注于该研究的学者一直都熟知,但对于类似我这种萌新,以为词向量是从 word2vec 开始的),最早由Hinton [2] 于 1986 年提出。

那么在神经语言模型之前,如何得到词向量呢?

介绍两种方式:LSA 潜在语义分析LDA 隐含狄利克雷分布主题模型

以 LSA 为例,通过统计文档中词出现的频词,构建词频矩阵,利用 SVD 矩阵分解,左边的矩阵就可以看作词向量表示。

神经概率语言模型

Bengio [3] 在 2013 年发表了该工作,提出了基于神经网络的语言模型,其中词向量是语言模型的副产物。

该模型很简单,包括:输入层、投影层、隐藏层、输出层。该方面的解读已经很多了,这里也不多加赘述,主要说一下该模型相对于 n-gram 模型的优点:

  • 词的相似性,在 n-gram中 无法捕获词语之前的相似性,举例:A cat is running in the room 和 A dog is running in the room。如果前者在语料中出现 1000 词,后者出现一次。p(前者)远远大于 p(后者)。但在神经概率语言模型中,这两者应该是大致相等的。

  • 词向量的平滑性,n-gram 在计算时对于统计频次出现 0 的情况,需要进行数据平滑。

Word2Vec

一句话说明 word2vec 思想:word2vec 可以理解为模型在学习 word 和 context 的 co-occurrence。 非原创,忘记在哪里看到的。

首先,推荐以下文献或解读,在整个过程中,确实看了很多参考文献。

  • 论文 [4] 提出了两种框架 CBOW 和 Skip-gram。

  • 论文 [5] 提出了两种提高词向量训练的方式 Hierarcial Softmax 和 Negative sampling。

  • 解读 [6],强推!讲的很系统,清晰,也是本文上半部分的主要参考。这里给出百度网盘的链接。

    链接:https://pan.baidu.com/s/1MJmi-jOKshOGuF9VEpyoHQ提取码:ba8y

  • 解读 [7] 讲的也是很清楚,总体推导不错。

基本上,上述文献综合起来能够很清楚解释说明 Word2vec 模型,本文也不想多做摘录。下面主要总结 word2vec 的几大特点:

1. 改变了原有的投影层之后的拼接操作,改为累加求和,无需隐藏层,输出为层次 softmax,结构上来说,从线性结构转树形结构。

上述操作,带来一个问题,在后向传播时,由于取得是各个词向量之和,每个词向量表示如何更新呢?原文中使用的方法很简单,正向的时候用的是各个词向量的求和,那么后向传播的时候将总梯度依次对所有词向量进行更新,即把总和的梯度贡献到每一个词的向量表示。

2. sigmoid 函数的近似计算,使用查表方式计算,省去了大量的计算。

3. 哈希表存储词典

4. 低频词筛选,设置阈值滤除,mincount 通常为 1,2。高频词,设置词频阈值,当前此以指定概率被丢掉,概率计算为 

  1. 自适应学习率

  2. 多线程并行

GloVe [8]

GloVe 全称 Global Vectors for Word Representation,结合了全局词频统计信息和局部上下文信息,可以理解为了综合了 LSA 和 word2vec 的词向量表示。

文中使用全局矩阵分解和局部上下文窗口方法,主要解决了两个问题:

1. LSA 在分解 cooccurrence matrix 时,使用了 SVD 方法,该方法在处理大语料时存在计算代价过高的不足,此外,LSA 中所有单词的统计权重都是一样的。还有一点很重要基于词频统计的语言模型不具备 word analogy 能力,举例说明  king - queen = man - woman。

2. Word2Vec 无论是 CBOW 还是 Skip-gram 框架都是基于局部的上下文信息,没有利用到全局的统计信息。

推荐一个 GloVe 的解读,文中给出了相应示例,较为清晰、详细。

https://blog.csdn.net/u014665013/article/details/79642083

6.1 GloVe工作流程

第一步:构建cooccurrence matrix

表示单词 j 出现在单词 i 上下文窗口中的次数,Glove 在实验中使用了词频权衰减因子,简单来说就是随着 j 随着在 i 窗口的距离增加,其频数权重降低。j 与 i 的距离为 d,decay = 1/d。

第二步:构建cooccurrence probability matrix

上述表示单词 j 出现在单词 i 上下文中的概率。

第三步:从共现概率矩阵中进一步提取信息

文中引入了探测词(Probe words)k,并以此定义了 k 与 i 和 j 关系。分为了四种情况:1. 单词 i , k 相关; 2. 单词 i, k 不相关;3. 单词 j, k 相关;4. 单词j, k 不相关。

文中引出 ratio 概念,表示三者之前的关系,计算方式为:

三者之间的具有下列的关系:

如果三者的词向量 通过某种函数计算 ratio 也能得到相同的规律,说明词向量与共现概率矩阵具有一致性,也就说明这两者具有相同的信息表示。

基于上述思想,可以得到假设:

然后,引入目标函数,最小化二者之间的距离,可选择均方误差。

下面讨论 函数的形式是怎样的?

主要考虑了一下几点(总结文中给出的解读):

  1. 计算复杂度,上述为 NNN;

  2. 函数需要保持向量的相似性;

  3. ratio 值为标量,函数需要保持一致。

最终 函数的形式为:

这里还需要注意类推,即,将 带入后,得到以下形式:

通过类推,可以得到: 。最后引入偏差项,最终目标函数形式为:

其中,为了考虑词频高的词权重应该大的问题,文中引入了 权重函数,当词频大于或等于阈值时值为 1,小于阈值时为频数与阈值比值的 次方,论文实验取值为 0.75 时,表现最好。

ELMo [9]

官方解读:https://allennlp.org/elmo

一句话介绍:ELMo是一个深度的、上下文相关的词表示模型

三个主要特点:

  1. 动态词向量表示,当前词向量与当前句子语义相关,并非一成不变。

  2. 深度,词表示使用了所有层的信息,(个人感觉不算深度,官方用的 Deep 概括该特点)。

  3. 字符嵌入,完全基于字符嵌入,便于处理 OOV。

模型结构: 

所有词以字符方式输入,经过 n-gram CNN 之后,再经过全连接层降维,作为 LSTM 层的输入。

BiLSTM 从当前词之前的文本序列和当前词之后的文本序列,两个方向对当前输入句子建模。论文中认为双层 BiLSTM,第一层抽取句法信息,第二层为语义信息,文中通过举例最相近词说明了这两点。具体,如下图所示。

▲ 论文表格4

最后,使用最大化对数似然函数,同时优化双层 BiLSTM。

针对下游特定任务,论文给出了线性组合的方法,即将三种表示糅合为单个向量(图中黄色箭头所示),原文中的公式为:

其中 为 softmax 归一化权重, 下游任务对整个 ELMo 向量的缩放权重,两者都是实验调参值。 表示前向和后向的向量拼接。

ELMo 同之前的语言模型不同,其在大语料集上经过训练得到模型中间参数,主要是双层 BiLSTM 参数;同之后的语言模型也不同,ELMo 没有预训练的词向量,只有预训练的模型权重,之后的语言模型同时具有预训练模型权重和预训练词向量。

BERT  [10]

按照时间顺序应该是 GPT-1 的介绍,但最后决定将 GPT 当作系列来讲,所以放到了后面。

BERT 全称:Bidirectional Encoder Representations from Transformers 不得不说,google 真是起名界的 master,参照 5T、4C。

在了解 BERT 之前,建议读者熟悉下 Transformer,Google 于 2017 年发表在 NIPS 的文献 [11],摈弃了CNN、RNN,使用注意力机制、前馈网络、残差网络。强推 HarvardNLP 的解读与代码实现,链接如下:

http://nlp.seas.harvard.edu/2018/04/03/attention.html

关键词:双向语言模型、自编码语言模型、掩码语言模型 MLM,下句预测 NSP 任务。

本文首先从两个部分介绍 BERT 的模型结构,包括:1. 核心结构、输入结构、输出结构。如下图所示。

▲ BERT模型结构

BERT的核心结构为基于 Transformer 的、多层的、双向的、编码结构。包含了两个版本的 BERT_base(L=12, H=768, A=12)和 BERT_large(L=24, H=1024, A=16),L 表示 Transformer 的层数,H 表示隐藏层大小,A 表示多头注意力的头数。

介绍完 BERT 的中间核心结构,下面对输入表示进行概述,如下图所示。其输入形式为 [CLS] SEN1 [SEP] SEN2 [SEP],之所以有两个句子输入是为了满足下句预测任务。

除此之外,包含了三个嵌入:Token Embedding、Segment Embeddings 和 Position Embeddings。值得注意的是,Token 不是 word 级别,而是使用 WordPiece 切分的,共包含了 30000 个子词。该操作可以有效降低 OOV。

[CLS] 为分类占位 Token,与该嵌入相关的最后隐层状态表示分类;[SEP] 为句子分割标识。

▲ Input resentataions

最后结合模型的两个任务,介绍输出层。

1. 掩码语言模型,常规的条件概率语言模型只能为单向的(从左到右或从右到左),这是因为如果双向的话,会使得每个词间接地看到自己,造成信息穿越。

本文所采用的方案为随机 mask 一些词,然后使用上下文去预测这些词。在一个序列中随机选择 15% 的词进行 mask。但这样会造成一个问题,训练和在下游任务微调时不一致,因为下游任务中不会出现 [mask]。

论文采取一个策略来缓解,当选择第i个词做掩码时,该词 80% 用 [mask] 替代,10% 随机从词汇表中选择一个词替代,还有 10% 保持不变。

2. 上句预测下句,文中介绍是通过建模 QA 和推理任务提出的 NSP,为了更好地理解句子之间的关系。在构造训练集时,A 句子和 B 句子,选择 50%B 为真实下一句,另外 50% 随机选择不是下一句。虽然非常简单,但是文中实验表明在 QA 和推理任务上表现有不错提升。

最后的最后,给出 BERT 在下游任务上的微调形式,BERT 是一个通用的框架,可以用于文本分类、句子对分类、问答任务、序列标注任务。这也为后面的 PTMs 做了一个规范,PTMs 在做 finetune 时几乎都能涵盖所有的任务形式。

▲ 不同任务的微调形式

XLNET  [12]

动机:BERT 实现双向文本的自编码语言模型,依赖于输入序列的 mask 操作,该操作会忽略 mask 位置的依赖关系,并且导致训练和微调不一致,在生成任务表现不好(顺序生成文本的任务)。

再公式化说明一下,给定文本序列 ,首先 AR 语言模型在建模时,为最大化似然。公式描述为:

其中, 表示当前词之前的特征表示(通过 RNN、Transformer 等特征抽取器),e(x) 表示 x 的嵌入表示。

再来看 BERT 表示:对于文本序列 x,通过 mask 操作后得到序列 ,被掩码后的 token 表示为

▲ 敲公式太累了,截图吧,来自源论文

其中, 表示第 t 个 token 被 mask。

基于上述问题,Carnegie Mellon 和 Google AI Brain 提出了 XLNet。在介绍  XLNet 之前,先提一下所使用的基础模块 Transformer-XL。

Transformer-XL [13] 作为 Transformer 的改进版,主要解决 Transformer 需要输入序列固定长度的问题,即长于输入设定长度的序列只能被截断,或放到下一个 segment。但这样会使得原本的序列信息被切断,因为 segment 之间无法交互。

为解决上述问题,Trm-XL 提出了 segment 级别的递归机制和相对位置编码。Segment-level Recurrence 的大致思想为:当一个输入序列过长时,分割为两个 segments,在计算当前 segment 时,将缓存的上一个 segment 隐层状态拿出,但上层信息仅做前向计算,不再进行反向传播优化。

第二,基于 transformer 的特征抽取网络由于使用自注意力机制无法捕获位置信息,需要在输入端加入位置编码信息,Transformer 使用的绝对位置编码。

Transformer-XL 认为当切分序列后,如果还是用绝对位置编码,第二个 segment将无法区分与第一个 segment 的位置信息。于是提出了相对位置编码,在计算每一层的 attention score 时仅考虑 query 和 key 的相对位置关系。

推荐一个详细解读:

https://zhuanlan.zhihu.com/p/84159401

简单介绍完 Transofmer,转回本小节的主题 XLNet。关于 XLNet 可以介绍两点,即排列语言模型(也可以称为乱序语言模型,因为输入序列是随机排列)和双自注意力通道。

排列语言模型 Permutation Language Model

作者为了使得自回归模型能够利用上下文信息,且又不想像 BERT 那样引入 [mask] 噪声,提出了一种序列因式分解进行重新排列的策略。下面将通过一个原文附录中一个例子说明:

假设有一个经过 ID 化的文本序列 [1,2,3,4],通过全排列操作,我们可以得到 24 种序列。下图列出 4 种可能的排列。其中 前面没有序列,所以赋值为初始值。

▲ 论文图4

可以看出,通过这种方式不仅可以利用上下文信息,还没有引入 [mask] 噪声。

双流自注意力 Two-Stream Self-Attention

虽然排列语言模型能够满足所提需求,但是标准的 Transformer 可能无法 work。存在以下的问题,当我们求下一个 token 的概率时 ,代入 softmax 计算为:

其中, 表示经过 mask 过后的 的隐层表示。需要注意, 现在已不再依赖于它要预测的位置 。这会带来一个问题,无论待预测的目标位置在哪里,所得到的分布都是相同的。

考虑两个不同的排列 ,这两个排列满足下述关系:

这就会导致在计算当前词概率时,发生目标词不同,但是概率相同的问题。

如 t=1 时,序列(1,2,3)和(1,3,2)。

考虑到上述问题,论文提出了重新构造一个预测下个词的公式:

可以看出,两者的主要区别在于 部分, 表示目标位置,这是一个新的表示。

要实现该表示需要主要两个点:

  • 预测 token 时,只能使用 位置信息,不能使用文本

  • 预测 token 时,模型应该把 编码,这样才能包含所有的上下文信息。

为满足上述两点需求,论文提出了两种表示方式:

  • 文本表示 ,简写为

  • query表示 ,简写为

Q,K,V 表示 query, key, value。

这两部分总体表示如下图所示,(a):文本表示,(b)query表示,(c)总体表示。

对于双流注意力的公式细节,可见源论文附录 A.2,介绍的非常清晰,这里就不多加叙述。先放个截图,大概了解下。

▲ Two-Stream Attention

GPT [14] , GPT-2 [15] , GPT-3 [16]

10.1 GPT

GPT 的模型非常简洁,采用多层单向 transformer 的解码层(不同于 bert 采用 transformer 编码层)进行特征抽取,自监督的学习,以最大化似然为优化目标。其模型结构可以用 BERT 给出的对比图看出,是一个典型的自回归语言模型。

▲ BERT-GPT-ELMO

GPT 在无标签的大语料集上做训练,然后在下游有标签任务上做微调。原文针对不同的下游任务,对输入做出说明,如下图所示。

其中 start 是开始符,delim 为分隔符,extract 为结束符。

10.2 GPT-2

推荐一个英文解读,细节地介绍 GPT-2 的实现。

https://jalammar.github.io/illustrated-gpt2/

GPT-2 从名称可知论文认为语言模型本身蕴含了各种 NLP 的任务(Language Models are Unsupervised Multitask Learners),特别在摘要中提及使用爬取的百万网页训练的语言模型,可以在 CoQA 数据集上输入问题,得到 F155% 的答案。

总体看下来,相较 GPT,GPT-2 在模型上并无特别大的改进,主要是使用了更大的语料集更大的模型,以及在输入和模型上做了一些改进。

语料集:通过爬虫获得了大量的网页文本,论文取名为 WebText,包含了 4500 万链接,经过去重及一些预处理操作,最终得到 8 百万的文本,共计 40GB 的数据。(为了测试下游任务,移除了 wikipedia 的文本)

输入表示:没有使用一些预处理操作:转小写、分词、等操作,而是使用 BPE(Byte Pair Encoding)做切分,BPE 的过程是按频率合并单个字母。

模改:相较GPT的transformer,将层归一化移到了每块的输入;通过乘以因子 ,缩放残差层的权重,N 为残差的层数;词汇表扩充到 50257;输入序列长度增加到 1024;同时 batchsize 增加到 512。(都是一些更大的参数值)

通过在零样本下游任务的实验验证,表明预训练语言模型在自然语言处理任务上的有效性。

10.3 GPT-3

GPT-3 的发布,看出 OpenAI 在数据更多、模型更大坚持走下去的决心。如同 5T 的论文格式一样,72 页的实验报告,1750 亿参数量,让人望而生畏。更如邱锡鹏老师所说,NVIDIA 恐成最大赢家。

继续沿用陈述句标题,论文重心来到小样本学习。首先抛出两段式(预训练+微调)预训练语言模型的存在的问题:

1. 在下游任务上仍然需要一定量的标签数据;2. 微调阶段常规是先用大学习率预训练模型和下游模型一起训练,然后再固定预训练模型参数,用小学习率继续优化下游模型,如果下游任务数据较小时仍会过拟合,PTMs 此时的泛化能力并不好。

既然提到了上述问题,论文就着重在 Zero Shot, One Shot, few Shot 三个场景下进行 PTMs 的一系列验证,这里仅给出前三个图的对比。

大模型更加有效地利用上下文信息

▲ 1

▲ 2

对比微调与直接使用

总得来说,当 GPT-3 出来后,一些人宣称无需再 finetune,GPT-3 就够了,就我看来仍有很长路要走,直接在下游任务上推理,工程应用就是一个很大的问题! 

再说些马后炮,由于本文在 GPT-3 出来后两个月所写,目前在工业界中应用 BERT 仍是首选,微调仍是必不可少,目前研究的热点是对这些大模型的压缩,比较典型的有 mobileBERT 等。

总结

本文是对神经网络语言模型的一份总结,特别是近两年较火的 PTMs,由于各个预训练语言模型迭代较快,仅对其中几个流行度较高的模型进行介绍(在中文上 ERINE 挺好)。

本文并未专注于每个研究的细节,更多地是想将这些研究工作串联起来,反应这些年该方面研究的趋势。此外,这里推荐邱锡鹏老师的综述 Pre-trained Models for Natural Language Processing: A Survey,文中从多个维度对 PTMs 进行了分类与剖析。

参考文献

[1] 宗成庆,《统计自然语言处理》

[2] Hinton,《Learning distributed representations of concepts》
[3] Benjio,《A neural probabilistic language model》
[4] 《efficient estimation of word representations in vector space》
[5] 《distributed representations of words and phrases and their compositionality》
[6] peghoty,《word2vec中的数学原理》
[7] 《word2vec parameter learning explained》
[8] 《GloVe: Global Vectors forWord Representation》
[9] 《Deep contextualized word representations》
[10] 《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》
[11] 《Attention is all your need》
[12] 《XLNet: Generalized Autoregressive Pretraining for Language Understanding》
[13] 《Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context》
[14] 《Improving Language Understanding by Generative Pre-Training》
[15] 《Language Models are Unsupervised Multitask Learners》
[16] 《Language Models are Few-Shot Learners》

更多阅读

#投 稿 通 道#

 让你的论文被更多人看到 

如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。

总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。 

PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学习心得技术干货。我们的目的只有一个,让知识真正流动起来。

???? 来稿标准:

• 稿件确系个人原创作品,来稿需注明作者个人信息(姓名+学校/工作单位+学历/职位+研究方向) 

• 如果文章并非首发,请在投稿时提醒并附上所有已发布链接 

• PaperWeekly 默认每篇文章都是首发,均会添加“原创”标志

???? 投稿邮箱:

• 投稿邮箱:hr@paperweekly.site 

• 所有文章配图,请单独在附件中发送 

• 请留下即时联系方式(微信或手机),以便我们在编辑发布时和作者沟通

????

现在,在「知乎」也能找到我们了

进入知乎首页搜索「PaperWeekly」

点击「关注」订阅我们的专栏吧

关于PaperWeekly

PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页