知行编程网知行编程网  2022-04-09 19:00 知行编程网 隐藏边栏 |   抢沙发  8 
文章评分 0 次,平均分 0.0

如何评价在20个任务上超越BERT的XLNet?

编辑:忆臻

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

本文仅作为学术分享,如果侵权,会删文处理

机器学习算法与自然语言处理报道

如何评价在20个任务上超越BERT的XLNet?


作者:张俊林
https://www.zhihu.com/question/330307904/answer/723872165

XLNet和Bert比,有什么异同?有什么模型方面的改进?在哪些场景下特别有效?原因又是什么?本文通过论文思想解读及实验结果分析,试图回答上述问题。

首先,XLNet引入了自回归语言模型以及自编码语言模型的提法,这个思维框架我觉得挺好的,可以先简单说明下。


自回归语言模型(Autoregressive LM)

在ELMO/BERT出来之前,大家通常讲的语言模型其实是根据上文内容预测下一个可能跟随的单词,就是常说的自左向右的语言模型任务,或者反过来也行,就是根据下文预测前面的单词,这种类型的LM被称为自回归语言模型。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的优缺点正好和自回归LM反过来,它能比较自然地融入双向语言模型,同时看到被预测单词的上文和下文,这是好处。缺点是啥呢?主要在输入侧引入[Mask]标记,导致预训练阶段和Fine-tuning阶段不一致的问题,因为Fine-tuning阶段是看不到[Mask]标记的。DAE吗,就要引入噪音,[Mask] 标记就是引入噪音的手段,这个正常。


XLNet的出发点就是:能否融合自回归LM和DAE LM两者的优点。就是说如果站在自回归LM的角度,如何引入和双向语言模型等价的效果;如果站在DAE LM的角度看,它本身是融入双向语言模型的,如何抛掉表面的那个[Mask]标记,让预训练和Fine-tuning保持一致。当然,XLNet还讲到了一个Bert被Mask单词之间相互独立的问题,我相信这个不太重要,原因后面会说。当然,我认为这点不重要的事情,纯粹是个人观点,出错难免,看看就完了,不用较真。


XLNet做了些什么

上文说过,Bert这种自编码语言模型的好处是:能够同时利用上文和下文,所以信息利用充分。对于很多NLP任务而言,典型的比如阅读理解,在解决问题的时候,是能够同时看到上文和下文的,所以当然应该把下文利用起来。在Bert原始论文中,与GPT1.0的实验对比分析也可以看出来,BERT相对GPT 1.0的性能提升,主要来自于双向语言模型与单向语言模型的差异。这是Bert的好处,很明显,Bert之后的改进模型,如果不能把双向语言模型用起来,那明显是很吃亏的。当然,GPT 2.0的作者不信这个邪,坚持沿用GPT 1.0 单向语言模型的旧瓶,装进去了更高质量更大规模预训练数据的新酒,而它的实验结果也说明了,如果想改善预训练语言模型,走这条扩充预序列模型训练数据的路子,是个多快好但是不省钱的方向。这也进一步说明了,预训练LM这条路,还远远没有走完,还有很大的提升空间,比如最简单的提升方法就是加大数据规模,提升数据质量。


但是Bert的自编码语言模型也有对应的缺点,就是XLNet在文中指出的,第一个预训练阶段因为采取引入[Mask]标记来Mask掉部分单词的训练模式,而Fine-tuning阶段是看不到这种被强行加入的Mask标记的,所以两个阶段存在使用模式不一致的情形,这可能会带来一定的性能损失;另外一个是,Bert在第一个预训练阶段,假设句子中多个单词被Mask掉,这些被Mask掉的单词之间没有任何关系,是条件独立的,而有时候这些单词之间是有关系的,XLNet则考虑了这种关系(关于这点原因是否可靠,后面会专门分析)。


上面两点是XLNet在第一个预训练阶段,相对Bert来说要解决的两个问题。

