layout: post # 使用的布局(不需要改)
title: 预训练语言模型小酌 # 标题
subtitle: 预训练语言模型小酌🍺 # 副标题
date: 2020-04-10 # 时间
author: BY NSX # 作者
header-img: img/post-bg-2015.jpg # 这篇文章标题背景图片
catalog: true # 是否归档
tags: # 标签
- 预训练
- 语言模型


本文为 Pre-trained Models for Natural Language Processing: A Survey 和相关模型的笔记

一、为什么要进行预训练?
二、PTMs 有哪两大范式?
三、PTMs 按照任务类型如何分类?
四、PTMs 有哪些拓展?
五、如何对 PTMs 进行迁移学习?
预训练模型详解

image.png

一、为什么要进行预训练?

NLP算法面试必备!PTMs:NLP预训练模型的全面总结 —- JayJay

深度学习时代,为了充分训练深层模型参数并防止过拟合,通常需要更多标注数据喂养。在 NLP 领域,标注数据更是一个昂贵资源。PTMs 从大量无标注数据中进行预训练使许多 NLP 任务获得显著的性能提升。总的来看,预训练模型 PTMs 的优势包括:

  1. 在庞大的无标注数据上进行预训练可以获取更通用的语言表示,并有利于下游任务;
  2. 为模型提供了一个更好的初始化参数,在目标任务上具备更好的泛化性能、并加速收敛;
  3. 是一种有效的正则化手段,避免在小数据集上过拟合(一个随机初始化的深层模型容易对小数据集过拟合)

二、PTMs 有哪两大范式?

NLP算法面试必备!PTMs:NLP预训练模型的全面总结 —- JayJay

PTMs 的发展经历从浅层的词嵌入到深层编码两个阶段,按照这两个主要的发展阶段,我们归纳出 PTMs 两大范式:「浅层词嵌入」和「预训练编码器」。

1、浅层词嵌入( Non-Contextual Embeddings)

浅层词嵌入,这一类 PTMs 范式是我们通常所说的“词向量”,其主要特点是学习到的是上下文独立的静态词嵌入,其主要代表为 NNLM、word2vec(CBOW、Skip-Gram)、Glove 等。这一类词嵌入通常采取浅层网络进行训练,而应用于下游任务时,整个模型的其余部分仍需要从头开始学习。因此,对于这一范式的 PTMs 没有必要采取深层神经网络进行训练,采取浅层网络加速训练也可以产生好的词嵌入 。

参考《语言模型:过去、现在、未来》

  • 独热编码(One-hot Encoding):最简单的一种单词表示法,一个单词用长度为n的向量表示,其中只有一个位置为1,其余位置为0,n为语料中词库的大小。
  • 马尔可夫与语言模型:人类历史上第一个对语言模型进行研究,他提出n元模型(n-gram model),假设序列上每个位置的单词只依赖于前n−1个位置的单词 2020-04-10-🍺预训练语言模型小酌 - 图2%3D%5Cprod%7Bi%3D1%7D%5Enp(w_i%7Cw%7Bi-n%2B1%7D%2Cw%7Bi-n%2B2%7D%2C…%2Cw%7Bi-1%7D)#card=math&code=p%28w1%2Cw2%2C…%2Cwn%29%3D%5Cprod%7Bi%3D1%7D%5Enp%28wi%7Cw%7Bi-n%2B1%7D%2Cw%7Bi-n%2B2%7D%2C…%2Cw%7Bi-1%7D%29&id=aIW53)
  • 香农与语言模型:假设语言(单词序列)是由一个随机过程产生的数据,n元模型的熵的定义为:2020-04-10-🍺预训练语言模型小酌 - 图3%3D-%5Csum%7Bp(w1%2Cw2%2C…%2Cw_n)%C2%B7q(w1%2Cw2%2C…%2Cw_n)%7D#card=math&code=H_n%28p%2Cq%29%3D-%5Csum%7Bp%28w1%2Cw2%2C…%2Cw_n%29%C2%B7q%28w1%2Cw2%2C…%2Cw_n%29%7D&id=LMzrZ) ,这里p表示生成数据的真实概率分布。熵表示一个概率分布的不确定性,交叉熵表示一个概率分布相对于另一个概率分布的不确定性。熵是交叉熵的下界。如果一个语言模型比另一个语言模型能更准确地预测单词序列数据,那么它就应该有更小的交叉熵。香农的研究为语言模型学习提供了评价工具。
  • 神经语言模型:n元模型的表示和学习能力是有限的。传统的方法是从语料中统计n元模型中的条件概率,对未见过的n元组的概率通过平滑的方法估算。模型的参数个数是指数级的 2020-04-10-🍺预训练语言模型小酌 - 图4#card=math&code=O%28V%5En%29&id=rv7yM),其中 2020-04-10-🍺预训练语言模型小酌 - 图5 是词表的大小。当2020-04-10-🍺预训练语言模型小酌 - 图6 增大时,无法准确地学到模型的参数。Bengio等人的神经语言模型从两个方面对n元模型予以改进。一是用一个低维的实值向量表示一个单词或单词的组合;二是在使用词向量的基础上,通过神经网络来表示语言模型,大幅减少模型的参数. 2020-04-10-🍺预训练语言模型小酌 - 图7%3Df%5Ctheta(w%7Bi-n%2B1%7D%2Cw%7Bi-n%2B2%7D%2C…%2Cw%7Bi-1%7D)#card=math&code=p%28wi%7Cw%7Bi-n%2B1%7D%2Cw%7Bi-n%2B2%7D%2C…%2Cw%7Bi-1%7D%29%3Df%5Ctheta%28w%7Bi-n%2B1%7D%2Cw%7Bi-n%2B2%7D%2C…%2Cw%7Bi-1%7D%29&id=eE1w5)
  • Word2Vec:基本思想是对出现在上下文环境里的词进行预测。对于每一条输入文本,我们选取一个上下文窗口和一个中心词,通过单词和上下文彼此进行预测,包括CBOW 和 Skip-Gram 两种算法。

浅层词嵌入的主要缺陷为:

  • 词嵌入与上下文无关,每个单词的嵌入向量始终是相同,因此不能解决一词多义的问题。
  • 通常会出现 OOV 问题,为了解决这个问题,相关文献提出了字符级表示或 sub-word 表示,如 CharCNN、FastText 和 Byte-Pair Encoding 。
    image.png

2、预训练编码器(Contextual Embeddings)

第二类 PTMs 范式为预训练编码器,主要目的是通过一个预训练的编码器能够输出上下文相关的词向量,解决一词多义的问题。这一类预训练编码器输出的向量称之为「上下文相关的词嵌入」。这一类「预训练编码器」范式的 PTMs 主要代表有 ELMOGPT-1BERTXLNet 等。
image.png
上图中给出了 NLP 各种编码器间的对比。PTMs 中预训练编码器通常采用 LSTM 和 Transformer(Transformer-XL),其中 Transformer 又依据其 attention-mask 方式分为 Transformer-Encoder 和 Transformer-Decoder 两部分。

三、PTMs 的训练任务如何分类?

NLP算法面试必备!PTMs:NLP预训练模型的全面总结 —- JayJay

PTMs 按照任务类型可分为 2 大类:监督学习 和 无监督学习/自监督学习。

监督学习在 NLP-PTMs 中的主要代表就是 CoVe,CoVe 作为机器翻译的 encoder 部分可以应用于多种 NLP 下游任务。除了 CoVe 外,NLP 中的绝大多数 PTMs 属于自监督学习。

自监督学习是无监督学习的一种方法,自监督学习主要是利用辅助任务从大规模的无监督数据中挖掘自身的监督信息,通过这种构造的监督信息对网络进行训练,从而可以学习到对下游任务有价值的表征。因此,从“构造监督信息”这个角度来看,自监督也可看作是监督学习和无监督学习的一种融合。严格地讲,从是否由人工标注来看,自监督学习属于无监督学习的范畴。

综合各种自监督学习的分类方式,笔者将 NLP-PTMs 在自监督学习中分为两种类型:基于上下文(Context Based)和基于对比(Contrastive Based)。

1、基于上下文(Context Based)

基于上下文的 PTMs,主要基于数据本身的上下文信息构造辅助任务,在 NLP 中我们通常引入语言模型作为训练目标。PTMs 中的语言模型主要分为三大类:
image.png

第一类:自回归语言模型(Autoregressive LM)

在ELMO/BERT出来之前,大家通常讲的语言模型其实是根据上文内容预测下一个可能跟随的单词,就是常说的自左向右的语言模型任务,或者反过来也行,就是根据下文预测前面的单词,这种类型的LM被称为自回归语言模型。auto-regressive的loss的定义如下:

2020-04-10-🍺预训练语言模型小酌 - 图11%3D%5Csum%7Bt%3D1%7D%5E%7BT%7D%20%5Clog%20p%7B%5Ctheta%7D%5Cleft(x%7Bt%7D%20%7C%20%5Cmathbf%7Bx%7D%7B%3Ct%7D%5Cright)%3D%5Csum%7Bt%3D1%7D%5E%7BT%7D%20%5Clog%20%5Cfrac%7B%5Cexp%20%5Cleft(h%7B%5Ctheta%7D%5Cleft(%5Cmathbf%7Bx%7D%7B1%3A%20t-1%7D%5Cright)%5E%7B%5Ctop%7D%20e%5Cleft(x%7Bt%7D%5Cright)%5Cright)%7D%7B%5Csum%7Bx%5E%7B%5Cprime%7D%7D%20%5Cexp%20%5Cleft(h%7B%5Ctheta%7D%5Cleft(%5Cmathbf%7Bx%7D%7B1%3A%20t-1%7D%5Cright)%5E%7B%5Ctop%7D%20e%5Cleft(x%5E%7B%5Cprime%7D%5Cright)%5Cright)%7D%0A#card=math&code=%5Cmax%20%7B%5Ctheta%7D%20%5Clog%20p%7B%5Ctheta%7D%28%5Cmathbf%7Bx%7D%29%3D%5Csum%7Bt%3D1%7D%5E%7BT%7D%20%5Clog%20p%7B%5Ctheta%7D%5Cleft%28x%7Bt%7D%20%7C%20%5Cmathbf%7Bx%7D%7B%3Ct%7D%5Cright%29%3D%5Csum%7Bt%3D1%7D%5E%7BT%7D%20%5Clog%20%5Cfrac%7B%5Cexp%20%5Cleft%28h%7B%5Ctheta%7D%5Cleft%28%5Cmathbf%7Bx%7D%7B1%3A%20t-1%7D%5Cright%29%5E%7B%5Ctop%7D%20e%5Cleft%28x%7Bt%7D%5Cright%29%5Cright%29%7D%7B%5Csum%7Bx%5E%7B%5Cprime%7D%7D%20%5Cexp%20%5Cleft%28h%7B%5Ctheta%7D%5Cleft%28%5Cmathbf%7Bx%7D%7B1%3A%20t-1%7D%5Cright%29%5E%7B%5Ctop%7D%20e%5Cleft%28x%5E%7B%5Cprime%7D%5Cright%29%5Cright%29%7D%0A&id=ODTmr)

GPT 就是典型的自回归语言模型。ELMO尽管看上去利用了上文,也利用了下文,但是本质上仍然是自回归LM,这个跟模型具体怎么实现有关系。ELMO是做了两个方向(从左到右以及从右到左两个方向的语言模型),但是是分别有两个方向的自回归LM,然后把LSTM的两个方向的隐节点状态拼接到一起,来体现双向语言模型这个事情的。所以其实是两个自回归语言模型的拼接,本质上仍然是自回归语言模型。

自回归语言模型有优点有缺点,缺点是只能利用上文或者下文的信息,不能同时利用上文和下文的信息,当然,貌似ELMO这种双向都做,然后拼接看上去能够解决这个问题,因为融合模式过于简单,所以效果其实并不是太好。它的优点,其实跟下游NLP任务有关,比如生成类NLP任务,比如文本摘要,机器翻译等,在实际生成内容的时候,就是从左向右的,自回归语言模型天然匹配这个过程。而Bert这种DAE模式,在生成类NLP任务中,就面临训练过程和应用过程不一致的问题,导致生成类的NLP任务到目前为止都做不太好。

第二类:自编码语言模型(Autoencoder LM)

自回归语言模型只能根据上文预测下一个单词,或者反过来,只能根据下文预测前面一个单词。相比而言,Bert通过在输入X中随机Mask掉一部分单词,然后预训练过程的主要任务之一是根据上下文单词来预测这些被Mask掉的单词,如果你对Denoising Autoencoder比较熟悉的话,会看出,这确实是典型的DAE的思路。那些被Mask掉的单词就是在输入侧加入的所谓噪音。类似Bert这种预训练模式,被称为DAE LM(旨在采用部分损坏的输入,旨在恢复原始的未失真输入)。

DAE LM的loss的定义如下:(如果当前 token 被预测,则 2020-04-10-🍺预训练语言模型小酌 - 图12否则 2020-04-10-🍺预训练语言模型小酌 - 图132020-04-10-🍺预训练语言模型小酌 - 图14为原始文本被替换后的输入)
2020-04-10-🍺预训练语言模型小酌 - 图15

这种DAE LM的优缺点正好和自回归LM反过来,它能比较自然地融入双向语言模型,同时看到被预测单词的上文和下文,这是好处。缺点是啥呢?主要在输入侧引入[Mask]标记,导致预训练阶段和Fine-tuning阶段不一致的问题,因为Fine-tuning阶段是看不到[Mask]标记的。DAE吗,就要引入噪音,[Mask] 标记就是引入噪音的手段,这个正常。

两种不同的预训练目标的优劣势对比如下:

  1. 独立假设:BERT 中联合条件概率 2020-04-10-🍺预训练语言模型小酌 - 图16#card=math&code=p%28%5Coverline%7B%5Cmathbf%7Bx%7D%7D%20%7C%20%5Chat%7B%5Cmathbf%7Bx%7D%7D%29&id=UIDol) 假设在给定的 x^ 下,遮挡的词条 2020-04-10-🍺预训练语言模型小酌 - 图17 是相关独立的,而 AR(auto-regressive) 语言模型则没有这样的假设。
  2. 输入噪声:BERT 在预训练是使用了特殊标记 [MASK],在下游任务微调时不会出现,而 AR 语言模型则不会存在这个问题。
  3. 上下文依赖:AR 语言模型仅考虑了词条左侧的上下文,而 BERT 则可以捕获两个方向的上下文。

第三类:排列语言模型(PLM)

为了能够结合自回归LM和DAE LM两者的优点,XLNet 提出了排序语言模型 Permuted Language Model(PLM)。对于一个长度为 T 序列 x,共有 2020-04-10-🍺预训练语言模型小酌 - 图18 种不同的方式进行 AR 分解,随机选择一部分作为模型预训练的输入,如果模型共享不同分解顺序的参数,那么模型就能学习到两侧所有位置的信息。令 2020-04-10-🍺预训练语言模型小酌 - 图19 为长度为 T 的索引序列 2020-04-10-🍺预训练语言模型小酌 - 图20 的所有可能排列,2020-04-10-🍺预训练语言模型小酌 - 图212020-04-10-🍺预训练语言模型小酌 - 图22 分别表示一个排列 2020-04-10-🍺预训练语言模型小酌 - 图23 第 t 个和前 t−1 个元素。则排列语言模型的优化目标为:

2020-04-10-🍺预训练语言模型小酌 - 图24%5Cright%5D%0A#card=math&code=%5Cmax%7B%5Ctheta%7D%20%5Cquad%20%5Cmathbb%7BE%7D%7B%5Cmathbf%7Bz%7D%20%5Csim%20%5Cmathcal%7BZ%7D%7BT%7D%7D%5Cleft%5B%5Csum%7Bt%3D1%7D%5E%7BT%7D%20%5Clog%20p%7B%5Ctheta%7D%5Cleft%28x%7Bz%7Bt%7D%7D%20%7C%20%5Cmathbf%7Bx%7D%7B%5Cmathbf%7Bz%7D_%7B%3Ct%7D%7D%5Cright%29%5Cright%5D%0A&id=oY4LM)

