ELECTRA演算法真的在吊打BERT的同时,算力能节约一半以上吗?


简单说下我的理解吧。

ELECTRA和BERT最大的不同应该是在于两个方面:

  • masked(replaced) tokens的选择
  • training objective

第一个,token的选择BERT是随机的,这意味著什么呢?比如句子「我想吃苹果」,BERT可以mask为「我想吃苹[MASK]」,这样一来实际上去学它就很简单,如果mask为「我[MASK]吃苹果」,那么去学这个「想」就相对困难了。换句话说,BERT的mask可能会有很多简单的token,去学这些token就算是简单的bilstm都可以做的。这样一来,一个简单的想法就是,不随机mask,去专门选那些对模型来说学习困难的token。怎么做呢?这就是ELECTRA非常牛逼的地方了,train一个简单的MLM,当做模型对训练难度的先验,简单的自动过滤(在这里就是sample出来的和原句子一样),复杂的后面再学。还是举「我想吃苹果」这个例子。比如我这里还是mask为「我想吃苹[MASK]」,MLM这个生成器可以以很高的概率sample到「果」,但是对「我[MASK]想吃苹果」,MLM就很难说大概率采样到「想」了,也可能是「不」、「真」等等……总的来说,MLM的作用就是为自动选择masked tokens提供了一种非常有效的方法

第二个,既然MLM选择了一些token,那么该怎么去学呢?当然这个地方也可以像BERT那样,如果MLM采样的保持不变,就相当于原BERT中不mask;如果变了,就mask,然后再用BERT的方法去train。然而ELECTRA另辟蹊径,用一个二分类去判断每个token是否已经被换过了。这就把一个DAE(或者LM)任务转换为了一个分类任务(或者序列标注)。这有两个好处:(1)每个token都能contribute to some extent;(2)缓解distribution的问题。第一点是和MLM联系起来的(这也是ELECTRA精妙的地方了)。如果MLM牛逼,那么discriminate的难度就很大,从而就可以看作是hard example。第二点是,如果我们像BERT那样去预测真正的token,也即通过一个classifier [公式] 的话,那么它相比二分类器 [公式] 而言就需要更多的计算量,而且还要suffer 由于 [公式] 较大导致的分布问题。

以上两点总结起来就是:

[公式]

编辑于 2019-11-07继续浏览内容知乎发现更大的世界打开Chrome继续李rumor李rumor公众号「李rumor」,AI演算法小姐姐,朋克且极客,有猫

推一下自己写的小解读:

李如:ELECTRA: 超越BERT, 19年最佳NLP预训练模型?

zhuanlan.zhihu.com图标

有些小遗憾,论文中只讲了能达到RoBERTa的效果,但现在已经有T5了,我有点想看到ELECTRA的极限在哪里。其实还有很多想像的空间,也有很多待研究的地方,比如我们用wwm、spanBERT去做generator能不能提升效果,可不可以任务数据上用这种方式精调等等。希望后续的研究越来越精彩。


推一下自己写的小解读:

李如:ELECTRA: 超越BERT, 19年最佳NLP预训练模型?

zhuanlan.zhihu.com图标

有些小遗憾,论文中只讲了能达到RoBERTa的效果,但现在已经有T5了,我有点想看到ELECTRA的极限在哪里。其实还有很多想像的空间,也有很多待研究的地方,比如我们用wwm、spanBERT去做generator能不能提升效果,可不可以任务数据上用这种方式精调等等。希望后续的研究越来越精彩。


各位大神总结的很好,作为小弱的我来补充几点,欢迎大家吐槽和讨论:

问题一:ELECTRA中,预训练采用的是RTD(replaced token detection),那个generator的训练目标是什么?

答:采用MLE(最大似然估计)的方法,预测被mask掉的token原来的样子。也就是句子被mask掉一些token后,恢复(或者说还原)句子本来的样子。

问题二:RTD中,为什么generator采用MLE训练而不是强化学习的训练方式?

答:两个原因,首先强化学习在生成负样本时的采样效率非常低。其次,采用强化学习训练到的generator,其得到的负样本多样性太低了,负样本多样性的降低导致discriminator很容易区分出正样本和负样本,用通俗一点的话说,采用强化学习训练到的generator丢出的负样本套路太单一,discriminator容易「一猜一个准」。从而导致学习效果不佳(其实关于第一点我不是很懂)。原文如下:

We believe the worse accuracy is mainly due to the poor sample efficiency