其实从另外一个角度更好理解XLNet的初衷和做法,我觉得这个估计是XLNet作者真正的思考出发点,是啥呢?就是说自回归语言模型有个缺点,要么从左到右,要么从右到左,尽管可以类似ELMO两个都做,然后再拼接的方式。但是跟Bert比,效果明显不足够好(这里面有RNN弱于Transformer的因素,也有双向语言模型怎么做的因素)。那么,能不能类似Bert那样,比较充分地在自回归语言模型中,引入双向语言模型呢?因为Bert已经证明了这是非常关键的一点。这一点,想法简单,但是看上去貌似不太好做,因为从左向右的语言模型,如果我们当前根据上文,要预测某个单词Ti,那么看上去它没法看到下文的内容。具体怎么做才能让这个模型:看上去仍然是从左向右的输入和预测模式,但是其实内部已经引入了当前单词的下文信息呢?XLNet在模型方面的主要贡献其实是在这里。


那么XLNet是怎么做到这一点的呢?其实思路也比较简洁,可以这么思考:XLNet仍然遵循两阶段的过程,第一个阶段是语言模型预训练阶段;第二阶段是任务数据Fine-tuning阶段。它主要希望改动第一个阶段,就是说不像Bert那种带Mask符号的Denoising-autoencoder的模式,而是采用自回归LM的模式。就是说,看上去输入句子X仍然是自左向右的输入,看到Ti单词的上文Context_before,来预测Ti这个单词。但是又希望在Context_before里,不仅仅看到上文单词,也能看到Ti单词后面的下文Context_after里的下文单词,这样的话,Bert里面预训练阶段引入的Mask符号就不需要了,于是在预训练阶段,看上去是个标准的从左向右过程,Fine-tuning当然也是这个过程,于是两个环节就统一起来。当然,这是目标。剩下是怎么做到这一点的问题。


作者:Towser

https://www.zhihu.com/question/330307904/answer/721986216

刚看完文章。效果就不比了,屠榜了没什么好说的。


1、监督信号的提取

BERT 有两个目标,Masked Language Model 和 Next Sentence Prediction,前者用于提取单词之间的关系,后者用来提取句子之间的关系。前者带来的问题在于, 训练时引入 [MASK] token 使得 train/test 不一致,于是又用了很多乱七八糟的方法来补救(以一定概率保留原词,一定概率换成别的单词等等)。


新的目标 Permutation Language Model 就没这个问题。PLM 的大意是把输入的句子链式分解一下,然后用最大似然来训练。只不过这里的分解不是通常语言模型的 left-to-right factorization,而是以任意顺序排列进行 factorization,最后求期望。当然,具体实现的时候用采样代替期望,随机选取一个具体排列进行计算,例如将 1 -> 2 -> 3 -> 4 调整为  2 -> 4 -> 3 -> 1,然后优化样本似然

如何评价在20个任务上超越BERT的XLNet?

shuffle 过后(代码实现中调整 attention mask 即可,不必 shuffle 输入)预测单词 3 时可以观测到单词 2 和 4 的信息,实现双向的信息提取。另外,Grover 训练时也会 shuffle metadata,有一定的相似之处,可能是大势所趋吧。这种乱序的输入很适合完形填空的场景(单讲完形填空的话其实 BERT 更适合,但对于完整的输入文本 BERT 就有些货不对板了)。


BERT 的另一个训练目标 NSP 对于提取句间关系的任务很有帮助,甚至有后续研究说即便是单句的任务也可以构建出一个辅助句进而获益(如 "BERT for Aspect-Based Sentiment Analysis via Constructing Auxiliary Sentence");而 XLNet 的实验发现 PLM 和 NSP 不兼容,加入 NSP 对大多数任务都是有害的。两个模型的优点不能融合,着实有些遗憾。


题外话,Bert时代的创新:Bert在NLP各领域的应用进展文末对 BERT 的适用场景有很好的总结,推荐一读。

GPT 等普通语言模型的训练目标是 Causal Language Model,BERT 的训练目标是 MLM,在此基础上通过改进 mask 又有了 Whole Word Masking/N-gram Masking/ERNIE 等目标。把 Transformer 的 encoder 和 decoder 都用上可以得到 MASS,双语平行语料预训练可以用 TLM。如今又多了一个 PLM 的目标,很高兴看到这样的进步,期待以后能有更多的手段从语料里无监督地提取到更多的知识。但不管怎么说,这都是土豪的游戏了,一般人玩不起。