PLM一样采用单个Transformer模型作为主干结构,但是从训练方法上来说,是个很另类也很有创意的做法,是种“形为AR,实为AE”的做法。在语言模型预训练过程中,它看上去遵循AR从左到右的输入过程,这符合一般生成任务的外在表现形式,但是在内部通过Attention Mask,实际做法其实是AE的做法,无非是把AE的做法隐藏在Transformer内部。它和AE从细节来说,主要有两个区别:首先,预训练过程中,输入句子去掉了Mask标记,改为内部Attention Mask,以保持预训练过程和下游任务Fine-tuning的一致性;其次,也是它和AE的最主要区别,PLM认为被Mask掉的单词之间是相互有影响的,先产生的被Mask掉的单词,应该对后生成的被Mask掉的单词,在预测的时候发生作用,而标准的AE则认为被Mask掉的单词是相互独立的,相互之间不产生作用。
image.png

最后,我们对基于上述三类语言模型的 PTMs 进行总结:
image.png

2、基于对比(Contrastive Based)

基于对比(Contrastive Based),不同于 Context Based 主要基于数据本身的上下文信息构造辅助任利用,Contrastive Based 主要利用样本间的约束信息构造辅助任务,这类方法也是 Contrastive learning(CTL)。CTL 假设观察到的文本对(正样本)在语义上比随机采样的文本(负样本)更相似。CTL 背后的原理是「在对比中学习」。相较于语言建模,CTL 的计算复杂度更低,因而在预训练中是理想的替代训练标准。

CTL 通过构建正样本(positive)和负样本(negative),然后度量正负样本的距离来实现自监督学习:可以使用点积的方式构造距离函数,然后构造一个 softmax 分类器,以正确分类正样本和负样本。鼓励相似性度量函数将较大的值分配给正例,将较小的值分配给负例:
image.png

基于对比的PTMs 主要有如下 4 类形式:

第一类: Deep InfoMax (DIM)

DIM 方法来源于 CV 领域,对于全局的特征(编码器最终的输出)和局部特征(编码器中间层的特征),DIM 需要判断全局特征和局部特征是否来自同一图像。

InfoWord 将 DIM 引入到 NLP 中,用 Mutual Information 的一个下界 InfoNCE 来重新解释 BERT 和 XLNET 的 objective,并提出一个新的 DIM objective 以最大化一个句子的 global representation 和其中一个 ngram 的 local representation 之间的 Mutual Information。

第二类:Replaced Token Detection (RTD)

噪声对比估计(Noise-Contrastive Estimation,NCE)通过训练一个二元分类器来区分真实样本和假样本,可以很好的训练词嵌入。RTD 于与 NCE 相同,根据上下文语境来预测 token 是否替换 。

  • word2vec* 中的 negative sampling 可看作是 RTD,负样本从词表中进行带权采样。
  • ELECTRA* 提出了一种新的预训练任务框架,构建生成器-判别器,生成器通过 MLM 任务对被 mask 的 token 进行预测,迭代器判断原始句子中的每个 token 是否被 replace 过。生成器相当于对输入进行了筛选,使判别器的任务更难,从而学习到更好的表示。生成器-判别器共享 embedding,生成器部分采用 small-bert,判别器部分对每一个 token 采用 sigmoid 计算 loss。finetune 阶段只采用判别器部分。RTD 也被看作解决 MLM 中「MASK」在预训练和 finetune 间差异的一种手段。
  • WKLM* 在实体 level 进行替换,替换为具有相同实体类型的实体名称。

第三类:Next Sentence Prediction (NSP)

NSP 区分两个输入句子是否为训练语料库中的连续片段,第二个句子 50% 为第一句子实际的连续片段,50% 从其他语料随机选择。NSP 可以引导模型理解两个输入句子之间的关系,从而使对此信息敏感的下游任务受益,如 QA 任务。而 RoBERTa 表明:NSP 在对单个文档中的文本块进行训练时,去除 NSP 任务或在下游任务上可以稍微提高性能。

第四类:Sentence Order Prediction (SOP)

SOP 使用同一文档中的两个连续片段作为正样本,而相同的两个连续片段互换顺序作为负样本。NSP 融合了主题预测和相关性预测,主题预测更容易,这使得模型进行预测时仅依赖于主题学习。与 NSP 不同,SOP 使用同一文档中的两个连续段作为正样本,但顺序互换为负样本。采取 SOP 任务的 PTMs 有 ALBERT、StructBERT、BERTje。

最后,我们对基于对比(Contrastive Based)的四类 PTMs 进行总结:
image.png

四、PTMs 有哪些拓展?

NLP算法面试必备!PTMs:NLP预训练模型的全面总结 —- JayJay

1、引入知识

PTMs 通常从通用大型文本语料库中学习通用语言表示,但是缺少特定领域的知识。PTMs 中设计一些辅助的预训练任务,将外部知识库中的领域知识整合到 PTMs 中被证明是有效的。

  • ERNIE-THU 将在知识图谱中预先训练的实体嵌入与文本中相应的实体提及相结合,以增强文本表示。由于语言表征的预训练过程和知识表征过程有很大的不同,会产生两个独立的向量空间。为解决上述问题,在有实体输入的位置,将实体向量和文本表示通过非线性变换进行融合,以融合词汇、句法和知识信息。
  • LIBERT(语言知识的 BERT)通过附加的语言约束任务整合了语言知识。
  • SentiLR 集成了每个单词的情感极性,以将 MLM 扩展到标签感知 MLM(LA-MLM),ABSA 任务上都达到 SOTA。
  • SenseBERT 不仅能够预测被 mask 的 token,还能预测它们在给定语境下的实际含义。使用英语词汇数据库 WordNet 作为标注参照系统,预测单词在语境中的实际含义,显著提升词汇消歧能力。
  • KnowBERT 与实体链接模型以端到端的方式合并实体表示。
  • KG-BERT 显示输入三元组形式,采取两种方式进行预测:构建三元组识别和关系分类,共同优化知识嵌入和语言建模目标。这些工作通过实体嵌入注入知识图的结构信息。
  • K-BERT 将从 KG 提取的相关三元组显式地注入句子中,以获得 BERT 的扩展树形输入。
  • K-Adapter 通过针对不同的预训练任务独立地训练不同的适配器来注入多种知识,从而可以不断地注入知识,以解决注入多种知识时可能会出现灾难性遗忘问题。
  • 此外,这类 PTMs 还有 WKLM、KEPLER 等。

2、模型压缩

由于预训练的语言模型通常包含至少数亿个参数,因此很难将它们部署在现实应用程序中的在线服务和资源受限的设备上。模型压缩是减小模型尺寸并提高计算效率的有效方法。5 种 PTMs 的压缩方法为:

  • pruning(剪枝):将模型中影响较小的部分舍弃。
    • 如 Compressing BERT,还有结构化剪枝 LayerDrop* ,其在训练时进行 Dropout,预测时再剪掉 Layer,不像知识蒸馏需要提前固定 student 模型的尺寸大小。
  • quantization(量化):将高精度模型用低精度来表示;
    • 如 Q-BERT 和 Q8BERT ,量化通常需要兼容的硬件。
  • parameter sharing (参数共享):相似模型单元间的参数共享;
    • ALBERT 主要是通过矩阵分解和跨层参数共享来做到对参数量的减少。
  • module replacing(模块替换)
    • BERT-of-Theseus 根据伯努利分布进行采样,决定使用原始的大模型模块还是小模型,只使用 task loss。
  • knowledge distillation (知识蒸馏):通过一些优化目标从大型、知识丰富、fixed 的 teacher 模型学习一个小型的 student 模型。蒸馏机制主要分为 3 种类型:
    • 从软标签蒸馏:DistilBERT、EnsembleBERT
    • 从其他知识蒸馏:TinyBERT、BERT-PKD、MobileBERT、 MiniLM、DualTrain
    • 蒸馏到其他结构:Distilled-BiLSTM

image.png
3、多模态

随着 PTMs 在 NLP 领域的成功,许多研究者开始关注多模态领域的 PTMs,主要为通用的视觉和语言特征编码表示而设计。多模态的 PTMs 在一些庞大的跨模式数据语料库(带有文字的语音、视频、图像)上进行了预训练,如带有文字的语音、视频、图像等,主要有 VideoBERT、CBT 、UniViLM、 ViL-BERT 、 LXMERT、 VisualBERT 、 B2T2 、Unicoder-VL 、UNITER 、 VL-BERT 、 SpeechBERT。

4、从两阶段模型到四阶段模型

经典的预训练模型框架下,一般我们解决NLP问题有两个阶段:第一阶段是模型预训练阶段,预训练模型从文本等信息中学习语言知识;第二阶段是Fine-tuning阶段,根据手上的有监督数据,对模型参数进行微调,以获得更好的任务效果。

论文“Don’t Stop Pretraining: Adapt Language Models to Domains and Tasks”也通过大量实验验证了领域数据预训练(DAPT)的有效性,再结合它得出的另外一个重要结论:用手上的任务数据,无论大小,如果做一次任务级数据预训练(TAPT),也就是拿着手上任务数据,在通用预训练模型基础上,再做一次预训练,也能够有效提升任务效果。综合这个文章和其它有关文章的结论,我们不难看出,要想更好地提升任务效果,我们应该从传统的两阶段模型,拓展到如下四阶段模型:

第一个阶段:通用预训练

这就是传统两阶段模式中的第一阶段。这个阶段不仅仅追求效果好,也追求领域通用性。它的优化目标是:在尽可能多的下游任务场景中,效果都尽可能好,但不单独考虑某个特殊领域的效果如何。这个阶段,目前看总的发展趋势是:在数据质量有保证的前提下,增加数据数量,以及数据的多样性,同时提升模型复杂度,这样可以提供普遍有效的模型增强能力。很明显,这个阶段,一般只有土豪公司才能做得起,而且从趋势看,会越来越如此。将来的发展模式可能是,超级土豪公司不断优化这个模型,然后放出来供大家用,有能力做这个事情的人,应该会越来越少。

第二个阶段:领域预训练

在第一阶段训练好的通用预训练模型基础上,利用不同领域的自由文本,构建多个、不同领域的领域预训练模型。比如我们可以分别收集计算机领域、生物领域、电商领域…等等,多个不同领域的无标注自由文本数据。在第一阶段通用模型基础上,分别用各个领域数据,再分别做一次预训练,这样我们就得到了适合解决各个不同领域的预训练模型:计算机领域、生物领域、电商领域…..等等多个不同的预训练模型。下游任务可以根据自己任务的领域,选择适配性好的领域预训练模型来使用。

这个阶段的预训练模型,在训练的时候,有个独特的问题需要解决:灾难遗忘问题。所谓“灾难遗忘”,就是说,当你用领域数据进行预训练的时候,因为会调整第一阶段预训练模型的参数,这种偏向领域性的参数调整,可能会导致第一阶段模型学好的参数被改写,这意味着:经过第二阶段预训练,第一阶段预训练模型里学会的很多通用语言知识,可能会被冲掉。灾难遗忘就是这个意思。灾难遗忘问题,对于预训练模型,尤其是领域预训练模型来说,是个很关键也很重要的问题,目前也有一些解决方案,限于篇幅,这里就不展开了。

这个阶段的预训练,因为数据量相比第一阶段会小很多,所以其实中农公司甚至贫农公司也能做得起,不存在土豪门槛,大家应该都能做。当然,一般我们只做跟自己手头任务相关的领域的预训练模型。如果你想做很多领域的预训练模型,那估计也要备足银行卡。估计后续也会有土豪公司做好很多不同领域的预训练模型,供大家个性化适配使用,虽说目前还没有,但是推断起来,这是个大概率会发生的事件。

第三个阶段:任务预训练

在前两个预训练模型基础上,比如从第二个阶段里面的多个不同的领域预训练模型中,选择和手头任务适配的那个领域预训练模型,在这个模型基础上,用手头数据,抛掉数据标签,再做一次预训练,无论手上任务数据有多少。比如手上任务是计算机领域的,那么从第二阶段的多个领域模型里面,选择计算机领域适配过的预训练模型,在这个模型基础上进行一次任务级别的预训练。这样应该能明显提升任务效果。

第四阶段:任务Fine-tuning

这是传统两阶段的第二阶段,做法一样,没什么好讲的。

当然,如果你手上的任务没有那么强的领域性,可以跳过第二阶段,也就是那个领域预训练模型阶段,走剩余的三阶段模式即可,无论如何,任务预训练都是值得做的一个事情。

5、多语言和特定语言

学习跨语言共享的多语言文本表示形式对于许多跨语言的 NLP 任务起着重要的作用。

  • Multilingual-BERT 在 104 种 Wikipedia 文本上进行 MLM 训练(共享词表),每个训练样本都是单语言文档,没有专门设计的跨语言目标,也没有任何跨语言数据,M-BERT 也可以很好的执行跨语言任务。
  • XLM 通过融合跨语言任务(翻译语言模型)改进了 M-BERT,该任务通过拼接平行语料句子对进行 MLM 训练。
  • Unicoder 提出了 3 种跨语言预训练任务:1)cross-lingual word recovery;2) cross-lingual paraphrase classification;3) cross-lingual masked language model.

虽然多语言的 PTMs 在跨语言上任务表现良好,但用单一语言训练的 PTMs 明显好于多语言的 PTMs。此外一些单语言的 PTMs 被提出:BERT-wwm,ZEN,NEZHA , ERNIE-Baidu, BERTje, CamemBERT, FlauBERT, RobBERT。

五、如何对 PTMs 进行迁移学习?

NLP算法面试必备!PTMs:NLP预训练模型的全面总结 —- JayJay

PTMs 从大型语料库中获取通用语言知识,如何有效地将其知识适应下游任务是一个关键问题。迁移学习的方式主要有归纳迁移(顺序迁移学习、多任务学习)、领域自适应(转导迁移)、跨语言学习等。NLP 中 PTMs 的迁移方式是顺序迁移学习。

1、如何迁移?

  1. 选择合适的预训练任务:语言模型是 PTM 是最为流行的预训练任务;同的预训练任务有其自身的偏置,并且对不同的任务会产生不同的效果。例如,NSP 任务可以使诸如问答(QA)和自然语言推论(NLI)之类的下游任务受益。
  2. 选择合适的模型架构:例如 BERT 采用的 MLM 策略和 Transformer-Encoder 结构,导致其不适合直接处理生成任务。
  3. 选择合适的数据:下游任务的数据应该近似于 PTMs 的预训练任务,现在已有有很多现成的 PTMs 可以方便地用于各种特定领域或特定语言的下游任务。
  4. 选择合适的 layers 进行 transfer:主要包括 Embedding 迁移、top layer 迁移和 all layer 迁移。如 word2vec 和 Glove 可采用 Embedding 迁移,BERT 可采用 top layer 迁移,Elmo 可采用 all layer 迁移。
  5. 特征集成 还是 fine-tune?对于特征集成预训练参数是 freeze 的,而 fine-tune 是 unfreeze 的。特征集成方式却需要特定任务的体系结构,fine-tune 方法通常比特征提取方法更为通用和方便。

2、fine-tune 策略: 通过更好的微调策略进一步激发 PTMs 性能

  • 两阶段 fine-tune 策略:如第一阶段对中间任务或语料进行 finetune,第二阶段再对目标任务 fine-tune。第一阶段通常可根据特定任务的数据继续进行 fine-tune 预训练。
  • 多任务 fine-tune:MTDNN 在多任务学习框架下对 BERT 进行了 fine-tune,这表明多任务学习和预训练是互补的技术。
  • 采取额外的适配器:fine-tune 的主要缺点是其参数效率低,每个下游任务都有自己的 fine-tune 参数。因此,更好的解决方案是在固定原始参数的同时,将一些可 fine-tune 的适配器注入 PTMs。
  • 逐层阶段:逐渐冻结而不是同时对所有层进行 fine-tune,也是一种有效的 fine-tune 策略。

经典预训练模型

#. Skip-thoughts (2015)

image.png

Skip-thoughts 是一个15年的模型。它的选择的是大规模的图书语料。图书语料其实是一个很合适的选择,因为图书的题材可以很多,比如历史、爱情、科幻,以及图书包含了很多人类的知识。在编码器方面。选择了当时比较流行的GRU。它的目标是很经典的语言模型单词预测任务,通过一个句子的前n-1个单词的信息来预测第n个单词。如果在预训练阶段模型能把单词预测的任务做好,那么我们认为它充分学习到了人类语言的知识,对下游任务会有很大的帮助。