of reinforcement learning when working in the large action space of generating text. Secondly, the adversarially trained generator produces a low-entropy output distribution where most of the probability mass is on a single token, which means there is not much diversity in the generator samples.

问题三:RTD中,generator的作用是?

答:1,选择性的过滤(或者说筛选)负样本,generator还原错误的token当成负样本,丢给discriminator,增加discriminator的学习难度。也就是选择性的负采样

2,避免discriminator的输入样本中有[MASK],从而缓解bert中出现的mismatch问题(mismatch问题指的是bert中预训练方式masked LM中,模型的输入有[MASK],但是下游任务并没有[MASK])。

问题四:ELECTRA相比bert,性能提升的主要原因是什么?

答:来源于两点,其中贡献最大的是discriminator可以learn from all tokens,也就是discriminator可以计算所有token的loss。其次就是上一个问题说的,缓解了bert中出现的mismatch问题。论文是这么说的:

In total, these results suggest a large amount of ELECTRA』s improvement can be attributed to learning from all tokens and a smaller amount can be attributed to alleviating the pre-train fine-tune mismatch.

问题五:ELECTRA为啥不试一下bert用过的,NSP(next sentence prediction)预训练方式?

答:因为作者说:

Also, we did not use the next sentence prediction objective proposed in the original BERT paper, as recent work has suggested it does not improve scores

也就是NSP没卵用。。

问题六:generator性能越牛逼越好吗?

答:错。generator如果太过强大,那么大部分被mask掉的token会被正确的预测,造成discriminator的负样本比例太少,且负样本难度较大,学习效果不好。因此作者建议generator的关键参数量(比如多头注意力的头数,hidden的维度等)是discriminator的四分之一到二分之一最好。

问题七:RTD预训练中,generator和discriminator的哪些参数共享的?为什么?

答:generator和discriminator的token embedding是共享的,原因在于discriminator自己每次只能更新generator送过来的负样本+原有正样本的token embedding,更新数量太有限,但是generator可以更新整个词表的 token embedding,因此共享token embedding可以让generator帮助discriminator加快更新token embedding

问题八:RTD预训练中,梯度为什么不能由discriminator回传给generator?

答(个人猜想,有待验证 ):如果generator产生的token和原来的token一模一样(也就是相当于discriminator的输入和generator的输入一样),那么这种情况下梯度回传是没有问题的,因为他们的输入是一样的。然而在实际的RTD预训练中,generator会产生负样本,与原来的token不一致,比如:the chef cooked the meal变成了the chef ate the meal,判别器接受输入的时候,他不知道哪个token被generator换过了,即generator在此时有一个sample过程,也就是说discriminator接受的有些token不是原来的token,那么此时如果咱们硬要把梯度回传过去,就会造成ate的梯度传给cooked,这样的话不是就错了吗?所以这就是作者说的由于sample step的原因,原文如下:

We don』t back-propagate the discriminator loss through the generator (indeed, we can』t because of the sampling step)


@香侬慧语科技 的回答很透彻,讲明白了ELECTRA和BERT的区别,看了很有收获。不过问题问的是演算法的表现以及算力上是否真的节省,这里我基于原文描述,简要回答一下问题并分享自己的浅见。

ELECTRA 与现有的生成式的语言表示学习方法相比,判别式的预训练任务具有更高的计算效率参数效率

  • 计算效率:训练判别器分辨每一个 token 是否被替换,而不是 MLM 那样训练网路作为生成器预测被损坏的 15% token 的原始 token,从而使模型从所有的输入 token 中学习而不是 MLM 中那样仅从 masked 的部分 token 学习。此外,生成器与判别器共享token embedding以及判别器使用的二分类而非V分类任务也有效提升了训练效率。
  • 参数效率:最终得到的判别式分类器不必对完整的数据分布进行建模

那么ELECTRA演算法真的在吊打BERT的同时,算力能节约一半以上吗?我们来原文 3.3 和 3.4 的实验。

首先是对小模型的表现。观察第二列中的Train / Infer FLOPs 以及最后一列的 GLUE 均分,同等计算成本下,效果超过 BERT-Small,甚至略高于计算成本更高的GPT,而且参数量极小。而且ELECTRA-Base 模型也优于 BERT-Base ,甚至优于 BERT-Large (GLUE得分84.0)。这正是ELECTRA所追求的以较少的计算量获得出色的结果,从而扩大在 NLP 中开发和应用预训练模型的可行性

再看大模型的表现(此时用的 XLNet 使用的数据集)。同样观察第二列与最后一列,ELECTRA与当前 RoBERTa 的性能相匹配,但是计算时间仅为其 1 / 4。

