论文:ELECTRA: Pre-training Text Encoders As Discriminators Rather Then Generators

本文目前在ICLR 2020盲审中,前几天有审稿人发表文章对它大夸特夸,被称为19年最佳NLP预训练模型,另外,在上周的智源北京人工智能大会上,Christopher Manning对这个工作也做了详细介绍,那么,已经不用匿名了,这就是Manning大师的工作,怀着崇拜加欣喜的心情,细细学习了这篇文章,笔记如下。

摘要:虽然诸如BERT之类的掩码语言建模(MLM)预训练方法在下游NLP任务上产生了出色的结果,但它们需要大量的计算才能有效。这些方法通过用[MASK]替换一些词来改变输入,然后训练模型以重建原始词。作为替代方案,我们提出了一种更加样本有效的预训练任务,称为替换词检测。我们的方法不是掩盖输入,而是通过使用从小的生成网络采样的词替换一些输入词来改变输入。然后,我们训练一个判别模型,该模型可以预测损坏的输入中的每个词是否被生成器样本替换,而不是训练一个预测损坏的词的原始身份的模型。实验表明,这种新的预训练任务比MLM更有效,因为该模型从所有输入词中学习,而不仅仅是从被掩盖的小子集中学习。结果显示,在相同的模型大小、数据和计算条件下,通过我们的方法学习的上下文表示大大优于通过BERT和XLNet等方法学习的上下文表示,小模型的收益特别大,例如,在GLUE自然语言理解基准上,我们在一个GPU上训练了4天的模型优于GPT(使用30倍的计算能力训练)。我们的方法在规模上也能很好地发挥作用,我们和RoBERTa(当前最先进的预训练transformer)的性能相当,而使用的计算量不到它的1/4

1. 简介

当前最先进的语言表示学习方法可以看作是学习降噪自动编码,这类仅选择未标记输入序列的一小部分(通常为15%),掩盖这些标记或注意这些标记,然后训练网络以恢复原始输入的标记。 这些方法可以学习双向表示,因此比语言模型预训练更有效,但是这些掩码语言模型(MLM)方法仅从每个样本15%的词中学习,计算成本非常大。

我们提出了一个新的预训练任务replaced token detection,它的目标是学习区分输入的词。这个方法不采用mask,而是从一个建议分布中采样词来替换输入,这个过程解决了[mask]带来的预训练和fine-tune不一致的问题,然后我们训练一个判别器来预测每个词是原始词还是替换词。判别任务的一个好处是模型从输入的所有词中学习,而不是MLM中那样仅使用掩盖的词,因此计算更加有效。我们的方法很容易让人想起GAN,但其实并不是对抗学习,我们采用的是最大似然,目前GAN应用在文本领域还是有不少困难。

我们的方法称为 ELECTRA (Efficiently Learning an Encoder that Classifies Token Replacements Accurately),与之前的工作一样,我们用它来训练transformer的文本编码器,然后在下游任务上进行fine-tune。通过一系列的扩展,我们证明从所有输入序列中学习使得ELECTRA比BERT训练的更快,并且当完全训练时在下游任务上取得的效果也更好。

我们训练了不同大小的ELECTRA模型并在GLUE上评价它们的效果,发现:在相同的模型大小、数据、计算量的情况下,ELECTRA显著优于MLM类的方法,例如BERT和XLNet,详细对比如下图所示。此外,ELECTRA小模型仅需要在1块GPU训练4天即可得到,这个小模型比BERT小模型在GLUE上高5个点,甚至比更大的GPT模型效果还要好。此外,我们的方法在大规模情况下也取得了与当前最先进模型RoBERTa相当的效果,并且具有更少的参数,训练过程需要的计算不到它的1/4。我们的方法证明,区分真实数据和有挑战的负样本的判别式任务是一种更加计算有效和参数有效的语言表示学习方法。

2. 方法

本文提出的方法包括两个神经网络:一个生成器G和一个判别器D,两者都采用形如transformer的编码网络来获取输入序列x的向量表示h(x)。生成器的目标是训练成掩码语言模型,即给定输入序列x,首先按照一定的比例(通常15%)将输入中的词替换成[MASK]得到,然后通过网络得到向量表示hG(x),接着采用softmax层来为输入序列中掩盖的位置预测一个词,训练的目标函数为最大化掩盖词的似然。判别器的目标是判断输入序列每个位置的词是否被生成器替换过,如果与原始输入序列对应位置的词不相同就认为替换过。

生成器和判别器的损失函数如下:

最终的损失函数为生成器和判别器的加权和:

尽管我们的训练与GAN非常相似,但是有以下重要不同:

(1) 如果生成器生成的词恰好与输入相同,那么我们认为是没有替换过;

(2) 生成器的训练目标是最大似然,这点跟GAN的对抗训练非常不同;

(3) 我们并没有像GAN那样,给生成器应用噪声向量。

预训练结束后,我们采用判别器的来fine-tune下游任务