Skip-thoughts这个模型还有一个额外的贡献点,那就是它用了相邻句子的信息来预测第n个单词。如图所示,灰色、红色和绿色代表不同的句子。我们对红色的句子进行单词预测的时候,不仅使用红色句子中前n-1个单词的信息预测第n个单词,还会使用相邻句子的信息,也就是灰色的句子。最终,模型会将相邻的句子进行编码之后和前面的n-1个单词一起预测第n个单词。

#. Quick-thoughts (2018)

image.png

Quick-thoughts 其实是Skip-thoughts模型的近亲。在语料方面,它用了和Skip-thoughts一样的大规模图书语料,同时它还增加了更多的互联网的语料。在编码器方面,它跟Skip-thoughts一样,用的也是GRU模型。这篇论文的贡献,也就是和Skip-thoughts主要的不同点在于它的预训练目标:它使用了句子级别的预测模型,即用中心句子预测周围的句子。如图所示,第一句话“春天来了”的下面有三句候选,我们要从这三句候选句子中挑选出哪一句话是真正的下一句话。所以我们会对这三个候选的句子,通过GRU编码器进行编码,最后通过一个分类器进行预测。第二个候选句子“但是谷物还没有生长”是正确的答案。这个预训练任务的目标就是通过预测句子之间的关系来让模型学习到高质量的句子表示。

这个模型的名字叫做Quick-thoughts,之所以有quick这个名字,是因为它的训练非常的快。我们知道,一般语言模型是比较慢的,因为语言模型对单词的预测需要在整个词典中找出合适的单词。举一个简单的例子,词典大小是两万,那就要从两万个单词中去选择那个合适的单词。另一方面,语言模型需要对每个单词进行预测。但Quick-thoughts针对句子进行预测是可以很快的。直观的说,如果进行负采样,Quick-thoughts只选两个句子作为负样本,到最后就是一个简单的三分类任务,所以这也是为什么它叫Quick-thoughts的原因。

#. CoVe (2017)

image.png

接下来是17年的一个模型,是当时在预训练领域比较有名气的一个工作,叫做CoVe。它最大的贡献是提出了用机器翻译作为训练目标进行预训练。因为机器翻译是一个非常困难的一个任务,被称为人工智能皇冠上的明珠。如果模型把这么难的任务都能做好的话,那它应该能学习到很多的语言知识,这些知识对于其他的下游任务就会有很大的帮助。CoVe的预训练目标选择了机器翻译之后,很自然的就会选择平行语料作为预训练的语料,这里使用了英德平行语料。编码器则选择了当时最为流行的双层LSTM,解码器也是双层LSTM。如图所示,在预训练的过程中,编码器对应的是英语,解码器对应的是德语。由于模型的下游任务都是英语,所以会把编码器学习到的英语的知识迁移到下游任务上,然后利用学习到的权重去更好的提升下游任务上的表现。

#. InferSent (2017)

image.png

下一个介绍的是InferSent。这个工作的动机和上个介绍的工作是类似的,认为自然语言推理是一个很难的任务。如果把这个任务做好了,那模型也就能学习到有价值的人类语言知识,对于下游任务也会有很大的帮助。自然语言推理是一个文本对三分类任务:给定两个句子,如果第一句能推理出第二句是正确的,这两个句子就是蕴含关系;如果第一句能推出第二句是错误的,这两个句子就是矛盾关系;如果第一句既推不出第二句是正确,也推不出第二句是错误的话,那两者就是中立关系。简单来说这篇文章的核心工作就是使用分类任务作为预训练目标。这个工作的语料是五十七万的语言推理数据集。在编码器方面。用到了在Transformer之前常用的各种编码器,包括LSTM/GRU加上不同的Pooling层、以及多层的CNN、LSTM加上Attention。

这篇文章最后给出了一个结论,认为LSTM加上max Pooling是最好的选择。其实我们之前自己的实验也有相似的结论,LSTM确实在很多场景下还是一个非常鲁棒的模型,在和max pooling配合的时候,在很多数据集上都能取得非常好的效果,不一定比Transformer要差。

自回归语言模型详解

1. ELMo (2018)

贝壳找房【语言模型系列】原理篇二:从 ELMo 到 ALBERT

image.png
首先我们讲一个预训练模型 ELMo,这个算法出自《Deep contextualized word representation》,ELMo 的全称是“Embeddings from Language Models”,其核心的点在于:

  • 利用大量语料预训练一个语言模型,作为一个动态词向量生成器 D
  • 利用第一阶段D 生成的词向量作为下游任务的一种特征输入,将该特征与下游任务的词向量进行拼接构成最终的词向量,进行第二阶段具体下游任务的训练。

首先来看第一阶段。ELMo 第一阶段的目的就是得到一个动态词向量生成器,该生成器的输入是一个 query 的初始词向量2020-04-10-🍺预训练语言模型小酌 - 图35,这个初始词向量是利用字符卷积(char-cnn)得到的。和大多数的语言模型一样,该语言模型训练过程中的输出是最上面一层的向量表示2020-04-10-🍺预训练语言模型小酌 - 图36,编码层采用了双向 LSTM。其中,2020-04-10-🍺预训练语言模型小酌 - 图37是一个 m 维向量,m 为词表大小,所以2020-04-10-🍺预训练语言模型小酌 - 图38代表每个词的出现概率。在 ELMo 模型中,对于每个token 2020-04-10-🍺预训练语言模型小酌 - 图39,一个 L 层的 biLM 可以计算得到 2L+1 个表示:
image.png
对于下游任务,ELMo 将 R 中的所有层汇总成一个向量 2020-04-10-🍺预训练语言模型小酌 - 图41。更通用的,对于一个特定的任务,我们可以计算一个所有 biLM 层的加权:
2020-04-10-🍺预训练语言模型小酌 - 图42

其中2020-04-10-🍺预训练语言模型小酌 - 图43是 ELMo 第 k 个位置输出的词向量,2020-04-10-🍺预训练语言模型小酌 - 图44是每一层前向后向拼接后的输出,2020-04-10-🍺预训练语言模型小酌 - 图45表示 softmax 归一化后第 j 层的权重,这个参数可进行训练得到,2020-04-10-🍺预训练语言模型小酌 - 图46允许模型对整个 ELMo 向量进行缩放;2020-04-10-🍺预训练语言模型小酌 - 图47是具体任务使用的词向量,即原始词向量和 ELMo 输出向量的拼接。

另外,这里的向量构建方法也不一定固定不变,可以尝试多种方法,比如把每一层的输出直接进行拼接,前向后向进行加权拼接等等,可以尝试在不同任务中的效果。

2. GPT (2018)

https://www.bookstack.cn/read/huaxiaozhuan-ai/spilt.4.8c42358a11926b2f.md 贝壳找房【语言模型系列】原理篇二:从 ELMo 到 ALBERT 词向量之GPT-1,GPT-2和GPT-3

继续进行探寻预训练模型啦~首先讲一个和 ELMo 极其相似的模型—GPT。

Generative Pre-trained Transformer(GPT)系列是由OpenAI提出的非常强大的预训练语言模型,包括GPT-1[1],GPT-2[2],GPT-3[3]。GPT系列的模型结构秉承了不断堆叠transformer的思想,通过不断的提升训练语料的规模和质量,提升网络的参数数量来完成GPT系列的迭代更新的。
image.png

GPT-1:无监督学习

GPT-1的思想是先通过在无标签的数据上学习一个生成式的语言模型,然后再根据特定任务进行微调。跟 ELMo 的区别是:①使用transformer decoder替代 LSTM;②GPT 的第二阶段不是将得到的词向量输入一个具体任务的模型,而是直接在预训练模型的基础上进行微调(fine-tuning),完成具体任务的训练。
image.png

GPT-1的训练分为无监督的预训练和有监督的模型微调。

一、无监督预训练
无监督预训练是基于语言模型进行训练的,给定一个语料 2020-04-10-🍺预训练语言模型小酌 - 图50,使用标准的语言建模目标来最大化如下似然:

2020-04-10-🍺预训练语言模型小酌 - 图51%3D%E2%88%91ilog%E2%81%A1P(u_i%E2%88%A3u%7Bi%E2%88%92k%7D%2C%E2%80%A6%2Cu%7Bi%E2%88%921%7D%3B%CE%98)%0A#card=math&code=L_1%28U%29%3D%E2%88%91_ilog%E2%81%A1P%28u_i%E2%88%A3u%7Bi%E2%88%92k%7D%2C%E2%80%A6%2Cu_%7Bi%E2%88%921%7D%3B%CE%98%29%0A&id=V9wpM)
其中,k 为上下文窗口的大小,条件概率 P 通过参数为 Θ 的神经网络进行建模。这些参数使用SGD进行优化。

在GPT-1中,使用了一个多层的 Transformer Decoder 进行特征提取,然后根据输出的特征向量进行语言模型的训练。模型首先对输入上下文词条应用多头自注意力机制,再通过按位置的前馈层产生目标词条的输出分布:
image.png
其中,2020-04-10-🍺预训练语言模型小酌 - 图53#card=math&code=U%3D%28u%7B%E2%88%92k%7D%2C%E2%80%A6%2Cu%7B%E2%88%921%7D%29&id=DW015) 为词条的上下文向量,n 为网络层数,2020-04-10-🍺预训练语言模型小酌 - 图54 为词条的嵌入矩阵,2020-04-10-🍺预训练语言模型小酌 - 图55 为位置嵌入矩阵。

二、有监督微调
有监督任务包括:自然语言推理、问答和常识推理、语义相似度(Semantic Similarity)、分类(Classification)。在预训练模型准备好后,就可以通过构造不同的输入,利用 transformer 最后一层的输出进行不同任务的 fine-tuning。拿简单分类任务举例,假设我们有带标签的数据集C,对于输入序列2020-04-10-🍺预训练语言模型小酌 - 图56以及标签 y,首先将输入序列喂到上述预训练的模型中,得到 transformer 最后一层的输出2020-04-10-🍺预训练语言模型小酌 - 图57,然后再经过全连接层与 softmax,得到预测的概率。注意这里是拿了最后一层的最后一个 token 作为输出,源码里就是这么写的:
2020-04-10-🍺预训练语言模型小酌 - 图58

模型通过最小化如下损失进行优化:
2020-04-10-🍺预训练语言模型小酌 - 图59%3D%E2%88%91%7B(x%2Cy)%7Dlog%E2%81%A1P(y%E2%88%A3x_1%2C%E2%80%A6%2Cx_m)%0A#card=math&code=L_2%28C%29%3D%E2%88%91%7B%28x%2Cy%29%7Dlog%E2%81%A1P%28y%E2%88%A3x_1%2C%E2%80%A6%2Cx_m%29%0A&id=qTxOg)

论文在具体微调时结合语言建模作为微调的附加目标,可以帮助提高模型的泛化能力,同时可以加速模型收敛。GPT 中采用如下的优化目标:
2020-04-10-🍺预训练语言模型小酌 - 图60%3DL_2(C)%2B%CE%BBL_1(C)%0A#card=math&code=L_3%28C%29%3DL_2%28C%29%2B%CE%BBL_1%28C%29%0A&id=VUu0z)

不同的任务有着不用的输入构造方式,但大同小异,如下图所示:

2020-04-10-🍺预训练语言模型小酌 - 图61

GPT-2:多任务学习

GPT-2的目标是训练一个泛化能力更强的词向量模型,它并没有对GPT-1的网络进行过多的结构的创新与设计,只是使用了更多的网络参数和更大的数据集。

GPT-3:海量参数

GPT-3沿用了GPT-2的结构,但是在网络容量上做了很大的提升,具体如下:

  • GPT-3采用了 2020-04-10-🍺预训练语言模型小酌 - 图62 层的多头transformer,头的个数为 2020-04-10-🍺预训练语言模型小酌 - 图63
  • 词向量的长度是 2020-04-10-🍺预训练语言模型小酌 - 图64
  • 上下文划窗的窗口大小提升至 2020-04-10-🍺预训练语言模型小酌 - 图65 个token;
  • 使用了alternating dense和locally banded sparse attention[11]。

在大量的语言模型数据集中,GPT-3超过了绝大多数的zero-shot或者few-shot的state-of-the-art方法,表现十分惊艳。另外GPT-3在很多复杂的NLP任务中也超过了fine-tune之后的state-of-the-art方法。

自编码语言模型详解

1. BERT (2018) 💡

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

image.png

BERT 和 GPT 在结构上更是极为相似,其主要区别是:

  • BERT 采用 transformer 的 encoder 变体作为特征抽取器,且考虑双向,在预测当前词时,既考虑上文,也考虑下文
  • BERT预训练过程包含两个不同的预训练任务,分别是Masked Language Model和Next Sentence Prediction任务。

两个预训练任务

在预训练阶段,BERT 采用了两个无监督预测任务:

1. Masked Language Model

这个 MASK 方法的核心思想就是,我随机将一些词替换成[MASK],然后训练过程中让模型利用上下文信息去预测被 MASK 掉的词,这样就达到了利用上下文预测当前词的目的,和我们了解的 CBOW 的核心原理的区别就是,这里只预测 MASK 位置,而不是每个位置都预测。但是,直接这么做的话会有一些问题,训练预料中出现了大量的[MASK]标记,会让模型忽视上下文的影响,只关注当前的[MASK]。

举个栗子,当输入一句 my dog is hairy ,其中 hairy 被选中,那么输入变为 my dog is [MASK],训练目的就是将[MASK]这个 token 预测称 hairy,模型会过多的关注[MASK]这个标记,也就是模型认为[MASK]==hairy,这显然是有问题的。而且在预测的过程中,也不会再出现[MASK]这种标记。那么为了避免这种问题,BERT 的实际操作步骤是:

  • 随机选择 15% 的词
  • 将选中词的 80% 替换成 [MASK],比如 my dog is hairy → my dog is [MASK]
  • 将选中词的 10% 随机替换,比如 my dog is hairy → my dog is apple
  • 将选中词的 10% 不变,比如 my dog is hairy → my dog is hairy

这样做之后,训练过程中预测当前词时,该位置对应的 token 可以是任何词,那么这样就会强迫模型去学习更多的上下文信息,不会过多的关注于当前 token。

这样做还存在另一个问题在于在训练过程中只有15%的token被预测,正常的语言模型实际上是预测每个token的,因此Masked LM相比正常LM会收敛地慢一些,后面的实验也的确证实了这一点。

2. Next Sentence Prediction

BERT 语言模型训练过程中添加了句子关系预测任务,对于这个任务,简单来说,BERT 通过构建句子关系的分类样本,对模型进行了进一步的训练。构建句子关系分类样本时,正样本就是正常语序的两个句子,负样本的构建是从另一个文本文件中选择一个句子与当前句子组合,正负样本比例为50%:50%。

NSP 预训练任务对于一些重要的下游任务,例如问答(Question Answering,QA)和自然语言推断(Natural Language Inference,NLI),能够帮助语言建模捕获两个句子之间关系。

输入表示

BERT 的输入表示既可以表示一个单独的文本序列,也可以表示一对文本序列(例如:问题和答案)。对于一个给定的词条,其输入表示由对应的词条嵌入,分割嵌入和位置嵌入三部分加和构成,如下图所示:

  1. Token embedding 表示当前词的embedding
  2. Segment Embedding 表示当前词所在句子的index embedding
  3. Position Embedding 表示当前词所在位置的index embedding

2020-04-10-🍺预训练语言模型小酌 - 图67

为了一个输入能够针对两个任务,输入构造规则如下:

  1. 为了能够同时表示单句子和句子对,多句子(例如QA中的Q/A)需要进行拼接作为单个句子,用segment embedding和[SEG]来进行区分
  2. 句子第一个token总是有特殊含义,例如分类问题中是类别,如果不是分类问题那么就忽略
  3. 三个embedding进行sum得到输入的向量

模型训练

BERT预训练对于算力有着极大要求:

  • 开启混合精度实现训练加速;
  • 在通用中文语料基础上加入领域业务语料进行模型预训练,完成领域迁移;
  • 预训练过程中尝试融入知识图谱中的实体信息,采用全词MASK训练策略;
  • 通过在业务数据上进行微调,支持不同类型的业务需求。
  • 基于Horovod的分布式训练方案…..
  • 模型轻量化
    • 低精度量化。在模型训练和推理中使用低精度(FP16甚至INT8、二值网络)表示取代原有精度(FP32)表示。
    • 模型裁剪和剪枝。减少模型层数和参数规模。
    • 模型蒸馏。通过知识蒸馏方法[22]基于原始BERT模型蒸馏出符合上线要求的小模型。