综上,与 MLM 相比,ELECTRA 的预训练目标具有更高的计算效率,并且可以在下游任务上实现更好的性能。尤其是在小模型上,其表现相当亮眼。

最后分享一个原文作者对模型的理解:论文第四节中提到,本文的工作可以看做是带有负采样的 CBOW 的大规模版本,将 CBOW 的 BOW encoder 换成 Transformer,将基于 unigram 的负采样换成了基于小型 MLM 生成器的负采样,并且将任务重新定义为关于输入令牌是否来自数据的二分类任务

这个解释很有意思,MLM 完成负采样,transformer 作为判别器,对所有 token 做二分类任务,这样不仅能从所有 token 中学习,而且二分类任务相比直接生成 token 的 [公式] 分类任务要简单,计算量也小,实在是精妙。

自行硬广:ELECTRA 的粗浅笔记,感兴趣的朋友可以看一下~

徐啸:ELECTRA: 更具计算效率与参数效率的文本编码器?

zhuanlan.zhihu.com图标


我个人对Electra的理解就是用Bert"欺骗"Bert,当然这和GAN还是有区别的,文中作者也对此作了解释。

那么Electra到底是做了一件什么事情呢?首先我们从Bert谈起,Bert使用MLM任务进行预训练,其中有15%的Token会被Mask掉,Bert会对著15%的Token进行预测。因此Bert所关注的也就只有这15%的输入,而其他信息全都成为了空气。Electra说:不行,我们要看剩下的85%里有什么。那么Electra怎么做的呢?

首先Electra使用生成器对Mask掉的文本进行预测,这里MASK的概率和Bert相同都是15%。例如:

the chef cooked the meal -&> [MASK] chef [MASK] the meal

经过Generator进行预测,这句话可能变成:

the chef ate the meal

然后我们把这句话输入到Discriminator中,Discriminator判断这些Token中那些被替换了,这里理想的结果应该是:

1 1 0 1 1

1表示是原始文本,0表示被替换了。

这样做效果如何呢,我们先看Small Electra,效果可以说是一骑绝尘。同等规模的情况下效果远超其他模型,Small Electra的Glue score要比Bert small高4.8个点,但是当规模变大,Electra Base的效果比Bert Base高2.9个点。没有Electra small那么亮眼,但也足够激动人心。毕竟Bert缩小版Albert也只是在xxLarge的情况下打败了Bert,但是Electra却赢得毫不费力。

小学生已经如此优秀,那么高中生呢?我们来看Electra Large的效果,是否如Small一样激动人心呢?结果依然不负众望,在SST, MRPC任务中Electra Large略逊于RoBERTa,其他任务都取得了很不错的成绩。需要注意的是在Electra之用了1/4的计算量就打败了RoBERTa。

如果用两个字来形容那就是牛逼!

Electra为什么会有这样的效果呢?文中做了一些对比实验:

  • ELECTRA 15%:使用Electra计算15%的loss
  • Replace MLM: 使用Bert训练在预训练的时候输入不用MASK而是用其他生成器的输出替换
  • All-TokensMLM:结合了Bert和Electra,Bert的预测变成了预测所有Token

他们的效果是这样的:

可以看到Electra 15%的效果和Bert相似,因此Bert之前只学习15%的Token的做法对于输入是有很大的信息损失的,而Electra的做法也弥补了这一损失。这也证明了之前作者的看法:Bert只学习15%的Token是不够的。Replace MLM的效果和Electra 15%的效果相差不大,这说明MASK的内容其实并不重要,重要的是要学习全部的输入序列。All-Tokens MLM的效果也解释了这一点。

通过这些实验结果,我想我们也可以理解为什么作者认为分辨器的任务比生成器复杂,分辨器的规模也要比生成器大。因为Input is all.(这句话是我加的)

当然Electra有让人疑惑的地方吗,也有。例如文章中讨论了其他实验方法,使用了最大化分辨器被替换的Token的RTD Loss,虽然如此但我个人还是不是特别满意。因为我认为为了保证分辨器的效果,生成器要给他尽可能复杂的替换效果。但是这里的RTD Loss关注的是分辨器,生成器在整个过程中所受到的关注并不多。当然文中实验也提到过,生成器规模变大,分辨器的效果会相对变差。那么文中此时也没有提到生成器规模变大,是否会导致生成器的loss降低,预测效果提高?而如果证明这一点,那么我也可以确定我之前的猜测并没有错:分辨器还是需要足够的噪音以提高效果