3. 实验

1. 模型扩展

(1) 权重共享

如果生成器和判别器采用相同的size,那么它们编码器的权重参数都可以共享,但是我们发现:采用更小的生成器,并将生成器和判别器的embeddings共享更加有效。具体地,当不采用权重共享时GLUE分数为83.6,当共享embeddings时分数为84.3,当所有参数共享时分数为84.4。考虑到所有参数共享时提升很少,但是还要求生成器和判别器的size相同,不够灵活,我们选择仅仅共享embeddings。

(2) 更小的生成器

如果生成器和判别器采用相同的size,那么总体的训练时间差不多是MLM的两倍,为了提高效率,我们尝试更小的生成器。我们在保持其他参数不变的情况下,减少生成器的layer size进行实验,同时我们还采用简单的unigram生成器作为对比,实验结果如下左图。我们发现,判别器的size越大越好(256 -> 512 -> 768),生成器的size介于判别器size的1/4-1/2时效果最佳。原因大概是太强的生成器对判别器太难了吧。

(3) 训练算法

我们对比了多种训练算法,效果如上右图:

(1) 两阶段训练方法:将联合训练的目标函数分成两步来做,首先训练生成器,然后固定生成器,并用它的参数来初始化判别器,训练判别器;

(2) 尝试GAN的对抗训练,利用强化学习来适应生成器采样的离散操作;

(3) 此外还对比了BERT。

我们发现:两阶段的训练算法在切换到第二阶段时提升明显,另外对抗训练的方法优于BERT,但是不如最大似然的联合训练。

2. 小模型

基于BERT-base的超参数,我们减少序列长度(512 -> 128),减少batch size(256 -> 128),减少隐层大小(768 -> 256),采用更小的embedding(768 -> 128),在相同算力的情况下进行模型效果对比,如下图。我们发现:ELECTRA小模型的效果比其他更多参数的模型更好,ELECTRA中等模型的效果甚至超越了BERT大模型

3. 大模型

我们的ELECTRA大模型采用BERT大模型相同的size,实验结果如下图,我们发现:ELECTRA达到了当前最先进模型RoBERTa的效果,但是训练的计算量不到它的1/4,简直是厉害!我们相信ELECTRA训练更久会有更好的结果。

4. 效率分析

为了更好地理解ELECTRA效果提升的原因在哪里,作者对比了一系列预训练方法:

(1) ELECTRA 15%:判别器在计算损失时仅考虑那些被掩盖的词(15%),除此之外都与标准的ELECTRA相同;

(2) Replace MLM:不同于MLM中用[MASK]替换掩盖的词,它用一个生成器模型预测的词来替换掩盖的词,其他的都与MLM保持一致,这是为了分析解决[MASK]在预训练和fine-tune过程不一致问题的收益有多大。

(3) All-Token MLM:与Replace MLM一样,采用生成器模型预测的词来替换掩盖的词,并且,该模型预测所有输入对应的输出,而不仅仅是掩盖的词。我们发现采用一个显式的拷贝机制,对每个词输出一个拷贝概率D,最终预测概率为拷贝概率D乘以输入,再加上 (1-D) 乘以MLM的softmax输出。这个模型结合了BERT和ELECTRA。

实验结果如下表所示,我们发现:

(1) ELECTRA 15%的效果相比ELECTRA差很多,说明ELECTRA对输入的所有词计算损失这一点收益非常大;

(2) Replace MLM效果略好于BERT,说明BERT采用[MASK]替换掩盖词会略微降低模型效果;

(3) All-Token MLM的几乎快弥补了BERT和ELECTRA之间的gap,是最接近ELECTRA效果的模型。

总的来说,ELECTRA的提升一大部分来自于从所有词中学习,一小部分来自于解决[MASK]在预训练和fine-tune过程的不一致

我们进一步对比了BERT和ELECTRA在不同模型大小的效果,如下图所示。我们发现:

(1) ELECTRA模型越小,相比BERT的提升就越明显(下图左边和中间);

(2) 模型收敛后ELECTRA效果明显优于BERT(下图右图)。

4. 总结

本文提出的ELECTRA在取得当前最先进模型相当效果的同时,计算量仅不到原来的1/4,非常有效。有效的原因一大部分来自于从所有词中学习,一小部分来自于解决[MASK]在预训练和fine-tune过程的不一致。

个人觉得,NLP预训练模型目前已经发展到了爆发期,新模型出来的节奏越来越快,非常期待更多的工作出来,对于我辈NLPer,这是一个最美好的时代,一定要跟紧节奏。