模型fine-tune

在下游任务的改造中,BERT 给出了 4 种非常简单的 fine-tuning 方式,如下图所示:
2020-04-10-🍺预训练语言模型小酌 - 图68

句子关系类任务:

  • 输入:加上一个起始和终结符号,句子之间加个分隔符[SEP]
  • 输出:把第一个起始符号对应的 Transformer 最后一层位置上面串接一个 softmax 分类层

单句分类任务:

  • 输入:增加起始和终结符号
  • 输出:把第一个起始符号对应的 Transformer 最后一层位置上面串接一个 softmax 分类层

序列标注:

  • 输入:增加起始和终结符号
  • 输出:Transformer 最后一层每个单词对应位置都进行分类

阅读理解:

  • 输入:[CLS]+ 问题 +[SEP]+ 段落 +[SEP]
  • 输出:答案的开始和结束位置

Bert和transformer在embedding上的差异

  1. transformer的embedding由2部分构成:
    • 一个是token embedding,通过embedding matrix lookup到token_ids上生成表示token的向量;
    • 一个是position embedding,是通过sin和cos函数创建的定值向量。

而bert的embedding由3部分构成:

  • 第一个同样是token embedding,通过embedding matrix lookup到token_ids上生成表示token的向量;
  • 第二个是segment embedding,用来表达当前token是来自于第一个segment,还是第二个segment,因此segment vocab size是2;
  • 第三个是position embedding,与transformer不同的是,bert创建了一个position embedding matrix,通过position embedding matrix lookup到token_ids的位置上生成表示token位置的位置向量。
    1. transformer在embedding之后跟了一个dropout,但是bert在embedding之后先跟了一个layer normalization,再跟了一个dropout。
    2. bert在token序列之前加了一个特定的token“[cls]”,这个token对应的向量后续会用在分类任务上;如果是句子对的任务,那么两个句子间使用特定的token“[seq]”来分割。

Bert和transformer在loss上的差异

  1. transformer的loss是在decoder阶段计算的,loss的计算方式是transformer的<19>。
    bert预训练的loss由2部分构成,
    • 一部分是NSP的loss,就是token“[cls]”经过1层Dense,然后接一个二分类的loss,其中0表示segment B是segment A的下一句,1表示segment A和segment B来自2篇不同的文本;
    • 另一部分是MLM的loss,segment中每个token都有15%的概率被mask,而被mask的token有80%的概率用“”表示,有10%的概率随机替换成某一个token,有10%的概率保留原来的token,被mask的token经过encoder后乘以embedding matrix的转置会生成在vocab上的分布,然后计算分布和真实的token的one-hot形式的cross entropy,最后sum起来当作loss。

这两部分loss相加起来当作bert的 total loss,利用adam进行训练。bert fine-tune的loss会根据任务性质来设计,例如分类任务中就是token“[cls]”经过1层Dense,然后接了一个二分类的loss;例如问题回答任务中会在paragraph上的token中预测一个起始位置,一个终止位置,然后以起始位置和终止位置的预测分布和真实分布为基础设计loss;例如序列标注,预测每一个token的词性,然后以每一个token在词性的预测分布和真实分布为基础设计loss。

  1. bert在encoder之后,在计算NSP和MLM的loss之前,分别对NSP和MLM的输入加了一个Dense操作,这部分参数只对预训练有用,对fine-tune没用。而transformer在decoder之后就直接计算loss了,中间没有Dense操作。

Bert的技术细节

  • 为什么bert需要额外的segment embedding?
    因为bert预训练的其中一个任务是判断segment A和segment B之间的关系,这就需要embedding中能包含当前token属于哪个segment的信息,然而无论是token embedding,还是position embedding都无法表示出这种信息,因此额外创建一个segment embedding matrix用来表示当前token属于哪个segment的信息,segment vocab size就是2,其中index=0表示token属于segment A,index=1表示token属于segment B。
  • 为什么transformer的embedding后面接了一个dropout,而bert是先接了一个layer normalization,再接dropout?
    LN是为了解决梯度消失的问题,dropout是为了解决过拟合的问题。在embedding后面加LN有利于embedding matrix的收敛。
  • 为什么在multi-head attention中,bert不仅会concat<4.6>的attention的结果,还会把前N-1个encoder block中attention的结果都concat进来?
    有ensemble的思路在里面,比起单纯只用第N个encoder block中的attention结果,将前N个encoder block中的attention结果concat起来显然能够get到更多的信息,而下一步的linear操作又将结果的大小重新变回[batch size, max seq length, hidden size]。该问题和transformer的问题3.4的本质是一样的,通过ensemble可以得到更多的信息。
  • 为什么token被mask的概率是15%?为什么被mask后,还要分3种情况?
    15%的概率是通过实验得到的最好的概率,xlnet也是在这个概率附近,说明在这个概率下,既能有充分的mask样本可以学习,又不至于让segment的信息损失太多,以至于影响mask样本上下文信息的表达。然而因为在下游任务中不会出现token“”,所以预训练和fine-tune出现了不一致,为了减弱不一致性给模型带来的影响,被mask的token有80%的概率用“”表示,有10%的概率随机替换成某一个token,有10%的概率保留原来的token,这3个百分比也是多次实验得到的最佳组合,在这3个百分比的情况下,下游任务的fine-tune可以达到最佳的实验结果。

BERT 可以用在哪?

  • Just take it as a kind of embedding (contextualized)
  • Wherever you use word embedding, use BERT instead!
  • Eg. Text classifacation, seqence labeling, sentence generation,machine reading comprehension, natural language inference …

2020-04-10-🍺预训练语言模型小酌 - 图69

细粒度情感分析

2020-04-10-🍺预训练语言模型小酌 - 图70

BERT的总结

  1. BERT采用Masked LM + Next Sentence Prediction作为pre-training tasks, 完成了真正的Bidirectional LM
  2. BERT模型能够很容易地Fine-tune,并且效果很好,并且BERT as additional feature效果也很好
  3. 模型足够泛化,覆盖了足够多的NLP tasks

2. RoBERTa (2019)

Facebook的RoBERTa: A Robustly Optimized BERT Pretraining Approach,主要工作是复现 BERT,然后对 BERT 的模型架构、训练目标、训练细节(如数据集大小、训练时间)的重要性进行探索,从而提出了改进方案,这个改进方案称为 RoBERTa

roberta的创新点主要有4点:

  1. 第1点是动态mask,之前bert使用的是静态mask,就是数据预处理的时候完成mask操作,之后训练的时候同一个样本都是相同的mask结果,动态mask就是在训练的时候每输入一个样本都要重新mask,动态mask相比静态mask有更多不同mask结果的数据用于训练,效果很好。
  2. 模型去掉了 NSP 任务,修改了样本的构造方式,发现可以略微提升下游任务的性能。将输入2个segment修改为从一个文本中连续sample句子直到塞满512的长度。当到达文本的末尾且未塞满512的长度时,先增加一个“[sep]”,再从另一个文本接着sample,直到塞满512的长度。
  3. 更大的训练数据(从16G变成了160G)和更大的 Batch 大小(256改为2K甚至8K)
  4. 原始 BERT 采用一个 30K 的 BPE 词表,RoBERTa 采用了一个更大的 50K 的词表

3. UniLM (2019)

UniLM论文见:https://arxiv.org/abs/1905.03197 UniLM论文解读见:https://zhuanlan.zhihu.com/p/113380840

给定一个输入序列 2020-04-10-🍺预训练语言模型小酌 - 图71,UniLM 通过下图的方式获取每个词条的基于上下文的向量表示。整个预训练过程利用单向的语言建模(unidirectional LM),双向的语言建模(bidirectional LM)和 Seq2Seq 语言建模(sequence-to-sequence LM)优化共享的 Transformer 网络。

image.png

Q:UniLM模型介绍

A:通过不同的掩码来控制预测单词的可见上下文词语数量,实现不同的语言模型的联合训练。

  • 单向语言模型:分为从左到右和从右向左两种,从左到右,即仅通过被掩蔽token的左侧所有本文来预测被掩蔽的token;从右到左,则是仅通过被掩蔽token的右侧所有本文来预测被掩蔽的token。

  • 双向语言模型:与BERT模型一致,在预测被掩蔽token时,可以观察到所有的token。

  • 序列到序列语言模型:如果被掩蔽token在第一个文本序列中,那么仅可以使用第一个文本序列中所有token,不能使用第二个文本序列的任何信息;如果被掩蔽token在第二个文本序列中,那么使用一个文本序列中所有token和第二个文本序列中被掩蔽token的左侧所有token预测被掩蔽token。

Q:Seq2Seq LM,也叫 Prefix LM

Prefix LM结构是Google T5论文中给出的叫法,这种结构最早由UniLM模型提出,我们沿用Google T5的这种称谓。如果深入分析的话,Prefix LM其实是Encoder-Decoder模型的变体:标准的Encoder-Decoder模型,Encoder和Decoder各自使用一个独立的Transformer;而Prefix LM,相当于Encoder和Decoder通过分割的方式,分享了同一个Transformer结构,Encoder部分占用左部,Decoder部分占用右部,这种分割占用是通过在Transformer内部使用Attention Mask来实现的。与标准Encoder-Decoder类似,Prefix LM在Encoder部分采用AE模式,就是任意两个单词都相互可见,Decoder部分采用AR模式,即待生成的单词可以见到Encoder侧所有单词和Decoder侧已经生成的单词,但是不能看未来尚未产生的单词,就是说是从左到右生成。

目前的一些对比实验证明,在其它条件相同的情况下,关于语言理解类的任务(参考Encoder-AE部分Google T5论文中的相关实验),Prefix LM结构的效果要弱于标准Encoder-Decoder结构。这里是值得深入思考下的,因为看上去Prefix LM和标准的Encoder-Decoder结构是等价的。那么,为什么它的效果比不过Encoder-Decoder结构呢?我想,一方面的原因估计是两者的参数规模差异导致的;另外一方面,可能与它这种模式的Decoder侧对Encoder侧的Attention机制有关。在Decoder侧,Transformer的每层 Block对Encoder做Attention的时候,标准的Encoder-Decoder模式,Attention是建立在Encoder侧的最后输出上,这样可以获得更全面完整的全局整合信息;而Prefix LM这种结构,Decoder侧的每层Transformer对Encoder侧的Attention,是建立在Encoder的对应层上的,因为这种模式的Encoder和Decoder分割了同一个Transformer结构,Attention只能在对应层内的单词之间进行,很难低层跨高层。这可能是影响这种结构效果的原因之一。当然这只是个人猜测,无证据证明,还请谨慎参考。

关于语言生成类的任务,Prefix LM效果虽然要弱于Encoder-Decoder结构(参考Encoder-Decoder小节UniLM v2论文效果对比图),但是总体而言,两者相差不大,相对其它模型,Prefix LM结构在生成类任务表现也比较突出。

Prefix LM因为是Encoder-Decoder的变体,所以可以看出,它的优势也在于可以同时进行语言理解和语言生成类任务,而且相对Encoder-Decoder来说,因为只用了一个Transformer,所以模型比较轻,这是Prefix LM的优势。缺点则是在效果方面,貌似要弱于Encoder-Decoder模型的效果,语言理解类任务相对有明显差距,生成类任务的效果相差不大。

Q:UniLM模型如何掩码?

A:token掩码的概率为15%,在被掩掉的token中,有80%使用[MASK]替换,10%使用字典中随机词进行替换,10%保持原来token不变,与BERT模型一致。此外,在80%的情况下,每次随机掩掉一个token,在剩余的20%情况下,掩掉一个二元token组或三元token组。

Q:如何训练UniLM模型?

A:使用1/3的数据进行双向语言模型优化,1/3的数据进行序列到序列语言模型优化,1/6的数据进行从左向右的单向语言模型优化,1/6的数据进行从右向左的单向语言模型优化

Q:如何实现训练代码?

A:每个batch为一个任务,2个双向语言模型任务,2个序列到序列语言模型任务,1个左向右的单向语言模型任务,1个从右向左的单向语言模型,每跑一个任务进行一次累计梯度,跑完一轮所有任务,执行一次反向传播。

4. MASS (2019)

Masked Sequence to Sequence Pre-training for Language Generation

MASS 是一个专门面向生成的基于Transformer的序列到序列模型,由attention将encoder和decoder 连接在一起。Q:如何定义预训练任务?A:相比基础的Transformer结构,MASS的不同为: 它在编码器端输入一个被随机屏蔽长度为k的连续片段的句子(下图左侧),然后通过解码器预测被掩掉的长度为k的连续片段。其中decoder的输入会屏蔽在encoder中没有被屏蔽掉的token(下图右侧) 。

对于一个给定的原始句子 2020-04-10-🍺预训练语言模型小酌 - 图73,令 2020-04-10-🍺预训练语言模型小酌 - 图74 表示将 x 从 u 到 v 位置进行遮挡处理,2020-04-10-🍺预训练语言模型小酌 - 图75 为被遮挡词条的个数,2020-04-10-🍺预训练语言模型小酌 - 图76 为从 u 到 v 位置被遮挡的部分。MASS 利用被遮挡的序列 2020-04-10-🍺预训练语言模型小酌 - 图77 预测被遮挡的部分 2020-04-10-🍺预训练语言模型小酌 - 图78 ,目标函数的对数似然如下:

2020-04-10-🍺预训练语言模型小酌 - 图79%20%26%3D%5Cfrac%7B1%7D%7B%7C%5Cmathcal%7BX%7D%7C%7D%20%5CSigma%7Bx%20%5Cin%20%5Cmathcal%7BX%7D%7D%20%5Clog%20P%5Cleft(x%5E%7Bu%3A%20v%7D%20%7C%20x%5E%7B%5Csetminus%20u%3A%20v%7D%20%3B%20%5Ctheta%5Cright)%20%5C%5C%0A%26%3D%5Cfrac%7B1%7D%7B%7C%5Cmathcal%7BX%7D%7C%7D%20%5CSigma%7Bx%20%5Cin%20%5Cmathcal%7BX%7D%7D%20%5Clog%20%5Cprod%7Bt%3Du%7D%5E%7Bv%7D%20P%5Cleft(x%7Bt%7D%5E%7Bu%3A%20v%7D%20%7C%20x%7B%3Ct%7D%5E%7Bu%3A%20v%7D%2C%20x%5E%7B%5Csetminus%20u%3A%20v%7D%20%3B%20%5Ctheta%5Cright)%0A%5Cend%7Baligned%7D%0A#card=math&code=%5Cbegin%7Baligned%7D%0AL%28%5Ctheta%20%3B%20%5Cmathcal%7BX%7D%29%20%26%3D%5Cfrac%7B1%7D%7B%7C%5Cmathcal%7BX%7D%7C%7D%20%5CSigma%7Bx%20%5Cin%20%5Cmathcal%7BX%7D%7D%20%5Clog%20P%5Cleft%28x%5E%7Bu%3A%20v%7D%20%7C%20x%5E%7B%5Csetminus%20u%3A%20v%7D%20%3B%20%5Ctheta%5Cright%29%20%5C%5C%0A%26%3D%5Cfrac%7B1%7D%7B%7C%5Cmathcal%7BX%7D%7C%7D%20%5CSigma%7Bx%20%5Cin%20%5Cmathcal%7BX%7D%7D%20%5Clog%20%5Cprod%7Bt%3Du%7D%5E%7Bv%7D%20P%5Cleft%28x%7Bt%7D%5E%7Bu%3A%20v%7D%20%7C%20x%7B%3Ct%7D%5E%7Bu%3A%20v%7D%2C%20x%5E%7B%5Csetminus%20u%3A%20v%7D%20%3B%20%5Ctheta%5Cright%29%0A%5Cend%7Baligned%7D%0A&id=Z7rEn)

举例说明,对于一个具有 8 个词条的序列,2020-04-10-🍺预训练语言模型小酌 - 图80 被遮挡的示例如下:

2020-04-10-🍺预训练语言模型小酌 - 图81

模型仅预测遮挡的部分 2020-04-10-🍺预训练语言模型小酌 - 图82 ,对于解码器中位置 4−6 利用 2020-04-10-🍺预训练语言模型小酌 - 图83 作为输入,利用特殊遮挡符号 2020-04-10-🍺预训练语言模型小酌 - 图84 作为其他位置的输入。