PLM 可能带来的另一个潜在收益是,XLNet 应该具有一定的文本生成能力,从这一点上讲它和 UNILM 更像。理解和生成相统一,可能也是未来的趋势之一。

XLNet 在 GLUE benchmark 的几乎所有任务上都比先前最优水平得到了提升,但是 CoLA 这一项的表现似乎不尽如人意。CoLA 是判断一个句子是否在语法上合理的,是不是说明这个任务较为依赖单词顺序?


XLNet 的提升来源主要有两部分,一是来源于 Transformer-XL 对更长的上文信息的提取,二是来源于 PLM 训练目标与下游任务的一致性(没有 train-test skewness)。Table 6 中的 ablation study 发现,第一点带来的提升相当明显(对比 row 2 和 row 1),使得 DAE + Transformer-XL 在 RACE 和 SQUAD 上明显超过了 BERT-Base(MNLI 和 SST-2 上没有明显变化,是因为这两个任务没有长程依赖)。由此可见 BERT 处理长文本其实还是有些力不从心,而 Transformer-XL 则把 stateful RNN 的思想在 Transformer 上复活了。第二点的提升效果也很明显,并且所有任务都能从中受益。


XLNet 计算量和激活值比 BERT 更大,有可能接近 BERT 的 2 倍(因为 XLNet 要给每个位置维护两套隐状态,一套是包含当前 token 信息的 content stream h,另一套是不包含当前 token 信息的 query stream g。此外还有前一个 segment 的缓存)。细节详见论文 2.3 节 Two-Stream Self-Attention 的相关描述,大意如下图:


如何评价在20个任务上超越BERT的XLNet?


于是,即便是对于 left-to-right 这种特殊情形的分解,XLNet 可能也比 GPT 更强:假设要预测单词 4,GPT 的输入和输出是错位一个时间步的,即读入 1,2,3,然后在 3 的位置预测 4;而 XLNet 的输入和输出时间步数是相同的(这一点类似于 BERT),输入 1,2,3,4 并在 4 的位置预测 4。当然,XLNet 不会读取第 4 个时间步的单词(否则有信息泄露),仅仅利用位置 4 的 position embedding,告诉模型现在想要预测第 4 个位置。XLNet 在第 4 步的输入向量是一个 query vector(在最底层是一个可学习的参数w,在中间层是 query stream g)来对 1,2,3 各个时间步进行 attend,和 GPT 相比多一个时间步的输入,多一轮 query & attend 的过程,因此有可能更强。


文章中还说,XLNet-Large 依然是欠拟合训练数据的,但是再训练对于 downstream task 已经没有用了。这一点有些奇怪,可以进一步探究的是,存在于这些数据中、但是对下游任务没有帮助的到底是什么信息?也许是跟语言生成(而非判别)有关的?也许我们应该寻找新的、能够从这些信息中获益的下游任务——也许是比 GLUE benchmark 更难,但又比长篇文本生成更简单的任务,例如 DecaNLP?今天 GLUE 已经接近解决,这些任务也许可以作为更好的 NLP 领域风向标。


2、数据规模

XLNet-Base 和 Bert-Base 数据集是一样的,效果也有比较明显的提高,说明 XLNet-Base 确实更好。

但是 XLNet-Large 除了放大模型之外还用了更多的数据,在 BERT 所用的 BooksCorpus & English Wikipedia 的基础上还增加了 Giga5, ClueWeb 2012-B, and Common Crawl,扩大到了原先的 10 倍。不知道 BERT-Large 在这样的数据上表现如何?预期应该会变好(@霍华德 在这个回答里也说了腾讯 AI Lab 用 200G 语料训出的 BERT-Large 又变强了一大截),但应该不会超过 XLNet。


3、优化方法