ELECTRA 超过bert预训练NLP模型相关推荐

  1. 刘铁岩:如何四两拨千斤,高效地预训练NLP模型?

    智源社区 & AI科技评论 作者 | 熊宇轩 智源导读:2020 年 11 月 1 日,微软亚洲研究院副院长.IEEE会士.ACM杰出科学家刘铁岩博士在第十九届中国计算语言学大会(CCL)上发 ...

  2. JAVA训练nlp模型,完胜 BERT,谷歌最佳 NLP 预训练模型开源

    雷锋网 AI 源创评论按:近日,谷歌宣布将 AI 语言模型 ELECTRA 作为 TensorFlow 之上的开源模型发布.该方法用到了一种称为替换令牌检测(RTD)的新预训练任务,使其能够在从所有输 ...

  3. 谷歌BERT预训练源码解析(一):训练数据生成

    目录 预训练源码结构简介 输入输出 源码解析 参数 主函数 创建训练实例 下一句预测&实例生成 随机遮蔽 输出 结果一览 预训练源码结构简介 关于BERT,简单来说,它是一个基于Transfo ...

  4. NLP发展大事记:顶会,预训练大模型,BERT系列

    文章目录 1. NLP发展重要时间线 时间线 2. NLP以BERT发展的延伸 3. NLP领域顶会 1. NLP发展重要时间线 聊聊NLP那些大事儿,预训练大模型大势所趋. 时间线 Transfor ...

  5. NLP之PTM:自然语言处理领域—预训练大模型时代的各种吊炸天大模型算法概述(Word2Vec→ELMO→Attention→Transfo→GPT系列/BERT系列等)、关系梳理、模型对比之详细攻略

    NLP之PTM:自然语言处理领域-预训练大模型时代的各种吊炸天大模型算法概述(Word2Vec→ELMO→Attention→Transformer→GPT系列/BERT系列等).关系梳理.模型对比之 ...

  6. bert中文预训练模型_HFL中文预训练系列模型已接入Transformers平台

    哈工大讯飞联合实验室(HFL)在前期陆续发布了多个中文预训练模型,目前已成为最受欢迎的中文预训练资源之一.为了进一步方便广大用户的使用,借助Transformers平台可以更加便捷地调用已发布的中文预 ...

  7. 预训练生成模型:结合VAE与BERT/GPT-2提高文本生成效果

    论文标题: Optimus: Organizing Sentences via Pre-trained Modeling of a Latent Space 论文作者: Chunyuan Li, Xi ...

  8. 天池零基础入门NLP竞赛实战:Task4-基于深度学习的文本分类3-基于Bert预训练和微调进行文本分类

    Task4-基于深度学习的文本分类3-基于Bert预训练和微调进行文本分类 因为天池这个比赛的数据集是脱敏的,无法利用其它已经预训练好的模型,所以需要针对这个数据集自己从头预训练一个模型. 我们利用H ...

  9. BERT(预训练Transformer模型)

    目录 一.前言 二.随机遮挡,进行预测 三.两句话是否原文相邻 四.两者结合起来 五.总结 六.参考链接 一.前言 Bert在18年提出,19年发表,Bert的目的是为了预训练Transformer模 ...

最新文章

  1. 开源轻量级办公系统Sandbox介绍以及配套开发文档连载
  2. python自带的集成开发环境是什么-Python的10大集成开发环境和代码编辑器(指南)...
  3. 安妮宝贝的50句经典语句
  4. 机器学习算法小结与收割offer遇到的问题
  5. 棋子--状态压缩dp
  6. 关于清空object对象里的属性的两种方法
  7. 面试官问面向对象特点_最好的面试官有什么共同点?
  8. 如何让你产品的用户拥有一流的上传体验
  9. 使用spring ioc基于纯xml配置模拟crud
  10. 基于Netty手写Tomcat
  11. 俄罗斯方块,C语言源文件,带有详细的注释
  12. 【咕嘎批量图片查找助手】如何批量根据图片文件名批量查找图片库,移动或复制到指定文件夹保存
  13. 科学管理之父——泰勒的故事
  14. ASAN Runtime【源码分析】(一)——初始化
  15. 未能联接game center服务器,Game Center无法毗邻服务器怎么办 五种方法任你选择
  16. 【汇编与接口】并行接口8255芯片实验
  17. php cgi sapi
  18. java GUI mysql实现的薪资工资管理系统项目源码附带视频指导教程
  19. java音乐播放器视频_java 实现音乐播放器的简单实例
  20. 倾城北栀:4.30日晚间行情分析以及操作策略

热门文章

  1. 数据结构(06)— 线性循环链表实战
  2. C++ 笔记(33)— C/C++ 程序员常见面试试题深入剖析
  3. VS Code 离线安装插件方法
  4. Linux shell 学习笔记(8)— 使用结构化命令(if-then 语句、数值比较、字符串比较、文件比较、case 语句)
  5. iloc loc 区别
  6. sql server登录名、服务器角色、数据库用户、数据库角色、架构区别联系
  7. pytorch中如何处理RNN输入变长序列padding
  8. LeetCode简单题之机器人能否返回原点
  9. CPU/GPU/TPU/NPU...XPU都是什么意思?
  10. 使用TensorRT集成推理inference