这种设计的优势有:

  1. decoder端的 输入是源输入中被屏蔽的文段 ,可以使decoder在预测的时候更加专注利用源输入,而不是目标端要预测的token的前一个token
  2. 预测encoder端被屏蔽的文段 ,迫使encoder要更好的理解encoder输入中没有被屏蔽的文字。
  3. 目标端 预测连续文段 ,decoder可以建立比预测离散token更好的语言建模能力。
  4. 超参数k ,使模型更加的 灵活 。

对于不同长度 k,MASS 包含了上文中提到的两种预训练模型:

长度 概率 模型
k=1 2020-04-10-🍺预训练语言模型小酌 - 图85#card=math&code=P%5Cleft%28x%5E%7Bu%7D%20%5Cmid%20x%5E%7B%5Csetminus%20u%7D%20%3B%20%5Ctheta%5Cright%29&id=k9llE) masked LM in BERT
k=m 2020-04-10-🍺预训练语言模型小酌 - 图86#card=math&code=P%5Cleft%28x%5E%7B1%3Am%7D%20%5Cmid%20x%5E%7B%5Csetminus%201%3Am%7D%20%3B%20%5Ctheta%5Cright%29&id=iopzS) masked LM in GPT
k∈(1,m) 2020-04-10-🍺预训练语言模型小酌 - 图87#card=math&code=P%5Cleft%28x%5E%7Bu%3Av%7D%20%5Cmid%20x%5E%7B%5Csetminus%20u%3Av%7D%20%3B%20%5Ctheta%5Cright%29&id=XzrVN) 两种之间

Q:MASS最终的掩码策略?A:从随机一个位置开始,选择2020-04-10-🍺预训练语言模型小酌 - 图88,连续mask掉句子长度50%的tokens。过度地偏向编码器(k=1,masked LM in BERT)和过度地偏向解码器(k=m,masked LM in GPT)均不能在下游的自然语言生成任务中取得很好的效果。

5. BART (2019)

Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension

BART是一个面向自然语言 生成、翻译 和 理解 任务的序列到序列 预训练 降噪自编码器。它的训练分为(1) 用任意的噪声函数(选择被屏蔽token的方法)来破坏输入文本;(2) 训练模型对被破坏文本再重建,因此损失函数为最小化decoder的输出与原始文本的交叉熵(重构误差)。

和MASS一样,BART也是基于标准Transformer Encoder + Decoder 的网络结构(做了一点改动,参考GPT,将激活函数ReLU换成 GeLUs),同样也是对encoder输入的屏蔽( mask)方式(噪声函数)进行了改变。不同于MASS的是,BART对decoder没有进行改变。BART在保证理解任务性能的前提下,生成任务的结果也得到提升。

BART模型结构,“-”表示被屏蔽的toke

BART 的文本破坏方式有:

  • Token Masking 和BERT一样,随机选择 token 用[MASK] 代替。
  • Token Deletion 随机删除 token , 模型必须确定哪些 位置 缺少输入 。
  • Text Filling 文本填充,随机挑选一个文本片段(文本片段的长度符合λ =3的泊松分布),并且使用一个[MASK]标记进行替换。当片段长度为0时,相当于在原始位置插入一个[MASK]标记。与SpanBERT模型不同的是,SpanBERT模型是使用片段长度个数的[MASK]标记进行替换。
  • Sentence Permutation 句子排序,将文本按照句号进行分割,生成句子序列,然后将句子之间的顺序随机打乱。
  • Document Rotation 随机均匀地选择一个 token ,以这个token为中心,旋转文档,选中的这个token作为新的开头,此任务训练模型以识别文档的开头。

添加噪声的方法,这些方法可以组合

Q:BART最终的掩码策略?
A:BART模型最终使用了Text Infilling策略和Sentence Shuffling策略的组合,其中屏蔽每个文本中30%的token,并排列所有的句子。

6. T5 (2019)

《Seq2Seq 预训练语言模型:BART和T5》

T5(Text-to-Text Transfer Transformer) 同BART,都采用了Transformers原始结构,在预训练时都使用类似的Span级别去噪目标函数(受SpanBERT启发),但差异在于:

  • BART想要统一BERT和GPT,从一开始就确定了使用Transformers的原始结构。BART探究了各种目标函数的有效性,即对输入加各种类型的噪声,在输出时将其还原。同 BERT 也将位置编码换成了可学习的绝对位置嵌入。BART在NLU任务上保持了和RoBerta差不多的前提下,在多个NLG任务中取得了SOTA成绩。论文算上参考文献总共长度10页。

  • T5其实是一篇关于语言模型的Survey,其思路是从头开始,找出语言模型的最优结构,用相对位置嵌入替换绝对位置编码,并在尝试了多种结构之后发现Seq2Seq结构是最好的,然后从模型的目标函数,数据集,训练时间,模型大小,多任务学习,等角度做了大量的实验,确定方向之后扩大模型规模,最终在多个NLU和NLG任务中达到了SOTA水平。此外,这个工作还产出了一个干净的大规模英文预料:C4,该数据集是一个比 Wikipedia 大两个数量级的 Common Crawl 的清洗后版本的数据。论文算上参考文献长达67页。

T5使用两种预训练任务,分为无监督和有监督。无监督任务将原始文本的片段进行MASK,并用特定的字符进行占位,将其输入到编码器中;解码器为连续输入特定的占位符,预测其原始文本内容;有监督任务提升不大,这里不展开说明。

image.png
此外,T5还尝试了其他的任务类型,如下表所示。
image.png

这些任务可以,分为三类:前缀语言模型任务(Prefix language modeling),BERT风格任务(BERT-style之所以叫bert风格,是因为bert没有decoder,这里的decoder输出原句,和BART类似),打乱还原任务(Deshuffling)。这三个类型中,BERT风格效果最好。
image.png
image.png

无论是分类任务,还是生成任务,全都视为生成式任务。
T5的微调方式

7. SpanBERT

顾名思义,使用Span片段进行Mask操作;与Roberta一样,舍弃了NSP任务,但是增加了SBO任务;Mask token的占比依然为15%,并按照811的规则替换。
2020-04-10-🍺预训练语言模型小酌 - 图96

  • Span Masking
    • 根据长度为10,p为0.2的几何分布对span内的连续多个tokens进行遮掩,而不是随机的选择若干tokens进行遮掩 。平均span长为3.8。值得注意的是,由于几何分布,最大数只取到10,后面采用截断的方式,因此,后面的概率会分布到前面1-10的概率上,与正常几何分布概率不同。
    • span长度为1 的概率是 p/(1-q^10)=0.224,
    • span长度的期望是 p(1+2q+3q^2+…10q^9)/(1-q^10) = 3.797。
  • SBO任务是什么?
    • Span Boundary Objective任务,通过边界两侧的token,预测span里面全部的token。
    • 在训练时获取Span掩码边界的前后两个token(注意,不是边界token,是边界前后的token),然后将这两个token的向量加上 Span被掩掉token的位置向量,来预测被掩掉token的原词是什么,其实,就是将词向量和位置向量拼接起来,过两层全连接层,进行词表预测。
  • MLM with no NSP

8. MacBERT

MacBERT论文见:https://arxiv.org/abs/2004.13922 MacBERT论文解读见:https://zhuanlan.zhihu.com/p/250595837

Q:MacBERT模型介绍
A:使用全词掩蔽WWM和N-Gram掩蔽策略来选择候选tokens进行掩蔽;由于原始BERT模型在预训练时使用[MASK] token进行替换,但是[MASK] token在微调阶段从未出现,这会造成预训练任务与下游微调任务不一致,因此使用了同义词 or 近义词来掩蔽需要被掩蔽的单词;使用15%的百分比输入单词进行掩蔽,其中80%将替换为相似的单词,10%将替换为随机单词,剩下的10%将保留原始单词。
Q:全词掩蔽和N-Gram掩蔽的比例是多少?
A:从单字符到4字符的掩蔽百分比为40%、30%、20%、10%。
Q:类似的单词如何获取?
A:类似的单词可以通过同义词工具包(Synonyms)获得,该工具包是基于word2vec相似度计算来获取同义词的。
选择一个N-gram进行掩码时,该论文将分别找到相似的单词。在极少数情况下,当没有相似的词时,会降级使用随机词替换。
Q:是否包含其他任务?
A:使用ALBERT提出的句子顺序预测(SOP)任务替换BERT原始的NSP任务,通过切换两个连续句子的原顺序创建负样本。
Q:ALBERT模型?
A:ALBERT模型主要采用了权重共享的方法,说句心里话,ALBERT,我差你那点硬盘空间吗?我差的是推理速度。

全排列语言模型

  • Transformer-XL
  • Relative Positional Embedding
  • XLNet
  • MPNet

1. Transformer-XL (2019)

将 Transformer 或注意力机制应用到语言建模中的核心问题是如何训练 Transformer 使其有效地将一个任意长文本编码为一个固定长度的表示。Transformer-XL 将整个语料拆分为较短的段落,仅利用每段进行训练并忽略之前段落的上下文信息。这种方式称之为 Vanilla Model 27,如下图所示:

image.png

在这种训练模式下,无论是前向还是后向信息都不会跨越分割的段落进行传导。利用固定长度的上下文主要有两个弊端:

  1. 这限制了最大依赖的长度,虽然自注意力机制不会像 RNN 一样受到梯度弥散的影响,但 Vanilla Model 也不能完全利用到这个优势。
  2. 虽然可以利用补全操作来实现句子或其他语义的分割,但实际上通常会简单的将一个长文本截断成一个固定长度的分割,这样会产生上下文分裂破碎的问题。

为了解决这个问题,Transformer-XL 采用了一种循环机制的 Transformer。在训练阶段,在处理新的分割段落时,之前分割分部分的隐含状态序列将被固定(fixed)缓存(cached)下来作为一个扩展的上下文被复用参与计算,如下图所示:

image.png

虽然梯度仍仅限于这个分割段落内部,但网络可以从历史中获取信息,从而实现对长期依赖的建模。令两个长度为 L 的连续分割段落为 2020-04-10-🍺预训练语言模型小酌 - 图992020-04-10-🍺预训练语言模型小酌 - 图100,第 τ 段分割 sτ 的第 n 层隐含状态为 2020-04-10-🍺预训练语言模型小酌 - 图101,其中 d 为隐含维度。则对于分割段落 2020-04-10-🍺预训练语言模型小酌 - 图102 的第 n 层隐含状态通过如下方式进行计算:

2020-04-10-🍺预训练语言模型小酌 - 图103%20%5Ccirc%20%5Cmathbf%7Bh%7D%5E%7Bn-1%7D%7B%5Ctau%20%2B%201%7D%20%5Cright%5D%20%5C%5C%0A%5Cmathbf%7Bq%7D%5E%7Bn%7D%7B%5Ctau%20%2B%201%7D%2C%20%5Cmathbf%7Bk%7D%5E%7Bn%7D%7B%5Ctau%20%2B%201%7D%2C%20%5Cmathbf%7Bv%7D%5E%7Bn%7D%7B%5Ctau%20%2B%201%7D%20%26%3D%20%5Cmathbf%7Bh%7D%5E%7Bn-1%7D%7B%5Ctau%20%2B%201%7D%20%5Cmathbf%7BW%7D%5E%7B%5Ctop%7D%7Bq%7D%2C%20%5Ctilde%7B%5Cmathbf%7Bh%7D%7D%5E%7Bn-1%7D%7B%5Ctau%20%2B%201%7D%20%5Cmathbf%7BW%7D%5E%7B%5Ctop%7D%7Bk%7D%2C%20%5Ctilde%7B%5Cmathbf%7Bh%7D%7D%5E%7Bn-1%7D%7B%5Ctau%20%2B%201%7D%20%5Cmathbf%7BW%7D%5E%7B%5Ctop%7D%7Bv%7D%20%5C%5C%0A%5Cmathbf%7Bh%7D%5E%7Bn%7D%7B%5Ctau%20%2B%201%7D%20%26%3D%20%5Ctext%7BTransformer-Layer%7D%20%5Cleft(%5Cmathbf%7Bq%7D%5E%7Bn%7D%7B%5Ctau%20%2B%201%7D%2C%20%5Cmathbf%7Bk%7D%5E%7Bn%7D%7B%5Ctau%20%2B%201%7D%2C%20%5Cmathbf%7Bv%7D%5E%7Bn%7D%7B%5Ctau%20%2B%201%7D%5Cright)%0A%5Cend%7Baligned%7D%0A#card=math&code=%5Cbegin%7Baligned%7D%0A%5Ctilde%7B%5Cmathbf%7Bh%7D%7D%5E%7Bn-1%7D%7B%5Ctau%20%2B%201%7D%20%26%3D%20%5Cleft%5B%5Ctext%7BSG%7D%20%5Cleft%28%5Cmathbf%7Bh%7D%5E%7Bn-1%7D%7B%5Ctau%7D%5Cright%29%20%5Ccirc%20%5Cmathbf%7Bh%7D%5E%7Bn-1%7D%7B%5Ctau%20%2B%201%7D%20%5Cright%5D%20%5C%5C%0A%5Cmathbf%7Bq%7D%5E%7Bn%7D%7B%5Ctau%20%2B%201%7D%2C%20%5Cmathbf%7Bk%7D%5E%7Bn%7D%7B%5Ctau%20%2B%201%7D%2C%20%5Cmathbf%7Bv%7D%5E%7Bn%7D%7B%5Ctau%20%2B%201%7D%20%26%3D%20%5Cmathbf%7Bh%7D%5E%7Bn-1%7D%7B%5Ctau%20%2B%201%7D%20%5Cmathbf%7BW%7D%5E%7B%5Ctop%7D%7Bq%7D%2C%20%5Ctilde%7B%5Cmathbf%7Bh%7D%7D%5E%7Bn-1%7D%7B%5Ctau%20%2B%201%7D%20%5Cmathbf%7BW%7D%5E%7B%5Ctop%7D%7Bk%7D%2C%20%5Ctilde%7B%5Cmathbf%7Bh%7D%7D%5E%7Bn-1%7D%7B%5Ctau%20%2B%201%7D%20%5Cmathbf%7BW%7D%5E%7B%5Ctop%7D%7Bv%7D%20%5C%5C%0A%5Cmathbf%7Bh%7D%5E%7Bn%7D%7B%5Ctau%20%2B%201%7D%20%26%3D%20%5Ctext%7BTransformer-Layer%7D%20%5Cleft%28%5Cmathbf%7Bq%7D%5E%7Bn%7D%7B%5Ctau%20%2B%201%7D%2C%20%5Cmathbf%7Bk%7D%5E%7Bn%7D%7B%5Ctau%20%2B%201%7D%2C%20%5Cmathbf%7Bv%7D%5E%7Bn%7D%7B%5Ctau%20%2B%201%7D%5Cright%29%0A%5Cend%7Baligned%7D%0A&id=RrahL)

其中,2020-04-10-🍺预训练语言模型小酌 - 图104#card=math&code=SG%28%E2%8B%85%29&id=FnYIE) 表示停止梯度,2020-04-10-🍺预训练语言模型小酌 - 图105 表示将两个隐含序列按照长度维度进行拼接,W 为模型的参数。与一般的 Transformer 相比,最大的不同在于 2020-04-10-🍺预训练语言模型小酌 - 图1062020-04-10-🍺预训练语言模型小酌 - 图107 不仅依赖于 2020-04-10-🍺预训练语言模型小酌 - 图108 还依赖于之前分割段落的 2020-04-10-🍺预训练语言模型小酌 - 图109 缓存。

在标准的 Transformer 中,序列的顺序信息通过位置嵌入2020-04-10-🍺预训练语言模型小酌 - 图110 提供,其中第 i 行 2020-04-10-🍺预训练语言模型小酌 - 图111 对应一个分割文本内部的第 i 个绝对位置,2020-04-10-🍺预训练语言模型小酌 - 图112 为最大可能长度。在 Transformer-XL 中则是通过一种相对位置信息对其进行编码,构建一个相对位置嵌入 2020-04-10-🍺预训练语言模型小酌 - 图113,其中第 i 行 2020-04-10-🍺预训练语言模型小酌 - 图114 表示两个位置之间相对距离为 i 的嵌入表示。

对于一般的 Transformer,一个分割段落内部的 qi 和 kj 之间的注意力分数可以分解为:

2020-04-10-🍺预训练语言模型小酌 - 图115%7D%2B%5Cunderbrace%7B%5Cmathbf%7BE%7D%7Bx%7Bi%7D%7D%5E%7B%5Ctop%7D%20%5Cmathbf%7BW%7D%7Bq%7D%5E%7B%5Ctop%7D%20%5Cmathbf%7BW%7D%7Bk%7D%20%5Cmathbf%7BU%7D%7Bj%7D%7D%7B(b)%7D%20%5C%5C%0A%26%2B%5Cunderbrace%7B%5Cmathbf%7BU%7D%7Bi%7D%5E%7B%5Ctop%7D%20%5Cmathbf%7BW%7D%7Bq%7D%5E%7B%5Ctop%7D%20%5Cmathbf%7BW%7D%7Bk%7D%20%5Cmathbf%7BE%7D%7Bx%7Bj%7D%7D%7D%7B(c)%7D%2B%5Cunderbrace%7B%5Cmathbf%7BU%7D%7Bi%7D%5E%7B%5Ctop%7D%20%5Cmathbf%7BW%7D%7Bq%7D%5E%7B%5Ctop%7D%20%5Cmathbf%7BW%7D%7Bk%7D%20%5Cmathbf%7BU%7D%7Bj%7D%7D%7B(d)%7D%0A%5Cend%7Baligned%7D%0A#card=math&code=%5Cbegin%7Baligned%7D%0A%5Cmathbf%7BA%7D%7Bi%2C%20j%7D%5E%7B%5Cmathrm%7Babs%7D%7D%20%26%3D%5Cunderbrace%7B%5Cmathbf%7BE%7D%7Bx%7Bi%7D%7D%5E%7B%5Ctop%7D%20%5Cmathbf%7BW%7D%7Bq%7D%5E%7B%5Ctop%7D%20%5Cmathbf%7BW%7D%7Bk%7D%20%5Cmathbf%7BE%7D%7Bx%7Bj%7D%7D%7D%7B%28a%29%7D%2B%5Cunderbrace%7B%5Cmathbf%7BE%7D%7Bx%7Bi%7D%7D%5E%7B%5Ctop%7D%20%5Cmathbf%7BW%7D%7Bq%7D%5E%7B%5Ctop%7D%20%5Cmathbf%7BW%7D%7Bk%7D%20%5Cmathbf%7BU%7D%7Bj%7D%7D%7B%28b%29%7D%20%5C%5C%0A%26%2B%5Cunderbrace%7B%5Cmathbf%7BU%7D%7Bi%7D%5E%7B%5Ctop%7D%20%5Cmathbf%7BW%7D%7Bq%7D%5E%7B%5Ctop%7D%20%5Cmathbf%7BW%7D%7Bk%7D%20%5Cmathbf%7BE%7D%7Bx%7Bj%7D%7D%7D%7B%28c%29%7D%2B%5Cunderbrace%7B%5Cmathbf%7BU%7D%7Bi%7D%5E%7B%5Ctop%7D%20%5Cmathbf%7BW%7D%7Bq%7D%5E%7B%5Ctop%7D%20%5Cmathbf%7BW%7D%7Bk%7D%20%5Cmathbf%7BU%7D%7Bj%7D%7D%7B%28d%29%7D%0A%5Cend%7Baligned%7D%0A&id=cqmUX)

利用相对位置思想,变化如下:

2020-04-10-🍺预训练语言模型小酌 - 图116%7D%2B%5Cunderbrace%7B%5Cmathbf%7BE%7D%7Bx%7Bi%7D%7D%5E%7B%5Ctop%7D%20%5Cmathbf%7BW%7D%7Bq%7D%5E%7B%5Ctop%7D%20%5Cmathbf%7BW%7D%7Bk%2C%20R%7D%20%5Ctextcolor%7Bblue%7D%7B%5Cmathbf%7BR%7D%7Bi-j%7D%7D%7D%7B(b)%7D%20%5C%5C%0A%26%2B%5Cunderbrace%7B%5Ctextcolor%7Bred%7D%7Bu%5E%7B%5Ctop%7D%7D%20%5Cmathbf%7BW%7D%7Bk%2C%20E%7D%20%5Cmathbf%7BE%7D%7Bx%7Bj%7D%7D%7D%7B(c)%7D%2B%5Cunderbrace%7B%5Ctextcolor%7Bred%7D%7Bv%5E%7B%5Ctop%7D%7D%20%5Cmathbf%7BW%7D%7Bk%2C%20R%7D%20%5Ctextcolor%7Bblue%7D%7B%5Cmathbf%7BR%7D%7Bi-j%7D%7D%7D%7B(d)%7D%0A%5Cend%7Baligned%7D%0A#card=math&code=%5Cbegin%7Baligned%7D%0A%5Cmathbf%7BA%7D%7Bi%2C%20j%7D%5E%7B%5Cmathrm%7Brel%7D%7D%20%26%3D%5Cunderbrace%7B%5Cmathbf%7BE%7D%7Bx%7Bi%7D%7D%5E%7B%5Ctop%7D%20%5Cmathbf%7BW%7D%7Bq%7D%5E%7B%5Ctop%7D%20%5Cmathbf%7BW%7D%7Bk%2C%20E%7D%20%5Cmathbf%7BE%7D%7Bx%7Bj%7D%7D%7D%7B%28a%29%7D%2B%5Cunderbrace%7B%5Cmathbf%7BE%7D%7Bx%7Bi%7D%7D%5E%7B%5Ctop%7D%20%5Cmathbf%7BW%7D%7Bq%7D%5E%7B%5Ctop%7D%20%5Cmathbf%7BW%7D%7Bk%2C%20R%7D%20%5Ctextcolor%7Bblue%7D%7B%5Cmathbf%7BR%7D%7Bi-j%7D%7D%7D%7B%28b%29%7D%20%5C%5C%0A%26%2B%5Cunderbrace%7B%5Ctextcolor%7Bred%7D%7Bu%5E%7B%5Ctop%7D%7D%20%5Cmathbf%7BW%7D%7Bk%2C%20E%7D%20%5Cmathbf%7BE%7D%7Bx%7Bj%7D%7D%7D%7B%28c%29%7D%2B%5Cunderbrace%7B%5Ctextcolor%7Bred%7D%7Bv%5E%7B%5Ctop%7D%7D%20%5Cmathbf%7BW%7D%7Bk%2C%20R%7D%20%5Ctextcolor%7Bblue%7D%7B%5Cmathbf%7BR%7D%7Bi-j%7D%7D%7D%7B%28d%29%7D%0A%5Cend%7Baligned%7D%0A&id=EBnI2)

  1. 首先,利用相对位置 2020-04-10-🍺预训练语言模型小酌 - 图117 替代绝对位置嵌入 Uj,这里 R 采用的是无需学习的 sinusoid 编码矩阵 14
  2. 其次,引入了一个可训练的参数 2020-04-10-🍺预训练语言模型小酌 - 图118 用于替换 2020-04-10-🍺预训练语言模型小酌 - 图119。类似的,对于2020-04-10-🍺预训练语言模型小酌 - 图120 使用一个可训练的 2020-04-10-🍺预训练语言模型小酌 - 图121 替换。
  3. 最后,有意地划分了两个权重矩阵 2020-04-10-🍺预训练语言模型小酌 - 图1222020-04-10-🍺预训练语言模型小酌 - 图123 用于生成基于内容的 Key 向量和基于位置的 Key 向量。

这样,(a) 代表了基于内容的位置信息,(b) 捕获了内容无关的位置偏置,(c) 表示了一个全局的内容偏置,(d) 捕获了一个全局的位置偏置。

利用一个自注意力头计算 N 层的 Transformer-XL 的过程如下,对于 n=1,…,N 有:

2020-04-10-🍺预训练语言模型小酌 - 图124%20%5Ccirc%20%5Cmathbf%7Bh%7D%7B%5Ctau%7D%5E%7Bn-1%7D%5Cright%5D%20%5C%5C%0A%5Cmathbf%7Bq%7D%7B%5Ctau%7D%5E%7Bn%7D%2C%20%5Cmathbf%7Bk%7D%7B%5Ctau%7D%5E%7Bn%7D%2C%20%5Cmathbf%7Bv%7D%7B%5Ctau%7D%5E%7Bn%7D%3D%26%20%5Cmathbf%7Bh%7D%7B%5Ctau%7D%5E%7Bn-1%7D%20%7B%5Cmathbf%7BW%7D%7Bq%7D%5E%7Bn%7D%7D%5E%7B%5Ctop%7D%2C%20%5Cwidetilde%7B%5Cmathbf%7Bh%7D%7D%7B%5Ctau%7D%5E%7Bn-1%7D%20%7B%5Cmathbf%7BW%7D%7Bk%2C%20E%7D%5E%7Bn%7D%7D%5E%7B%5Ctop%7D%2C%20%5Cwidetilde%7B%5Cmathbf%7Bh%7D%7D%7B%5Ctau%7D%5E%7Bn-1%7D%20%7B%5Cmathbf%7BW%7D%7Bv%7D%5E%7Bn%7D%7D%5E%7B%5Ctop%7D%20%5C%5C%0A%5Cmathbf%7BA%7D%7B%5Ctau%2C%20i%2C%20j%7D%5E%7Bn%7D%3D%26%20%7B%5Cmathbf%7Bq%7D%7B%5Ctau%2C%20i%7D%5E%7Bn%7D%7D%5E%7B%5Ctop%7D%20%5Cmathbf%7Bk%7D%7B%5Ctau%2C%20j%7D%5E%7Bn%7D%20%2B%20%7B%5Cmathbf%7Bq%7D%7B%5Ctau%2C%20i%7D%5E%7Bn%7D%7D%5E%7B%5Ctop%7D%20%5Cmathbf%7BW%7D%7Bk%2C%20R%7D%5E%7Bn%7D%20%5Cmathbf%7BR%7D%7Bi-j%7D%20%5C%5C%0A%26%2Bu%5E%7B%5Ctop%7D%20%5Cmathbf%7Bk%7D%7B%5Ctau%2C%20j%7D%2Bv%5E%7B%5Ctop%7D%20%5Cmathbf%7BW%7D%7Bk%2C%20R%7D%5E%7Bn%7D%20%5Cmathbf%7BR%7D%7Bi-j%7D%20%5C%5C%0A%5Cmathbf%7Ba%7D%7B%5Ctau%7D%5E%7Bn%7D%3D%26%20%5Ctext%20%7B%20Masked-Softmax%20%7D%5Cleft(%5Cmathbf%7BA%7D%7B%5Ctau%7D%5E%7Bn%7D%5Cright)%20%5Cmathbf%7Bv%7D%7B%5Ctau%7D%5E%7Bn%7D%20%5C%5C%0A%5Cmathbf%7Bo%7D%7B%5Ctau%7D%5E%7Bn%7D%3D%26%20%5Ctext%20%7B%20LayerNorm%20%7D%20%5Cleft(%5Ctext%7BLinear%7D%5Cleft(%5Cmathbf%7Ba%7D%7B%5Ctau%7D%5E%7Bn%7D%5Cright)%2B%5Cmathbf%7Bh%7D%7B%5Ctau%7D%5E%7Bn-1%7D%5Cright)%20%5C%5C%0A%5Cmathbf%7Bh%7D%7B%5Ctau%7D%5E%7Bn%7D%3D%26%20%5Ctext%20%7B%20Positionwise-Feed-Forward%20%7D%5Cleft(%5Cmathbf%7Bo%7D%7B%5Ctau%7D%5E%7Bn%7D%5Cright)%0A%5Cend%7Baligned%7D%0A#card=math&code=%5Cbegin%7Baligned%7D%0A%5Cwidetilde%7B%5Cmathbf%7Bh%7D%7D%7B%5Ctau%7D%5E%7Bn-1%7D%3D%26%5Cleft%5B%5Cmathrm%7BSG%7D%5Cleft%28%5Cmathbf%7Bm%7D%7B%5Ctau%7D%5E%7Bn-1%7D%5Cright%29%20%5Ccirc%20%5Cmathbf%7Bh%7D%7B%5Ctau%7D%5E%7Bn-1%7D%5Cright%5D%20%5C%5C%0A%5Cmathbf%7Bq%7D%7B%5Ctau%7D%5E%7Bn%7D%2C%20%5Cmathbf%7Bk%7D%7B%5Ctau%7D%5E%7Bn%7D%2C%20%5Cmathbf%7Bv%7D%7B%5Ctau%7D%5E%7Bn%7D%3D%26%20%5Cmathbf%7Bh%7D%7B%5Ctau%7D%5E%7Bn-1%7D%20%7B%5Cmathbf%7BW%7D%7Bq%7D%5E%7Bn%7D%7D%5E%7B%5Ctop%7D%2C%20%5Cwidetilde%7B%5Cmathbf%7Bh%7D%7D%7B%5Ctau%7D%5E%7Bn-1%7D%20%7B%5Cmathbf%7BW%7D%7Bk%2C%20E%7D%5E%7Bn%7D%7D%5E%7B%5Ctop%7D%2C%20%5Cwidetilde%7B%5Cmathbf%7Bh%7D%7D%7B%5Ctau%7D%5E%7Bn-1%7D%20%7B%5Cmathbf%7BW%7D%7Bv%7D%5E%7Bn%7D%7D%5E%7B%5Ctop%7D%20%5C%5C%0A%5Cmathbf%7BA%7D%7B%5Ctau%2C%20i%2C%20j%7D%5E%7Bn%7D%3D%26%20%7B%5Cmathbf%7Bq%7D%7B%5Ctau%2C%20i%7D%5E%7Bn%7D%7D%5E%7B%5Ctop%7D%20%5Cmathbf%7Bk%7D%7B%5Ctau%2C%20j%7D%5E%7Bn%7D%20%2B%20%7B%5Cmathbf%7Bq%7D%7B%5Ctau%2C%20i%7D%5E%7Bn%7D%7D%5E%7B%5Ctop%7D%20%5Cmathbf%7BW%7D%7Bk%2C%20R%7D%5E%7Bn%7D%20%5Cmathbf%7BR%7D%7Bi-j%7D%20%5C%5C%0A%26%2Bu%5E%7B%5Ctop%7D%20%5Cmathbf%7Bk%7D%7B%5Ctau%2C%20j%7D%2Bv%5E%7B%5Ctop%7D%20%5Cmathbf%7BW%7D%7Bk%2C%20R%7D%5E%7Bn%7D%20%5Cmathbf%7BR%7D%7Bi-j%7D%20%5C%5C%0A%5Cmathbf%7Ba%7D%7B%5Ctau%7D%5E%7Bn%7D%3D%26%20%5Ctext%20%7B%20Masked-Softmax%20%7D%5Cleft%28%5Cmathbf%7BA%7D%7B%5Ctau%7D%5E%7Bn%7D%5Cright%29%20%5Cmathbf%7Bv%7D%7B%5Ctau%7D%5E%7Bn%7D%20%5C%5C%0A%5Cmathbf%7Bo%7D%7B%5Ctau%7D%5E%7Bn%7D%3D%26%20%5Ctext%20%7B%20LayerNorm%20%7D%20%5Cleft%28%5Ctext%7BLinear%7D%5Cleft%28%5Cmathbf%7Ba%7D%7B%5Ctau%7D%5E%7Bn%7D%5Cright%29%2B%5Cmathbf%7Bh%7D%7B%5Ctau%7D%5E%7Bn-1%7D%5Cright%29%20%5C%5C%0A%5Cmathbf%7Bh%7D%7B%5Ctau%7D%5E%7Bn%7D%3D%26%20%5Ctext%20%7B%20Positionwise-Feed-Forward%20%7D%5Cleft%28%5Cmathbf%7Bo%7D%7B%5Ctau%7D%5E%7Bn%7D%5Cright%29%0A%5Cend%7Baligned%7D%0A&id=zSbOT)

2. XLNet (2019)

https://www.bookstack.cn/read/huaxiaozhuan-ai/spilt.7.8c42358a11926b2f.md ⭐️XLNet:运行机制及和Bert的异同比较-张俊林

为了利用 AR 语言模型和 BERT 的优点,XLNet 提出了排序语言模型 Permuted Language Model(PLM)。对于一个长度为 T 序列 x,共有 2020-04-10-🍺预训练语言模型小酌 - 图125 种不同的方式进行 AR 分解,如果模型共享不同分解顺序的参数,那么模型就能学习到两侧所有位置的信息。令 2020-04-10-🍺预训练语言模型小酌 - 图126 为长度为 T 的索引序列 2020-04-10-🍺预训练语言模型小酌 - 图127 的所有可能排列,2020-04-10-🍺预训练语言模型小酌 - 图1282020-04-10-🍺预训练语言模型小酌 - 图129 分别表示一个排列 2020-04-10-🍺预训练语言模型小酌 - 图130 第 t 个和前 t−1 个元素。则排列语言模型的优化目标为:

