关于BERT改进的几篇论文
文章目录
介绍基于BERT进行改进的模型:ALBERT、XLNet, DistilBERT (持续更新)
ALBERT
在同等网络规模(隐藏层)下,BERT 拥有 12.7 亿个参数,ALBERT 仅拥有 5900 万个参数……缩小约 21.5 倍。
模型训练存在一个饱和点,一旦训练复杂性越过该饱和点,那么任何额外网络元素的加入都只会拉低增益。
对Embedding因式分解(Factorized embedding parameterization)
ALBERT 的作者们指出,WordPiece 嵌入学习到的实际是与上下文无关的表示形式。而隐藏层嵌入则用于学习与上下文相关的表示形式。这两者是需要没有直接的关系,如果把这两个要素分开,可能更加合理。
投射至一个较小的低维矩阵 E 中,而后再将 E 投射至 H 隐藏空间中。
这一步操作其实就是没啥特别好说的,无外乎就是觉得词嵌入时的向量维度应该小一点,然后通过个网络扩充一下提升维度,这样一通操作就可以把参数量从
跨层的参数共享(Cross-layer parameter sharing)
全连接层与attention层都进行参数共享,也就是说共享encoder内的所有参数
参数量减少了很多,训练速度也提升了很多
句间连贯(sentence-order prediction)
在ALBERT中,为了只保留一致性任务去除主题识别的影响,提出了一个新的任务 sentence-order prediction(SOP),SOP的正样本和NSP的获取方式是一样的,负样本把正样本的顺序反转即可。
SOP因为实在同一个文档中选的,其只关注句子的顺序并没有主题方面的影响。并且SOP能解决NSP的任务,但是NSP并不能解决SOP的任务,该任务的添加给最终的结果提升了一个点。
增强了模型的学习能力。
移除dropout
除了上面提到的三个主要优化点,ALBERT的作者还发现一个很有意思的点,ALBERT在训练了100w步之后,模型依旧没有过拟合,于是乎作者果断移除了dropout,没想到对下游任务的效果竟然有一定的提升。这也是业界第一次发现dropout对大规模的预训练模型会造成负面影响。
总结
但实际上是通过参数共享的方式降低了内存,预测阶段还是需要和BERT一样的时间。
XLNet 讲解
(1)摘要(Abstract)
However, relying on corrupt- ing the input with masks, BERT neglects dependency between the masked positions and suffers from a pretrain-finetune discrepancy 针对BERT
pretrain-finetune discrepancy
的问题,主要做了以下三点工作:
- enables learning bidirectional contexts by maximizing the expected likelihood over all permutations of the factorization order
- overcomes the limitations of BERT thanks to its autoregressive formulation
- XLNet integrates ideas from Transformer-XL into pretraining. 其中前两点是比较重要,最后一点是在长句子数据集上预训练的改进。
(2)Introduction
自回归语言模型(Autoregressive Language Modeling, AR)和自编码语言模型(Autoencoding LM, AE)是两大成功的语言模型。自回归语言模型有个缺点,要么从左到右,要么从右到左,尽管可以类似ELMO两个都做,然后再拼接的方式。但是跟Bert比,效果明显不足够好(这里面有RNN弱于Transformer的因素,也有双向语言模型怎么做的因素)。
同样,自编码语言模型定义:自编码语言模型是通过在输入X中随机Mask掉一部分单词,然后在预训练过程中根据上下文单词来预测这些被Mask掉的单词。该做法类似Denoising Autoencoder(DAE)的思路。那些被Mask掉的单词即为在输入侧加入的噪音。 1). 典型技术:BERT。 2). 优点:同时利用上下文信息,双向语言模型。 3).缺点:
- 输入侧引入[Mask]标记,导致预训练阶段和Fine-tuning阶段不一致,因为Fine-tuning阶段看不到[Mask]标记。
- 独立假设问题:举个例子:比如”New York is a city”,假设我们Mask住”New”和”York”两个词,那么给定”is a city”的条件下”New”和”York”并不独立,因为”New York”是一个实体,看到”New”则后面出现”York”的概率要比看到”Old”后面出现”York”概率要大得多。所以同时Mask 15% 的词不是好的做法。
于是作者的想法是结合 AR 模型的优点(同下游任务一致)和AE的优点(利用上下文信息),提出了XLNet :基于AR模型使用 all possible permutations of the factorization order
来学习上下文信息。并且结合了当下AR 模型中很多训练技巧,reparameterize the Transformer(-XL) network
。
一句话概括:XLNet 使用语言模型,但是为了解决双向上下文的问题,提出了排列语言模型。排列语言模型在预测的时候需要target 的位置信息,因此引入了 Two-Stream,Content 流编码到当前时刻的所有内容,而Query 流只是保留了位置信息。最后为了解决计算量过大的问题,对于一个句子,只是预测后面的
(2)排列语言模型(Permutation Language Model)
排列(乱序)语言模型跟语言模型一样,都是做条件概率分解,但排列语言模型的分解顺序是随机的:
关于如何使用 attention机制实现 masked(当预测乱序语言模型
的解释。
XLNet仍然遵循两阶段的过程,第一个阶段是语言模型预训练阶段;第二阶段是任务数据Fine-tuning阶段。这个可以理解为在自回归LM模式下,采取什么样的具体手段,融入双向语言模型。
\begin{equation}
\max {\theta} E {z \sim Z_T} = \sum{t=1} ^{T} \log p{\theta} (x_{z_t} | x_{z \le t})
\label{eq-1}
\end{equation}
从所有的排列中采样一种,然后根据这个排列来分解联合概率成条件概率的乘积,然后加起来。为了实现排列语言模型,论文采用了双流自注意力机制(Two-Stream Self-Attention)和Attention Mask。比如
Intuitively, if model parameters are shared across all factorization orders, in expectation, the model will learn to gather information from all positions on both sides. 这个有没有类似权值共享的观点,然后权值共享能够基本表示所有的可能性。
当时上述公式
p_{\theta}\left(X_{z_{t}}=x | \mathbf{x}_{z_{<t}}\right)=\frac{\exp \left(e(x) ^{\top} g_{\theta}\left(\mathbf{x}_{\mathbf{z}<t}, z_{t}\right)\right)}{\sum_{x^{\prime}} \exp \left(e\left(x^{\prime}\right)^{\top} g_{\theta}\left(\mathbf{x}_{\mathbf{z}_{<t}}, z_{t}\right)\right)}
在公式中显示表示出了
(3)双流注意力机制
问题:当不同的排列组合如
为了解决上述问题,论文中引入了两个 Stream,也就是两个隐状态:
- 内容隐状态
,简写为 ,既可编码上下文位置也可以编码内容; - 查询隐状态
, 简写为 ,只是编码位置信息。
所以在预测当前
so during finetuning, we can simply drop the query stream and use the content stream as a normal Transformer(-XL). 在predict的过程中,使用
content stream
就可以。
(3)部分预测
排列语言模型排列很多,所以它的计算量很大,很难优化。因此我们只预测一个句子后面的一些词,为什么不预测前面的词呢?因为前面的词的上下文比较少,上下文信息相对较少。比如句子”I like New York”。预测I的时候没有任何上下文,因此可能的选择很多。而到最后一个词York的时候,如果New已经知道了,那么York的概率就非常大了。
只是对句子后面的token进行预测,节省计算时间。
可以得出
(4)融入Transformer-XL的思想
引入了Transformer-XL的主要思路:相对位置编码以及分段RNN机制。transformer要求输入是定长的词序列,太长的需要截断,不足的需要padding。这样的操作存在以下问题:
- 由于定长的要求,我们不可能让输入太长。因此虽然Self-Attention机制虽然不太受长度的约束,但是Transformer的语言模型实际能够考虑的上下文就是输入的长度。
- 因为语言模型是自回归的,一步错步步错。这就是所谓的context fragmentation的问题。
1). 建模多个segment
我们会把之前一个固定长度的词序列每一层的输出都放到一个cache里,比如把𝑥1,…,𝑥4的计算结果都存起来,那么在训练第二个Segment[𝑥5,…,𝑥8]的时候就可以让Self-Attention机制参考[𝑥1,…,𝑥4]的信息了。当然在反向计算梯度的时候,cache里的内容是不会参与梯度的计算的。
2). 相对Segment编码
BERT使用的是绝对的Segment编码,也就是第一个句子对于的Segment id是0,而第二个句子是1。Transformer-XL使用到了上一个 segment的信息,如果使用绝对编码,那么无法通过向量判断它是来自当前segment 中第
XLNet 效果好的原因:
- 与Bert采取De-noising Autoencoder方式不同的新的预训练目标:Permutation Language Model(简称PLM);这个可以理解为在自回归LM模式下,如何采取具体手段,来融入双向语言模型。这个是XLNet在模型角度比较大的贡献,确实也打开了NLP中两阶段模式潮流的一个新思路。
- 引入了Transformer-XL的主要思路:相对位置编码以及分段RNN机制。实践已经证明这两点对于长文档任务是很有帮助的。
- 加大增加了预训练阶段使用的数据规模;Bert使用的预训练数据是BooksCorpus和英文Wiki数据,大小13G。XLNet除了使用这些数据外,另外引入了Giga5,ClueWeb以及Common Crawl数据,并排掉了其中的一些低质量数据,大小分别是16G,19G和78G。可以看出,在预训练阶段极大扩充了数据规模,并对质量进行了筛选过滤。这个明显走的是GPT2.0的路线。
但是和BERT不同,我们并没有增加一个预测下一个句子的Task,原因是通过实验分析这个Task加进去后并不是总有帮助。【注:其实很多做法都是某些作者的经验,后面很多作者一看某个模型好,那么所有的Follow,其实也不见得就一定好。有的时候可能只是对某个数据集有效果,或者效果好是其它因素带来的,一篇文章修改了5个因素,其实可能只是某一两个因素是真正带来提高的地方,其它3个因素可能并不有用甚至还是有少量副作用。】
UNILM
参考文献
1). XLNet: Generalized Autoregressive Pretraining for Language Understanding 2). XLNet原理 3). 从语言模型到Seq2Seq:Transformer如戏,全靠Mask
DistilBERT 讲解
和ALBERT、TINYBERT一样,DistilBERT也是一种小型化的bert。DistillBert是在bert的基础上用知识蒸馏技术训练出来的小型化bert。
(1)主要的改进点
(2)算法步骤
(3)效果
模型大小减少了40%(66M),推理速度提升了60%,但性能只降低了约3%。

RoBERTa
RoBERTa: A Robustly Optimized BERT Pretraining Approach
强力优化的BERT 方法
本篇论文主要是在bert的基础上做精细化调参,可以看作是终极调参,最后性能不仅全面碾压bert,且在大部分任务上超越了XL-Net。
总结下,主要有以下六处改变的地方:
1)Adam算法中的参数调整,
因为作者认为原始的BERT 是训练不足(undertrained),所以这篇论文主要是采用各种不同的优化方法来增进BERT 的效能。
3)动态mask取代静态mask
原版bert的预训练只会在训练开始随机选择15%的词进行遮掩,但是一经选定,就会固定下来,不论训练多少个epoch。而动态遮词,则是会将数据进行副本备份,然后不同的副本随机遮词。
相当于增加了数据集(文中并没有明确指出动态mask 的优势,但事实就一般而言,多次训练也相当于对同一数据集进行了多次的训练)
对于Bert 的输入,作者给出的结论,尽可能选择大且多源的数据,尽可能大的batch size(配合着使用稍大的学习率)。
文章作者 jijeng
上次更新 2019-06-16