5.6 Electra模型介绍
Electra模型¶
学习目标¶
- 掌握Electra模型的架构.
- 掌握Electra模型的优化点.
Electra模型架构¶
-
Electra模型是2020年提出的最新版的预训练模型, 原始论文题目: << ELECTRA: PRE-TRAINING TEXT ENCODERS AS DISCRIMINATORS RATHER THAN GENERATORS >>, 由谷歌公司和斯坦福大学共同提出.
-
作者在论文中阐明, 模型的名称ELECTRA的由来是"Efficiently Learning an Encoder that Classifies Token Replacements Accurately".
总体架构¶
- 首先来看Electra模型的架构图
- 如上图所示, 整个模型分成两部分, 左半部是一个生成器Generator, 右半部是一个分类器Discriminator.
- 生成器Generator: 在一个较小的网络上训练经典的MLM任务, 使得生成器能够准确的复现那些被[MASK]掉的token, 也就是说左侧的生成器负责还原原始输入.
- 分类器Discriminator: 是ELECTRA的主体, 训练一个二分类器, 使得分类器能够准确的判断Generator输出的每一个token, 到底是原始输入的token, 还是已经被替换掉的replaced token.
训练方法¶
-
首先专注于MLM任务的对比. 自从BERT模型中引入MLM任务预训练后, 诸多优秀的模型都采用这种任务(比如XLNet等), 尽管相比于传统语言模型, 他们使用Transformer在正反两个方向上对语义进行学习, 使得学习效率有了很大提升. 但是这些模型只对input中的一小部分进行学习(比如BERT的15%), 所以仍旧耗费了大量的算力.
-
为了进一步提升预训练语言模型的学习效率, 论文作者提出了新的任务RDT(Replaced Token Detection), 用以作为MLM任务的替代品.
-
RDT任务就是两部分:
- 第1部分: 首先通过一个较小的Generator对BERT中的[MASK]进行预测还原.
- 第2部分: 然后通过一个Discriminator对步骤1中的每个单词进行二分类预测, 原始token还是replaced token?
- 通过上述的训练方法, 我们会发现整个模型会从input序列中的全部tokens进行学习, 这区别于BERT的15%的tokens, 而这也是ELECTRA总能使用更少的算力, 更少的参数, 达到比BERT更好的效果.
- 对于预训练模型, 主流上有3种训练方法:
- 1: 两阶段训练法.
- 2: GAN训练法.
- 3: 联合训练法.
-
第1种: 两阶段训练法.
- 首先, 只对Generator连续训练n-steps.
- 使用Generator的参数对Discriminator进行初始化, 然后对Discriminator连续训练n-steps, 与此同时保持Generator的参数不变.
-
两阶段训练法有一个前提: 要求Generator和Discriminator要有相同的规模.
-
经过试验发现, 如果在两阶段训练中不使用参数共享, 最终学到的判别器可能在很多类别上什么也没有学到. 分析原因后推测, 这可能是因为Generator启动速度比Discriminator快得多, 即Generator已经学会了高中知识并给出了高中阶段的题目, 而Discriminator还只是小学生水平.
-
第2种: GAN训练法.
- 从上图右侧可以看出来, 对抗式ELECTRA训练效率超过两阶段训练法, 但是不如经典的联合训练法.
-
综合分析造成GAN如果联合训练法的原因, 主要有两点:
- 第一: 对于RF而言, 全部文本组成的action space太大了, 采样效率太低造成学习效率很低.
- 第二: 对抗训练得到的结果是低熵的输出分布, 在softmax的影响下, 大多数的概率分值落在单一token上, 导致Generator的输出没有足够的多样性. 形象化的理解就是Generator给出的题目缺乏灵活性, 缺乏多样性, 缺乏难度, 这样的题目Discriminator做起来没有足够的学习价值.
损失函数¶
- 在ELECTRA中, Generator可以是任意模型, 它的任务是对被随机MASK掉的token进行预测, 一般实际采用一个较小的BERT模型, 与Discriminator一起进行训练. Discriminator的任务是分辨出到底哪个token是被Generator篡改过, 以至于和原始token不一致, 本质上是进行一次二分类, 判断Generator输出的任意一个token是原始token, 还是replaced token.
-
具体来说, Generator和Discriminator是我们训练得到的两个神经网络, 二者都包含Encoder(架构是Transformer网络), 从而将input序列从x映射到h(x). 但二者有不同的训练任务, 因此要用不同的损失函数对它们进行衡量.
- Generator: 任务是根据上下文对被随机MASK掉的token进行预测, 采样空间是全体词表V, 因此损失函数用softmax损失.
- Discriminator: 任务是对任意一个token是原始token, 还是replaced token进行二分类判断, 因此损失函数用sigmoid损失.
-
ELECTRA的最终损失函数由Generator和Discriminator一同组成, 因为Generator模型较小且任务相对更难, 所以损失值更大. 对于联合多任务训练, 我们希望模型可以同时关注两者的loss, 所以在这里给Generator更大的关注度, 数学技巧上则是给Discriminator的损失值加上一个系数lambda:
实验细节¶
-
参数共享机制: 预训练模型的时代, 参数共享机制是一个很常用的技巧, 既可以缩小模型规模, 又可以提升参数的学习效率. 当Generator和Discriminator规模相等时, 二者之间可以将参数完全共享.
-
经过大量的实验对比验证, 更小的Generator对结果更有帮助, 因此在ELECTRA中只共享了Generator和Discriminator中的embedding层参数(包括token embedding和positional embedding). 实验数据表明, 不进行参数共享GLUE score=83.6, 全部参数共享GLUE score=84.4, 只进行embedding层参数共享GLUE score=84.3, 分析原因后认为Discriminator只会更新input序列中涉及到判别token的参数, 而Generator会对词表中的全部单词进行权重更新, 所以共享参数会导致资源浪费.
- 更小的生成器: 如果设置Generator和Discriminator规模相当, 则整个预训练的时间会大约变成原来的2倍. 下图左侧所示, 当Discriminator规模不变的情况下, Generator的规模越大, 反倒会导致结果的下降. 最终实验发现最佳的Generator大小为Discriminator规模的¼ - ½.
- 结论: 更小的Generator有更优的结果, 可以理解为一个更强大的生成器会给出太难的题目, 以致于判别器无法学习, 跟不上节奏!!!
Electra模型的成绩¶
- 首先在经典的GLUE数据集上, ELECTRA模型在大部分任务上得到了更优的结果.
- 如下图所示, 在NLP领域中属于"难任务"的阅读理解SQuAD数据集上, ELECTRA的加大模型也几乎在所有的任务上得到了最优的结果, 仅仅在1个指标上低于强大的XLNet模型.
小节总结¶
-
本小节学习了Electra模型的架构.
- ELECTRA模型包含两部分, 生成器Generator和分类器Discriminator.
- 生成器Generator是在一个较小的网络上训练经典的MLM任务, 使得生成器能够准确的复现那些被[MASK]掉的token, 本质上是在负责还原原始的输入.
- 分类器Discriminator是训练一个二分类器, 使得分类器能够准确的判断Generator输出的每一个token, 到底是原始输入的token, 还是已经被替换掉的replaced token.
-
关于ELECTRA的训练:
- 通过对比两阶段训练法和GAN训练法, 采用了效果最好的联合训练法.
- 联合训练法即同时训练Generator和Discriminator, 对于联合loss中的Generator给予更多的关注, 对Discriminator添加一个lambda系数来降低关注度.
-
关于常见的预训练模型, 可以直接到https://huggingface.co/models网站下载, 非常方便.