2020-04-10-🍺预训练语言模型小酌 - 图131%5Cright%5D%0A#card=math&code=%5Cmax%7B%5Ctheta%7D%20%5Cquad%20%5Cmathbb%7BE%7D%7B%5Cmathbf%7Bz%7D%20%5Csim%20%5Cmathcal%7BZ%7D%7BT%7D%7D%5Cleft%5B%5Csum%7Bt%3D1%7D%5E%7BT%7D%20%5Clog%20p%7B%5Ctheta%7D%5Cleft%28x%7Bz%7Bt%7D%7D%20%7C%20%5Cmathbf%7Bx%7D%7B%5Cmathbf%7Bz%7D_%7B%3Ct%7D%7D%5Cright%29%5Cright%5D%0A&id=qWRWR)

根据标准的 Transformer,下一个词条的分布 2020-04-10-🍺预训练语言模型小酌 - 图132#card=math&code=p%7B%5Ctheta%7D%5Cleft%28X%7Bz%7Bt%7D%7D%20%7C%20%5Cmathbf%7Bx%7D%7B%5Cmathbf%7Bz%7D%3Ct%7D%5Cright%29&id=MDSHn) 为:

2020-04-10-🍺预训练语言模型小酌 - 图133%3D%5Cfrac%7B%5Cexp%20%5Cleft(e(x)%5E%7B%5Ctop%7D%20h%7B%5Ctheta%7D%5Cleft(%5Cmathbf%7Bx%7D%7B%5Cmathbf%7Bz%7D%3Ct%7D%5Cright)%5Cright)%7D%7B%5Csum%7Bx%5E%7B%5Cprime%7D%7D%20%5Cexp%20%5Cleft(e%5Cleft(x%5E%7B%5Cprime%7D%5Cright)%5E%7B%5Ctop%7D%20h%7B%5Ctheta%7D%5Cleft(%5Cmathbf%7Bx%7D%7B%5Cmathbf%7Bz%7D%3Ct%7D%5Cright)%5Cright)%7D%0A#card=math&code=p%7B%5Ctheta%7D%5Cleft%28X%7Bz%7Bt%7D%7D%20%3D%20x%20%7C%20%5Cmathbf%7Bx%7D%7B%5Cmathbf%7Bz%7D%3Ct%7D%5Cright%29%3D%5Cfrac%7B%5Cexp%20%5Cleft%28e%28x%29%5E%7B%5Ctop%7D%20h%7B%5Ctheta%7D%5Cleft%28%5Cmathbf%7Bx%7D%7B%5Cmathbf%7Bz%7D%3Ct%7D%5Cright%29%5Cright%29%7D%7B%5Csum%7Bx%5E%7B%5Cprime%7D%7D%20%5Cexp%20%5Cleft%28e%5Cleft%28x%5E%7B%5Cprime%7D%5Cright%29%5E%7B%5Ctop%7D%20h%7B%5Ctheta%7D%5Cleft%28%5Cmathbf%7Bx%7D%7B%5Cmathbf%7Bz%7D%3Ct%7D%5Cright%29%5Cright%29%7D%0A&id=sol7E)

其中,2020-04-10-🍺预训练语言模型小酌 - 图134#card=math&code=h%7B%5Ctheta%7D%5Cleft%28%5Cmathbf%7Bx%7D%7B%5Cmathbf%7Bz%7D%3Ct%7D%5Cright%29&id=tmbcP) 表示通过共享的 Transformer 产生的 2020-04-10-🍺预训练语言模型小酌 - 图135 的隐含表示。该表示并不依赖于所预测的位置,为了避免这个问题,我们将位置 zt 加入到模型中:

2020-04-10-🍺预训练语言模型小酌 - 图136%3D%5Cfrac%7B%5Cexp%20%5Cleft(e(x)%5E%7B%5Ctop%7D%20g%7B%5Ctheta%7D%5Cleft(%5Cmathbf%7Bx%7D%7B%5Cmathbf%7Bz%7D%3Ct%7D%2C%20z%7Bt%7D%5Cright)%5Cright)%7D%7B%5Csum%7Bx%5E%7B%5Cprime%7D%7D%20%5Cexp%20%5Cleft(e%5Cleft(x%5E%7B%5Cprime%7D%5Cright)%5E%7B%5Ctop%7D%20g%7B%5Ctheta%7D%5Cleft(%5Cmathbf%7Bx%7D%7B%5Cmathbf%7Bz%7D%3Ct%7D%2C%20z%7Bt%7D%5Cright)%5Cright)%7D%0A#card=math&code=p%7B%5Ctheta%7D%5Cleft%28X%7Bz%7Bt%7D%7D%3Dx%20%7C%20%5Cmathbf%7Bx%7D%7Bz%7B%3Ct%7D%7D%5Cright%29%3D%5Cfrac%7B%5Cexp%20%5Cleft%28e%28x%29%5E%7B%5Ctop%7D%20g%7B%5Ctheta%7D%5Cleft%28%5Cmathbf%7Bx%7D%7B%5Cmathbf%7Bz%7D%3Ct%7D%2C%20z%7Bt%7D%5Cright%29%5Cright%29%7D%7B%5Csum%7Bx%5E%7B%5Cprime%7D%7D%20%5Cexp%20%5Cleft%28e%5Cleft%28x%5E%7B%5Cprime%7D%5Cright%29%5E%7B%5Ctop%7D%20g%7B%5Ctheta%7D%5Cleft%28%5Cmathbf%7Bx%7D%7B%5Cmathbf%7Bz%7D%3Ct%7D%2C%20z_%7Bt%7D%5Cright%29%5Cright%29%7D%0A&id=T3lGZ)

对于 2020-04-10-🍺预训练语言模型小酌 - 图137#card=math&code=g%7B%5Ctheta%7D%5Cleft%28%5Cmathbf%7Bx%7D%7B%5Cmathbf%7Bz%7D%3Ct%7D%2C%20z_%7Bt%7D%5Cright%29&id=kIeOT) 进行建模需要满足如下两个要求:

  1. 预测 2020-04-10-🍺预训练语言模型小酌 - 图138 时,2020-04-10-🍺预训练语言模型小酌 - 图139#card=math&code=g%7B%5Ctheta%7D%5Cleft%28%5Cmathbf%7Bx%7D%7B%5Cmathbf%7Bz%7D%3Ct%7D%2C%20z%7Bt%7D%5Cright%29&id=v5IEs) 只能使用位置信息 zt 而不能使用内容信息 ![](https://g.yuque.com/gr/latex?x%7Bzt%7D#card=math&code=x_%7Bzt%7D&id=uRvh9)。
  2. 在预测 2020-04-10-🍺预训练语言模型小酌 - 图140 之后的词条时,2020-04-10-🍺预训练语言模型小酌 - 图141#card=math&code=g%7B%5Ctheta%7D%5Cleft%28%5Cmathbf%7Bx%7D%7B%5Cmathbf%7Bz%7D%3Ct%7D%2C%20z%7Bt%7D%5Cright%29&id=c42C4) 又必须包含 ![](https://g.yuque.com/gr/latex?x%7Bzt%7D#card=math&code=x_%7Bzt%7D&id=jDsNQ) 的语义信息。

为了解决这个问题,XLNet 引入“双流自注意力机制”提供了两种隐含表示。一个是内容流自注意力,其实就是标准的Transformer的计算过程;主要是引入了Query流自注意力,这个是干嘛的呢?其实就是用来代替Bert的那个[Mask]标记的,因为XLNet希望抛掉[Mask]标记符号,但是比如知道上文单词x1,x2,要预测单词x3,此时在x3对应位置的Transformer最高层去预测这个单词,但是输入侧不能看到要预测的单词x3,Bert其实是直接引入[Mask]标记来覆盖掉单词x3的内容的,等于说[Mask]是个通用的占位符号。而XLNet因为要抛掉[Mask]标记,但是又不能看到x3的输入,于是Query流,就直接忽略掉x3输入了,只保留这个位置信息,用参数w来代表位置的embedding编码。其实XLNet只是扔了表面的[Mask]占位符号,内部还是引入Query流来忽略掉被Mask的这个单词。和Bert比,只是实现方式不同而已。

模型的整个计算过程如下图所示:
image.png

上面说的Attention掩码,我估计你还是没了解它的意思,我再用例子解释一下。Attention Mask的机制,核心就是说,尽管当前输入看上去仍然是x1->x2->x3->x4,但是我们已经改成随机排列组合的另外一个顺序x3->x2->x4->x1了,如果用这个例子用来从左到右训练LM,意味着当预测x2的时候,它只能看到上文x3;当预测x4的时候,只能看到上文x3和x2,以此类推……这样,比如对于x2来说,就看到了下文x3了。这种在输入侧维持表面的X句子单词顺序,但是其实在Transformer内部,看到的已经是被重新排列组合后的顺序,是通过Attention掩码来实现的。如上图所示,输入看上去仍然是x1,x2,x3,x4,可以通过不同的掩码矩阵,让当前单词Xi只能看到被排列组合后的顺序x3->x2->x4->x1中自己前面的单词。这样就在内部改成了被预测单词同时看到上下文单词,但是输入侧看上去仍然维持原先的单词顺序了。关键要看明白上图右侧那个掩码矩阵,我相信很多人刚开始没看明白,因为我刚开始也没看明白,因为没有标出掩码矩阵的单词坐标,它的坐标是1-2-3-4,就是表面那个X的单词顺序,通过掩码矩阵,就能改成你想要的排列组合,并让当前单词看到它该看到的所谓上文,其实是掺杂了上文和下文的内容。这是attention mask来实现排列组合的背后的意思。

最后小结。感觉XLNet就是Bert、GPT 2.0和Transformer XL的综合体变身,首先,它通过PLM预训练目标,吸收了Bert的双向语言模型;然后,GPT2.0的核心其实是更多更高质量的预训练数据,这个明显也被XLNet吸收进来了;再然后,Transformer XL的主要思想也被吸收进来,它的主要目标是解决Transformer对于长文档NLP应用不够友好的问题。——-虽然排列语言模型有很多优点,但是由于计算量很大,模型很难进行优化,因此我们通过仅预测一个句子后面的一些词条解决这个问题。将 z 分为两部分:非目标子序列 2020-04-10-🍺预训练语言模型小酌 - 图143 和目标子序列 2020-04-10-🍺预训练语言模型小酌 - 图144,其中 c 为切分点。同时会设置一个超参数 K,表示仅 1/K 的词条会被预测,有 2020-04-10-🍺预训练语言模型小酌 - 图145%20%5Capprox%20K#card=math&code=%7C%5Cmathbf%7Bz%7D%7C%20%2F%28%7C%5Cmathbf%7Bz%7D%7C-c%29%20%5Capprox%20K&id=ShEZT)。对于未被选择的词条,其查询隐状态无需被计算,从而节省计算时间和资源。

基于对比学习的语言模型

1. ELECTRA (2020)

苏剑林. (Oct. 29, 2020). 《用ALBERT和ELECTRA之前,请确认你真的了解它们 》[Blog post]. Retrieved from https://kexue.fm/archives/7846

ELECTRA则来自论文《ELECTRA: Pre-training Text Encoders as Discriminators Rather Than Generators》。说实话,ELECTRA真是一个一言难尽的模型,它刚出来的时候让很多人兴奋过,后来正式发布开源后又让很多人失望过,目前的实战表现虽然不能说差,却也不能说多好。
image.png
ELECTRA的出发点是觉得BERT的MLM模型随机选择一部分Token进行Mask的这个操作过于简单了,想要增加一下它的难度。所以它借鉴了GAN的思想,用普通的方式训练一个MLM模型(生成器),然后根据MLM模型对输入句子进行采样替换,将处理后的句子输入到另外一个大模型(判别器)中,判断句子哪些 token 是被替换过的,哪些是被没被替换的(二分类任务)。该任务被称为替代词检测(RTD)任务。生成器和判别器是同步训练的,因此随着生成器的训练,判断难度会慢慢增加,直观想象有利于模型学到更有价值的内容。最后只保留判别器的Encoder来用,生成器一般就不要了。

Q:ELECTRA模型介绍
A:首先,按照一定的比例对于原始输入序列进行随机MASK操作得到新序列;
其次,将新序列作为生成器模型的输入,生成器模型对MASK的token进行预测,获取生成序列;
之后,将生成序列作为判别器模型的输入,判别器模型对生成序列每一个元素进行预测,判断是否是原始文本;
然后,将生成器模型和判别器模型的损失进行加和,分别反向传播;
最后,将判别器模型用于下游任务。
Q:ELECTRA模型任务本质
A:任务本质是获取效果较好的判别器,而判别器任务,就是一个Replaced Token Detection任务,预测替换词语是否为原始文本词语;而存在生成器模型的原因是直接使用随机替换的词语效果不好。
Q:ELECTRA模型与GAN的关系?
A:其实不是GAN模型,句子的字词是离散的,梯度在判别器使用生成器结果时就断了,判别器的梯度无法传给生成器,生成器的训练目标还是MLM。
Q:Loss如何分布
A:判别器的任务相对来说容易些,RTD loss相对MLM loss会很小,因此加上一个系数,论文提供的参数为50。
Q:判别器Loss是计算所有Token,为什么不只计算15%被mask的token
A:效果好。
Q:生成器和判别器的权重共享是否可以提升效果呢?
A:在相同参数下(生成器和判别器结构一致),不共享权重下的模型效果最差,共享所有权重的效果最好,只共享token embedding层的效果只比共享所有权重差一点点。原因是,生成器是一个MLM任务,在模型预测时softmax建立在词典的所有词之上,反向传播会更新所有token 的embedding,因此生成器对token embedding层的学习效果更好。最后论文作者只使用了token embedding共享策略。并且实验发现生成器的大小在判别器的1/4到1/2之间效果是最好的。
ELECTRA论文见:https://arxiv.org/abs/2003.10555

2. StructBERT

word structural objective:给定一个被打乱顺序的序列,尝试预测每个被移位的词的原始正确的位置:

  • 在句子中引入词乱序(“乱序不改其义”的思想,增大理解难度)。

Sentence Structural Objective:对于两句话(S1, S2),预测二者相对关系,3分类问题。

  • 1/3的概率是segment B是segment A的下一句
  • 1/3的概率是segment A是segment B的下一句
  • 1/3的概率是segment A和segment B来自2篇不同的文本

引入知识的语言模型

1. ERNIE 系列 (Baidu)

ERNIE 1.0 通过建模海量数据中的词、实体及实体关系,学习真实世界的语义知识。相较于 BERT 学习原始语言信号,百度ERNIE 1.0 可以概括为 2 点改进:

  1. Knowledge Masking:直接对先验语义知识单元进行建模,借助知识改进masking策略,包括 3 种:传统mask + 实体mask + 短语mask 。例如

BERT :哈 [mask] 滨是 [mask] 龙江的省会,[mask] 际冰 [mask] 文化名城。 ERNIE:[mask] [mask] [mask] 是黑龙江的省会,国际 [mask] [mask] 文化名城。

在 BERT 模型中,我们通过『哈』与『滨』的局部共现,即可判断出『尔』字,模型没有学习与『哈尔滨』相关的任何知识。而 ERNIE 通过学习词与实体的表达,使模型能够建模出『哈尔滨』与『黑龙江』的关系,学到『哈尔滨』是 『黑龙江』的省会以及『哈尔滨』是个冰雪城市。

  1. Dialog Language Model (DLM):训练数据方面,除百科类、资讯类中文语料外,ERNIE 还引入了论坛对话类数据,利用 DLM(Dialogue Language Model)建模 Query-Response 对话结构,将对话 Pair 对作为输入,引入 Dialogue Embedding 标识对话的角色,利用 Dialogue Response Loss 学习对话的隐式关系,进一步提升模型的语义表示能力。

ERNIE 2.0 是基于持续学习的语义理解预训练框架,使用多任务学习增量式构建预训练任务。ERNIE 2.0 中,新构建的预训练任务类型可以无缝的加入训练框架,持续的进行语义理解学习。