XLNet-Large 用 512 TPU v3 chips 训了 2.5 天,而 BERT-Large 用 64 TPU chips 训了 4 天。也就是说,训练 XLNet 所需的浮点运算次数大约是 Bert 5 倍。再考虑到 XLNet 计算量和激活值大约是 BERT 的 2 倍(我真的很好奇他们是怎么把这个模型塞进 TPU 的。TPU v3 每个 core 也只有 16G HBM 啊,TPU 上的 XLA 优化这么强的吗?),语料规模是 BERT-Large 的 10 倍,如果不考虑代码实现的效率差异的话,可以近似认为 XLNet 的训练效率是 BERT 的 4 倍。


训练效率的提高可能有两个来源:

  • 其一是对多个预测目标之间的关系的建模。文中有一个例子,假如输入是 New York is a city,想要预测的目标是 New York,那么 BERT 在预测 New 和 York 时是互相独立的,即优化 P(New|is a city)P(York|is a city);而 XLNet 则是优化 P(New|is a city)P(York|New, is a city)。这种单词间依赖的建模使得 XLNet 的预训练更有效率。BERT 不建模多个预测之间的相互依赖可能导致重复预测等问题(可以参考百度 ERNIE 给出的一些 bad case,如下图中的“糖糖内”和“日阳”),于是前段时间谷歌给 BERT 发布了一个叫 Whole Word Masking 的补丁。不过从原理上讲 wwm-MLM 依然不如 PLM,因为 wwm-MLM 还是没有真正建模多个目标词之间的依赖,只是让模型在这种情况下多训练来缓解。


如何评价在20个任务上超越BERT的XLNet?
BERT 中文模型翻车现场


  • 其二是 XLNet 理论上可以训练输入序列所有的 token,而 BERT 只能训练 15% 被掩掉的 token。虽然实际操作中 XLNet 只训练了 permutation 最后 1/K(K=6 或 7)的 token,因为这些 token 的上下文最长,更有利于模型提取上下文信息。不过我觉得可以在训练初期使用大部分 token,仅当训练接近结束时切换成只训练上下文最长的 1/K,以便进一步提高样本利用率和训练效率。GPT 可以训练全部 token,MASS 可以训练 50% token,XLNet 理论上也能训练较大比例的 token(虽然实际只训了 1/K,但如果精心设计 permutation 的形式和训练过程,把 K 从 6 降到 2 或 3 不算离谱),BERT 这个废柴怎么就只能训 15% 的 token 呢?

4、彩蛋:

GPT-2 是如何看待 XLNet 的


如何评价在20个任务上超越BERT的XLNet?


5、吃瓜群众可以干什么

其实更大规模的模型出现对大家来说可能反而是一件好事,因为:

  • 模型越大,越多人跑不起,这样大家审稿时也就不会太苛责 sota,转而关注研究本身的价值而非实验结果。这个道理就好比,假如一项研究只有 10% 的人能做得起,他们可能会借着手里的资源优势抓紧灌水;但是如果门槛抬高到了只有 0.1% 的人能做得起的程度,新的  9.9% 被资源门槛筛下来的人就会跟一开始被筛的 90% 的人回到同一阵营中,开始互相理解。

  • 这些工作也带来了新的机会。对于硬件厂商,怎么做专用芯片?TPU 现在还是一家独大,GPU 没个 V100 好像也要脱离时代了。对于后端框架,如何做内存优化?如果这些巨无霸模型大多数人都跑不起来(暂且认为大多数人拥有的单卡显存 <=16G),必然不利于整个行业的发展。对于业界,如何进行模型压缩?很多文章都指出 BERT 有很多冗余参数(例如 Are Sixteen Heads Really Better than One? 指出很多层只保留一个 attention head 就够了),怎么把这类模型的体积和延迟都减小到适合部署的程度?


—完—

为您推荐

如何学习SVM以及改进SVM算法程序?
meta-learning和few-shot learning的关系是什么?
GitHub 3W 星超实用技术面试手册,看这篇就够了
如何利用Python开发人工智能入门项目
【微软】AI-神经网络基本原理简明教程

本篇文章来源于: 深度学习这件小事

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享