有关于Electra的实现和其他问题我在我的文章中有部分讨论,有兴趣可以一起研究~

lynne阿黎:ElECTRA:NLPER也可以使用GAN了?[Part-1]?

zhuanlan.zhihu.com图标lynne阿黎:ElECTRA:NLPER也可以使用GAN了?[Part-2]?

zhuanlan.zhihu.com图标

提几个insight上的疑问吧。

1 训练难度增加了,生成器把简单的mask给生成好了,只留下复杂的mask。但问题是,语言建模这个任务难道不是比二分类更难吗?如果用lm作为判别器的loss,会怎样呢?

2 所有的位置都能参与到loss中,而mlm只有15%的位置参与。作者文中的实验也表明,二分类任务中参与loss的比例越多,最后的效果也越高,这个提升很明显。我的疑问是,一定要所有的位置都参与到loss中吗?重要的会不会是参与到loss中的token数量?从roberta的实验来看,增大batch size,可以取得很大的提升,batch size大了,参与到loss中的token不也多了吗?既然如此,我可不可以猜测electra带来的提高可以部分被batch size的增大覆盖掉?

一点疑问,望指教。


我理解的是ELECTRA相比于BERT性能的提升和算力的节省主要来自于 相对于BERT系列模型随机MASK的策略,ELECTRA的策略实际上是去找缩小版BERT(generator)的易错的样本(或者直接说是 对抗样本或者负样本 我觉得也行),这应该也能解释为什么训练一个BERT当generator效果会差一些,因为BERT训练的比较好(参数多),虽然生成的负样本质量高了,但是相对的数量也少了,如果能补充一个实验,要求测试generator的大小和最终discriminator的性能的关系时,保证训练时用于discriminator的负样本数维持在一定水平,而不是随著generator越来越好负样本越来越少,我觉得结果应该会显示generator的大小比现在大一些效果会更好。至于文章中利用率的说法我不确定有没有效,毕竟LM虽然用得少但做的是词表大小的分类,序列标注说到底还是个二分类任务。

所以节约算力肯定是有的,简单粗暴的想法如果像累积梯度一样累积负样本,我觉得generator不用特别大也能训练一个还不错的discriminator


首先electra预训练任务难度是大于bert的。

比如小时候学习语文,老师为了加深你对汉语的理解,总是给出一段话,把一些词去掉(当然老师会有目的性的选词,bert是随机的),让你根据上下文来填写空缺词。我们可能会很快的根据上下文或者常识填好空缺词。

这时,语文老师加大了难度,会给你一段话,让你挑出这段话中哪里用词不当。这就是electra 判别器的预训练任务。

但是根据最近放出的源码自己实验效果来看,预训练任务的难度与模型抽取的特征是否成正比,就值得商榷了。


哈哈哈,Manning这ELECTRA模型一下子怎么火了?

Generator-Discriminator机制

论文还在盲审阶段,不知会不会受到影响?

读了论文后,感觉ELECTRA的表现提升大概可以归结两点:

1. All Tokens Prediction

在ELECTRA中巧妙的加入了Discriminator,由Bert中预测15% [mask] , 变为了对All Tokens的二分类问题 。直观上看就是 Bert利用了15%,而ELECTRA利用了100%。 在论文中,也提到了这种改进的提升会在有限的、小规模数据上更加显著。

在论文中,也进行了一系列的实验来证明 Input Tokens 利用率由15%到100% 所带来的收益非常可观。

2. Loss函数
ELECTRA Loss

在Bert中,我们是通过将hidden dimension 向vocab_size dimension(大约20000~30000) 进行映射,然后加上Softmax函数,找到最大概率的那个Token,再进行损失函数的计算。

而ELECTRA巧妙的加入了Generator-Discriminator机制,将损失模型直接转换为了简单的Real / Fake 二分类问题,没有了向vocab_size dimension映射的步骤(这里可能理解有误,文中 [公式] 的计算还不清楚具体操作,还是等源码吧,不过 [公式] 设置的是50,可以看出主要的还是 [公式] ),使得Loss的计算更加的高效。 速度上的提升,算力上的节省显而易见。

总结:

Input Tokens的高利用率高效的损失函数计算 的加持下,ELECTRA的表现超过Bert(尤其是在有限/相同资源的情况下),应该是不成问题。 但是否等达到节约一半算力,这个不好回答。还是等源码公开吧,但节约资源是肯定的。


推荐阅读:
相关文章