ERNIE2.0论文见:https://arxiv.org/abs/1907.12412

在预训练引入多任务学习,主要包含3个方面的任务:

  • 词层面任务
    • 知识掩码任务(Knowledge Masking Task):同ERNIE1.0
    • 词语-文档关系预测任务(Token-Document Relation Prediction Task):一篇文档出现的词语,是否在另外一篇出现;
    • 大写预测任务(Capitalization Prediction Task):预测一个word的首字母是否大写,一般大写词语都是较重要的词语;
  • 句子层面
    • 句子重排序任务(Sentence Reordering Task):将文本句子打乱顺序,然后预测正确排序;
    • 句子距离预测任务(SentenceDistance Task):预测句子对之间的相对距离–>三分类问题
  • 语义层面
    • 句子关系任务(Discourse Relation Task):根据句子之间的关键词判断,两个句子之间的语义关系
    • 检索关系任务(IR Relevance Task):判断一条用户查询和一篇文档题目的相关性程度,包含强相关、弱相关和无关

ERNIE 3.0

  • 设计了上下两层网络结构,一个用于聚焦自然语言理解,一个用于聚焦自然语言生成任务
    • Universal Representation Module
    • Task-specific Representation Module
  • 使用Transformer-XL作为骨干网络

2. ERNIE (THU)

https://paddlepedia.readthedocs.io/en/latest/tutorials/pretrain_model/THU-ERNIE.html

相比百度ERNIE,清华ERNIE则是另外一种思路:我们已经有些结构化知识或者实体关系知识等现成的外部知识库,可以在预训练的过程中,通过工具找出句中的命名实体,句中的命名实体可以触发知识库中其它相关实体,然后预训练模型通过特殊的结构,来融合文本和结构化知识,以进一步促进语言的理解。

THU-ERNIE是由两种类型的Encoder堆叠而成:T-EncoderK-EncoderT-Encoder负责从输入序列中捕获词法和句法信息;K-Encoder负责将KG知识和从T-Encoder中提取的文本信息进行融合,其中KG知识在这里主要是实体,这些实体是通过TransE模型训练出来的。

具体来说:

  1. 使用TAGME提取文本中的实体,并将这些实体链指到KG中的对应实体对象,然后找出这些实体对象对应的embedding,这些embedding是由一些知识表示方法,例如TransE训练得到的。
  2. 将实体向量和文本表示通过非线性变换进行融合,以融合词汇、句法和知识信息;
  3. 除了MLM、NSP任务外,重新添加了一个和KG相关的预训练目标Denoising entity auto-encoder (DEA)。dEA将随机地Mask掉一些token-entity对,然后要求模型在这些对齐的token上利用图谱去预测相应的实体分布,完成对齐。


image.png
THU-ERNIE的模型架构

3. K-BERT

将实体关系的三元组知识显式地嵌入到原始文本

  • 原始句子:“Tim Cook is visiting Beijing now”
  • 改造句子:“Tim Cook CEO Apple is visiting Beijing capital China is_a City now”

4. LIBERT

添加了语言知识约束

  • 基于预训练好的 BERT,利用同义词/上下位词对进行fine-tuning

5. 其他

KnowBERT
SentiLR
KEPLER
WKLM
CoLAKE

轻量化BERT详解

1. Albert

苏剑林. (Oct. 29, 2020). 《用ALBERT和ELECTRA之前,请确认你真的了解它们 》[Blog post]. Retrieved from https://kexue.fm/archives/7846

ALBERT 出自论文《ALBERT: A Lite BERT for Self-supervised Learning of Language Representations》,其模型结构与 BERT 基本一致,简单来说,ALBERT其实就是一个参数共享的BERT,相当于将函数2020-04-10-🍺预训练语言模型小酌 - 图148改为了2020-04-10-🍺预训练语言模型小酌 - 图149,其中2020-04-10-🍺预训练语言模型小酌 - 图150代表模型的每一层,这样本来有n层参数,现在只有1层了,因此参数量大大减少。除以之外,ALBERT对Embedding层用了矩阵分解,将参数量由VH 变为VE+EH,当 E<<H 时,参数量减少明显,其中V是词表大小。

通过矩阵分解和参数共享进行参数压缩,通俗解释如下:

1、矩阵分解 将词表输出维度,变成词表小维度+小维度*输出维度。 举例:如果BERT-base模型的词表为30K,输出维度维度为768,那么embedding部分的参数量为23,040,000。进行矩阵分解,小维度为128,那么embedding部分的参数量为3,840,000+98,304=3,938,304。缩小了20M。
2、参数共享 原来BERT-base模型有12层transformer-encode,每层大概7M,共84M参数。ALBERT将12层参数共享,相当于只有7M参数,缩小了77M。

通过这2项减少参数的技术,参数量可以缩小到原来的1/n,但相比 BERT_base,ALBERT_base 训练速度大概只是快10%~20%,而在推理阶段参数共享不会带来加速,推理的过程只不过是从串行计算12个transformer encoder block变成了循环计算transformer encoder block 12次。

至于效果,其实ALBERT的原论文已经说得很清楚,如下表所示。参数共享会限制模型的表达能力,如果不到xlarge版,那么没必要用ALBERT,同一速度的ALBERT效果比BERT差,同一效果的ALBERT速度比BERT慢。所以,小规格ALBERT不如BERT基本是实锤的了。

ALBERT实验结果

ps: 1、ALBERT很快跟ALBERT没什么关系,重点是tiny/small,对应的BERT tiny/small也很快…;
ps: 2、ALBERT 放弃了NSP任务,改为词序预测任务 sentence order prediction (SOP)

  • ALBERT 认为 NSP 将 topic prediction 和 coherence prediction糅合到了一个任务中,模型仅依靠较容易的topic prediction 任务就可以完成分类。而SOP使用同一文档中的两个连续片段作为正例,顺序互换作为反例,可以让模型更关注于coherence prediction,从而提高句对关系推理上的能力。

2. DistillBert

论文:DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter

DistillBert是在bert的基础上用知识蒸馏技术训练出来的小型化bert。整体上来说这篇论文还是非常简单的,只是引入了知识蒸馏技术来训练一个小的bert。具体做法如下:

  1. 给定原始的bert-base作为teacher网络。
  2. 在bert-base的基础上将网络层数减半(也就是从原来的12层减少到6层)。
  3. 利用teacher的软标签和teacher的隐层参数来训练student网络。

训练时的损失函数定义为三种损失函数的线性和,三种损失函数分别为:

1)𝐿𝑐𝑒Lce。这是teacher网络softmax层输出的概率分布和student网络softmax层输出的概率分布的交叉熵(注:MLM任务的输出)。
2)𝐿𝑚𝑙𝑚Lmlm。这是student网络softmax层输出的概率分布和真实的one-hot标签的交叉熵
3)𝐿𝑐𝑜𝑠Lcos。这是student网络隐层输出和teacher网络隐层输出的余弦相似度值,在上面我们说student的网络层数只有6层,teacher网络的层数有12层,因此个人认为这里在计算该损失的时候是用student的第1层对应teacher的第2层,student的第2层对应teacher的第4层,以此类推。

作者对student的初始化也做了些工作,作者用teacher的参数来初始化student的网络参数,做法和上面类似,用teacher的第2层初始化student的第1层,teacher的第4层初始化student的第2层。

作者也解释了为什么减小网络的层数,而不减小隐层大小,作者认为在现代线性代数框架中,在张量计算中,降低最后一维(也就是隐层大小)的维度对计算效率提升不大,反倒是减小层数,也提升计算效率。

另外作者在这里移除了句子向量和pooler层,在这里也没有看到NSP任务的损失函数,因此个人认为作者也去除了NSP任务(主要是很多人证明该任务并没有什么效果)。

整体上来说虽然方法简单,但是效果还是很不错的,模型大小减小了40%(66M),推断速度提升了60%,但性能只降低了约3%。

3. TINYBERT

论文:TINYBERT: DISTILLING BERT FOR NATURAL LANGUAGE UNDERSTANDING

TINYBERT也是采用了知识蒸馏的方法来压缩模型的,只是在设计上较distillBert做了更多的工作,作者提出了两个点:针对Transformer结构的知识蒸馏和针对pre-training和fine-tuning两阶段的知识蒸馏。

作者在这里构造了四类损失函数来对模型中各层的参数进行约束来训练模型,具体模型结构如下:

2020-04-10-🍺预训练语言模型小酌 - 图152

作者构造了四类损失,分别针对embedding layer,attention 权重矩阵,隐层输出,predict layer。可以将这个统一到一个损失函数中:

2020-04-10-🍺预训练语言模型小酌 - 图153

上面式子中𝜆𝑚λm表示每一层对应的系数,𝑆𝑚Sm表示studnet网络的第m层,𝑇𝑔(𝑚)Tg(m)表示teacher网络的第n层,其中𝑛=𝑔(𝑚)n=g(m)。并且有𝑔(0)=0g(0)=0,𝑔(𝑀+1)=𝑁+1g(M+1)=N+1,0表示embedding layer,M+1和N+1表示perdict layer。

针对上面四层具体的损失函数表达式如下:

attention 权重矩阵

2020-04-10-🍺预训练语言模型小酌 - 图154

h为multi attention中头数

隐层输出

2020-04-10-🍺预训练语言模型小酌 - 图155

因为student网络的隐层大小通常会设置的比teacher的小,因此为了在计算时维度一致,这里用一个矩阵𝑊ℎWh将student的隐层向量线性映射到和teacher同样的空间下。

embedding layer

2020-04-10-🍺预训练语言模型小酌 - 图156

𝑊𝑠Ws同理上。

以上三种损失函数都采用了MSE,主要是为了将模型的各项参数对齐。

predict layer

2020-04-10-🍺预训练语言模型小酌 - 图157

predict layer也就是softmax层,在这里的损失函数是交叉熵,t是温度参数,在这里设置为1。

以上四种损失函数是作者针对transformer提出的知识蒸馏方法。除此之外作者认为除了对pre-training蒸馏之外,在fine-tuning时也利用teacher的知识来训练模型可以取得在下游任务更好的效果。因此作者提出了两阶段知识蒸馏,如下图所示:

2020-04-10-🍺预训练语言模型小酌 - 图158

本质上就是在pre-training蒸馏一个general TinyBERT,然后再在general TinyBERT的基础上利用task-bert上再蒸馏出fine-tuned TinyBERT。

作者给出了TinyBERT的效果:

2020-04-10-🍺预训练语言模型小酌 - 图159

另外作者也给出了四种损失对最终结果的贡献:

2020-04-10-🍺预训练语言模型小酌 - 图160

还有就是关于𝑛=𝑔(𝑚)n=g(m)这个式子中𝑔(𝑚)g(m)怎么选择,假设student的层数为4层,这里的𝑛=𝑔(𝑚)=3𝑚n=g(m)=3m,作者将这种称为Uniform-strategy。另外作者还和其他的𝑔(𝑚)g(m)做了对比:

2020-04-10-🍺预训练语言模型小酌 - 图161

Top-strategy指用teacher最后4层,Bottom-strategy指用前面4层,其实这里的映射函数,我感觉可能还有更优的方案,例如取平均,或者用attention来做,可能效果会更好。

BERT 扩展详解

https://www.bookstack.cn/read/huaxiaozhuan-ai/spilt.9.8c42358a11926b2f.md

BERT-wwm-ext

原始版本的 BERT 采用了WordPiece tokenize 来预处理,即把每个单词拆解一些 wordpiece token 。在Pretraining的时候是随机Mask这些WordPiece的,这就可能出现只Mask一个词的一部分的情况,比如下面的例子:

2020-04-10-🍺预训练语言模型小酌 - 图162

为了解决这个问题,很自然的想法就是词作为一个整体要么都Mask要么都不Mask,这就是所谓的 Whole Word Masking。这是一个很简单的想法,对于BERT的代码修改也非常少,只是修改一些Mask的那段代码。对于英文来说,分词是一个(相对)简单的问题。哈工大与科大讯飞的论文对Wiki的中文dump进行了分词,然后做了一些实验。

  • Whole Word Masking
  • 替换BERT的AdamWeightDecayOptimizer为LAMB优化器

Sentence-Bert

文本匹配利器:从Siamse孪生网络到Sentence-BERT综述 语义相似度、句向量生成超强模型之SBERT ★★★

Bert的缺点:

  • BERT不适合语义相似度搜索,也不适合非监督任务,比如聚类。
    解决聚类和语义搜索的一种常见方法是将每个句子映射到一个向量空间,使得语义相似的句子很接近。
    于是,也有人尝试向BERT输入单句,得到固定大小的sentene embedding。最常用的方法是,平均BERT输出层或使用第一个token([CLS]的token)的输出。但这却产生了非常不好的sentence embedding,常常还不如averaging GloVe embeddings
  • 语义相似度计算巨大开销。
    Bert有1.1亿参数量(base版本)使得预测、推理速度明显比CNN等传统网络慢了不止一个量级,对资源要求更高,也不适合处理某些任务。例如,从10000条句子中找到最相似的一对句子,由于可能的组合众多,需要完成49,995,000次推理计算;在一块现代V00GPU上使用Bert计算,将消耗65小时。

解决方法:

  • Sentence-Bert模型(以下简称SBert)
    SBert对预训练的BERT进行修改:使用孪生(Siamese)和三级(triplet)网络结构来获得语义上有意义的句子embedding,以此获得定长的sentence embedding,使用余弦相似度或Manhatten/Euclidean距离等进行比较找到语义相似的句子。前面所述的从10000条句子找最相似pair的任务,SBert仅需5秒就能完成!通过这样的方法得到的SBERT模型,在文本语义相似度等句子对的回归任务上吊打BERT , RoBERTa 拿到sota。

SBert的优势:

  • SBert充分利用了孪生网络的优点和预训练语言模型强大的特征抽取优势,在众多匹配任务上取得了最优实验结果。
  • SBert直接使用Bert的原始权重进行初始化,在具体数据集上微调,训练过程和传统Siamse Network差异不大。但是这种训练方式能让Bert更好的捕捉句子之间的关系,生成更优质的句向量
  • 在评估测试阶段,SBert直接使用余弦相似度来比较两个句向量之间的相似度,极大提升了推理速度;
  • 同时,得益于生成的高质量句嵌入特征,SBert在语义检索、信息搜索、文本聚类、新FAQ发现等工作中预计会有不错表现。

SBert的网络结构:

2020-04-10-🍺预训练语言模型小酌 - 图163

SBert训练

使用SNLI和NLI数据集对Bert和Roberta进行fine-tune,得到SBERT预训练模型。

  • Polling策略
    ① mean:将句子的所有token在token维度上计算平均,这样就可以得到768(base)/1024(large)维度向量;
    ② max:将句子的所有token在token维度上的最大那个值,即做max_over_time,这里多解释下max_over_time,就是比如x = torch.randn(2, 10, 20),就是取x.max(1);
    ③ CLS:就是原始Bert做分类的方法,取句子的第一个token的向量。
    作者发现,使用mean的效果最好,max最差。
  • loss函数
    ① 回归任务:softmax,均方差损失函数;
    ② 分类任务:softmax, 交叉熵损失函数;
    ③ Wikipedia section triplets dataset (Dor et al., 2018)(三句分类任务):这个数据集是一些书中的句子,每一条数据有三句话,其中两句来自同一个章节的句子,另外一句是这本书的另外一个章节。
    2020-04-10-🍺预训练语言模型小酌 - 图164
    其中 ε设为1,||a, b||表示a和b的距离。求该损失函数的目的就是使得,a和p的距离小于a和n的距离

SBERT的相关资源

SBert开源地址https://github.com/UKPLab/sentence-transformers SBert多语预训练模型下载地址https://public.ukp.informatik.tu-darmstadt.de/reimers/sentence-transformers/v0.2/ code adapted from https://github.com/UKPLab/sentence-transformers/blob/master/examples/applications/semantic_search.py

State-of-Art

NLP 任务的 State-of-Art 模型详见:

参考

绝对干货!NLP预训练模型:从transformer到albert

《Attention is All You Need》浅读(简介+代码)

美团BERT的探索和实践

AI算法工程师手册

⭐️预训练自然语言模型 (Pre-trained Models for NLP)-范叶亮

贝壳找房【语言模型系列】原理篇二:从 ELMo 到 ALBERT

常用预训练语言模型(PTMs)总结-刘聪 NLP