对标GPT,BERT系列文章
BERT简单回顾
输入
BERT将两个片段(令牌序列)的连接作为输入, x 1 , ⋯ , x N x_1,\cdots, x_N x1,⋯,xN和 y 1 , ⋯ , y M y_1,\cdots,y_M y1,⋯,yM。
片段通常由一个以上的自然句子组成。
这两个片段被表示为BERT的单个输入序列,并使用特殊的标记来分隔它们: [ C L S ] , x 1 , ⋯ , x N , [ S E P ] , y 1 , ⋯ , y M . [ E O S ] [CLS],x_1,\cdots,x_N,[SEP], y_1,\cdots,y_M.[EOS] [CLS],x1,⋯,xN,[SEP],y1,⋯,yM.[EOS]。M 和 N被约束,使得 M + N < T,其中 T 是一个参数,在训练过程中控制最大序列长度。
模型结构
BERT使用现在 transformer 架构(encoder部分)。
使用L层的 transformer 架构。每个块使用 A 个自注意头和隐藏维度 H。
训练任务
Masked Language Model (MLM)
MLM的目标是预测 mask token 的交叉熵损失
BERT统一选择15%的输入 token 进行可能的替换。
在所选的标记中,80%被[MASK]替换,10%保持不变,10%被随机选择的词汇表标记替换。
在最初的实现中,随机屏蔽和替换在开始时执行一次,并保存到训练期间,尽管在实践中,数据是重复的,所以掩码并不总是对每个训练句子相同
Next Sentence Prediction (NSP)
NSP是一种二元分类损失,用于预测原文中两个片段是否相互遵循。
正例是通过从文本语料库中选取连续的句子来创建的。
反例是通过配对来自不同文档的片段创建的。
正例和反例以相等的概率抽样。
NSP目标旨在提高下游任务的表现,例如自然语言推理,该任务需要对句子对之间的关系进行推理。
实验
BERT与Adam 使用以下参数进行优化:
β 1 β_1 β1 = 0.9, β 2 β_2 β2 = 0.999, ϵ \epsilon ϵ = 1e-6, L 2 L_2 L2 权重衰减为0.01。
在前10,000步中,学习率被加热到1e-4的峰值,然后线性衰减。
BERT训练在所有层和注意力权重上的dropout为0.1,并具有GELU激活函数。
模型预训练为S = 1,000,000次更新,其中包含B = 256个序列,最大长度T = 512个token
data
BERT是在BOOKCORPUS和英文WIKIPEDIA的组合上训练的,总共有16GB的未压缩文本
RoBERTa
github:https://github.com/pytorch/fairseq
论文:https://arxiv.org/pdf/1907.11692.pdf
在BERT基础上改进点:
- 采用动态MASK
- 去掉Next Sentence Prediction
- 增大数据集,更大的 batch_size
- Byte-level BPE编码
动态MASK
在动态掩蔽中,每次向模型输入序列时都会生成掩蔽模式。
在对更多步骤或更大的数据集进行预训练时,这一点变得至关重要。
使用静态掩蔽的重新实现的性能与原始BERT模型相似,动态掩蔽与静态掩蔽相当或略好
Model Input Format and Next Sentence Prediction
Devlin等人(2019)观察到,删除NSP会损害性能,在QNLI、MNLI和SQuAD 1.1上的性能会显著下降。
一些研究对NSP损失的必要性提出了质疑
研究了4种模型输入格式与NSP的关系
SEGMENT-PAIR+NSP
这遵循BERT中使用的原始输入格式,并使用NSP损失。
每个输入都有一对段,每个段可以包含多个自然句子,但总长度必须小于512个令牌。
SENTENCE-PAIR+NSP
每个输入包含一对自然句子,要么从一个文档的连续部分采样,要么从单独的文档采样。
由于这些输入明显少于512个令牌,增加了批处理大小,使令牌的总数保持类似于SEGMENT-PAIR+NSP。
保留NSP损失。
FULL-SENTENCES
每个输入都包含从一个或多个文档连续采样的完整句子,因此总长度最多为512个标记。
输入可以跨越文档边界。当到达一个文档的末尾时,开始从下一个文档中抽取句子,并在文档之间添加一个额外的分隔符标记。
消除了NSP损失。
DOC-SENTENCES
输入的构造类似于完整的句子,除了它们不能跨越文档边界。
在文档末尾采样的输入可能少于512个令牌,因此在这些情况下动态增加批处理大小,以实现与fullsentence类似的令牌总数。
消除了NSP损失。
result
上图显示了四种不同设置的结果。
首先将Devlin等人(2019)的原始SEGMENT-PAIR输入格式与SENTENCE-PAIR格式进行比较;两种格式都保留了NSP的损失,但后者使用单句。
可以看到使用单个句子会损害下游任务的性能,假设这是因为模型无法学习长期依赖关系。
接下来,比较没有NSP损失的训练和有来自单个文档的文本块(doc - sentence)的训练。
发现这种设置优于最初发布的BERTBASE结果,并且与Devlin等人(2019)相比,删除NSP损失匹配或略微提高了下游任务性能。原来的BERT实现可能只是删除了丢失项,同时仍然保留了SEGMENT-PAIR输入格式。
最后,发现限制序列来自单个文档(doc - sentence)比打包来自多个文档的序列(full - sentence)表现略好。然而,由于doc - sentence格式会导致不同的批处理大小。
所以,最后RoBERTa是采用去掉NSP而且一个样本是从同一个文档里面进行采样。
Training with large batches
神经机器翻译方面的工作表明,当学习率适当提高时,使用非常大的小批量训练可以提高优化速度和最终任务性能。最近的工作表明,BERT也适用于大批量训练。
最初训练BERTBASE为 1M 步,批处理大小为 256 个序列。通过梯度积累,这相当于训练批量大小为 2K 序列的 125K 步,或 训练批量大小为 8K 的 31K步。
控制训练数据的通过次数的情况下,增加批处理大小
大批量训练提高了 mask 语言建模目标的困惑度,以及最终任务的准确性
通过分布式数据并行训练,大批量也更容易并行化
最后RoBERTa采用的batch_size是 8K
Byte-level BPE编码
Byte-Pair Encoding (BPE) 是字符级和单词级表示的混合,允许处理自然语料库中常见的大型词汇表
BPE依赖于子词单元,而不是完整的单词,这些子词单元通过对训练语料库进行统计分析来提取。
BPE词汇量大小通常为10K-100K子词单位。然而,在对大型和多样化的语料库建模时,unicode字符可以占这个词汇表的相当大的一部分
BERT实现使用大小为 30K 的字符级BPE词汇表
RoBERTa采用更巧妙的BPE偏码方式——Byte-level BPE,使用字节而不是unicode字符作为基本子字单位
使用字节可以学习适度大小(50K单位)的子词词汇表,它仍然可以对任何输入文本进行编码,而不引入任何“未知”tokens。
RoBERTa 使用包含 50K 子词单位的更大 Byte-level BPE 词汇表来训练BERT,而不需要对输入进行任何额外的预处理或标记化,即在不需要引入任何未知字符前提下对任意文本进行编码
这分别为BERTBASE和BERTLARGE增加了大约15M和20M的额外参数
早期的实验显示,这些编码之间只有轻微的差异,Radford等人(2019)的BPE在某些任务上的结束任务性能略差。
尽管如此,相信通用编码方案的优点超过了性能上的微小下降
更多数据
在BERT采用的数据BOOKCORPUS + English WIKIPEDIA(共16G)基础上
- 增加 CC-NEWS(76GB)
- 增加 OPENWEBTEXT(38GB)
- 增加 STORIES(31GB)
也就是RoBERTa一共用了160GB语料进行预训练。
result
采用更多的数据、更大的batch_size、训练更多轮,都对模型效果有所提升。
ALBERT
论文地址:https://arxiv.org/pdf/1909.11942.pdf
github地址:https://github.com/google-research/ALBERT
ALBERT:轻量版的BERT模型。通常情况下,增加模型规模能提高模型的性能,由于GPU/TPU内存的限制和更长的训练时间,进一步增加模型变得更加困难,不能无限制地增加下去。
提出了两种参数约简技术,以降低内存消耗并提高BERT的训练速度(减少参数跟增加模型规模是不矛盾的,减少参数的同时也可以增加模型规模!例如通过共享参数,但增加网络层深度来减少参数和增加模型规模)。
使用专注于句子间连贯性建模的 self-supervised loss,并表明它始终有助于多句输入的下游任务
值得注意的是,大家都说ALBERT的性能比BERT要好,实质上,ALBERT-large版本的性能是比BERT-large版本的性能差的!
大家所说的性能好的ALBERT版本,是xlarge和xxlarge版本,而这两者模型,虽然都比BERT-large参数量少,但由于模型规模变大了,所以训练时间是变慢了,推断速度也变慢了!
所以ALBERT也不是如名字说的,属于轻量级模型,具体的要看你使用的是哪个版本
与相应的BERT模型相比,ALBERT模型具有更小的参数尺寸
ALBERT-large比BERT-large少了大约18倍的参数,18M比334M。
H = 2048的ALBERT-xlarge配置只有60M个参数,而H = 4096的ALBERT-xxlarge配置有233M个参数,即约占BERTlarge参数的70%。
对于ALBERT-xxlarge,主要报告12层网络上的结果,因为24层网络(具有相同的配置)获得类似的结果,但计算成本更高
模型架构
ALBERT架构的主干与BERT类似。
使用了具有GELU非线性的transformer encoder。
词汇表嵌入大小表示为 E,编码器层数表示为 L,隐藏大小表示为 H。
feed-forward/filter 大小设置为4H,将注意力头数量设置为 H/64。
优化策略
Factorized embedding parameterization
在BERT以及后续的建模改进如XLNet和RoBERTa 中,WordPiece嵌入大小 E 与隐藏层大小 H 绑定,即 E≡H。
无论从建模还是实际原因来看,这个决定都是次优的。
从建模的角度来看
WordPiece嵌入是为了学习与上下文无关的表示,而隐藏层嵌入是为了学习与上下文相关的表示。
类似bert的表示的成功来自于使用上下文来为学习这种依赖上下文的表示提供信号。
因此,从隐藏层大小 H 中解绑定 WordPiece 嵌入大小 E 允许根据建模需求更有效地使用总模型参数,这表明H >> E。
从实际的角度来看
自然语言处理通常要求词汇量 V 较大。如果 E≡H,那么增加 H 会增加嵌入矩阵的大小,其大小为V × E。这很容易导致一个具有数十亿个参数的模型,其中大多数参数只在训练过程中进行稀疏更新。
因此ALBERT使用嵌入参数的因式分解,将它们分解为两个更小的矩阵。
矩阵分解
不是直接将 one-hot 向量投影到大小为 H 的隐藏空间中,而是首先将它们投影到大小为 E 的低维嵌入空间中,然后将其投影到隐藏空间中。通过使用这种分解,将嵌入参数从 O(V × H) 减少到 O(V × E + E × H)。当 H >> E 时,这一参数减少是显著的。
选择对所有单词块使用相同的 E,因为与具有不同嵌入大小的全词嵌入相比,它们在文档中更均匀地分布对于不同的词语是重要的。
这是从输入的embedding维度去减少参数,BERT采用的是WordPiece,大概有30K个token,采用的embedding维度为768,所以参数量约为3000 * 768 = 2304000。
假如通过一个矩阵分解去代替本来的embedding矩阵,E取为128,则参数量变为3000 * 128+128 * 768=482304,参数量变为原来的20%
Cross-layer parameter sharing
跨层参数共享。
传统Transformer的每一层参数都是独立的,包括各层的self-attention、全连接。这样导致层数增加时,参数量也明显上升。
共享参数有多种方式,例如跨层只共享前馈网络(FFN)参数,或者只共享注意力参数。
ALBERT的默认决策是跨层共享所有参数,相当于只学习第一层的参数,并在剩下的所有层中重用该层的参数,而不是每个层都学习不同的参数。
同时这样对稳定网络参数有一定的作用。
跨层共享的机制非常简单,就是单独用一个Self-Attention层循环12次,每一层的参数都一样。这样子就用1层的参数量来表示12层的参数,为此,模型的参数当然大大降低了
作者提到给BERT的每一层参数做了分析,发现每一层的参数基本相似,因此直接共享了。
对L2距离和余弦相似度的测量表明,嵌入是振荡的,而不是收敛的。
其实看下表的实验结果,全共享(attention层和全连接层都共享)是比单纯共享attention层的效果要差的,但是全共享减少的参数实在太多了,所以作者采用的为全共享。
Inter-sentence coherence loss
在上面ALBERT中,去掉了NSP损失。
推测NSP无效的主要原因是它作为一项任务相比于MLM缺乏难度。
如公式所述,NSP将 topic prediction (主题预测)和 coherence prediction (一致性预测)合并在一个任务中。然而,与 coherence prediction 相比,topic prediction更容易学习,并且与使用MLM损失学习的内容有更多的重叠。
作者认为句子间建模是语言理解的一个重要方面,提出了主要基于一致性的损失。
也就是说,对于ALBERT,使用了 sentence-order prediction (SOP) 损失,它避免了 topic prediction ,而是专注于建模句间一致性。
SOP损失 从同一个文档中选取两个连续的句子作为一个正样本,交换这两个句子的顺序,作为一个负样本
在预训练时,让模型去预测句子对是正序还是逆序,从而消除topic prediction,让模型学习更难的coherence prediction。实验证明,SOP任务带来的提升比NSP任务要好。
n-gram MASK
预测n-gram片段,包含更完整的语义信息。每个片段的长度取值n(论文里取最大为3)。根据公式
取1-gram、2-gram、3-gram的概率分别为6/11,3/11,2/11。越长概率越小。
xxlarge版本和BERT-large版本的对比
由于模型的参数变少了,所以,可以训练规模更大的网络。
具体的,ALBERT-xxlarge版本也是12层,但是hidden_size为4096!
控制BERT-large和ALBERT-xxlarge的训练时间一样,可以看到ALBERT-xxlarge版本的训练速度时间只有BERT-large的1/3左右,慢了不少,这是模型规模变大的副作用。
但由于模型规模变大了,所以模型的表征能力变强了,效果也得到了一定的提升,大家常说刷榜的ALBERT,其实是xxlarge版本,普通的large版本性能是比BERT的large版本要差的。
增加额外数据和dropout的影响
实验表明,增加额外的数据是能提升模型效果的(除了在SQuAD数据集上,因为SQuAD的数据是采样于Wikipedia的,Wikipedia是BERT原生用于预训练的数据集,现在增加其它数据集,在Wikepedia数据集上的任务自然变差)。
除此之外,还首次提出,dropout会带来负向的效果,作者的解释是可能模型太大、模型很难收敛,还没达到需要减少过拟合的时候,作者说这个还有待研究。
实验结果
效果就是各种刷榜
ERNIE
论文:https://arxiv.org/pdf/1904.09223.pdf
github:https://github.com/PaddlePaddle/ LARK/tree/develop/ERNIE
github已经访问不了了。具体有待考究
基于知识增强的语言表示模型ERNIE。
受BERT masking 策略的启发,ERNIE旨在学习通过 knowledge masking策略增强的语言表示,包括 Entity-level masking和 phrase-level masking。
Entity-level masking 策略掩盖了通常由多个单词组成的实体。phrase-level masking 策略掩盖了整个短语,它是由几个单词作为一个概念单位站在一起组成的。
ERNIE1.0采用与BERT一样的Transformer encoder架构,与BERT不同在于预训练任务
原生BERT是采用随机 【MASK】,ERIENE1.0 论文里提到这会让模型不能充分学习到语义信息,降低学习难度。
具体的如上图,Harry Potter的Harry被【MASK】掉,这时候让模型去预测被【MASK】掉的token,这种情况下,模型很可能是根据Potter从而预测Harry(毕竟Harry Potter在语料中共同出现频率的比较高),在这种情况下,模型也许并不是根据Harry Potter和J.K.Rowling的关系来预测出Harry的,换个角度,这样BERT学到的是规则,而并非语义信息。
改进
Knowledge Integration
使用先验知识来增强预训练的语言模型。
提出了一种多阶段知识掩蔽策略,将短语和实体级知识集成到语言表示中,而不是直接添加知识嵌入。
具体的,把MASK分成三部分
- Basic-level Masking:与BERT一样;
- Entity-level Masking:把实体作为一个整体【MASK】,例如 J.K.Rowling这个词作为一个实体,被一起【MASK】;
- Phrase-Level Masking:把短语作为一个整体【MASK】,如 a series of 作为一个短语整体,被一起【MASK】。
Basic-Level Masking
第一个学习阶段是使用 Basic-level Masking,它把一个句子看成是一个基本语言单位的序列,对于英语来说,基本语言单位是词,对于汉语来说,基本语言单位是汉字。
在训练过程中,随机 mask 15%的基本语言单位,并使用句子中的其他基本单位作为输入,训练一个 transformer 来预测 mask 单位。
基于基本的掩码,可以得到一个基本的单词表示。由于高级语义知识是在基本语义单元的随机 mask 上训练的,因此难以完全建模。
Phrase-Level Masking
第二阶段是 Phrase-Level Masking。短语是作为概念单位的一组单词或字符。
对于英语,使用词法分析和分块工具来获得句子中短语的边界,并使用一些依赖于语言的分割工具来获得其他语言(如中文)的单词/短语信息。
在短语级掩码阶段,也使用基本语言单位作为训练输入,不同于随机的基本单位掩码,这次随机选择句子中的几个短语,mask 并预测同一短语中的所有基本单位。在此阶段,短语信息被编码到词嵌入中。
Entity-Level Masking
第三个阶段是 Entity-Level Masking。名称实体包含人员、地点、组织、产品等,可以用适当的名称表示。它可以是抽象的,也可以是有形的。
实体通常包含句子中的重要信息。与 Phrase-Level Masking 阶段一样,首先分析一个句子中的命名实体,然后屏蔽和预测实体中的所有槽。经过三个阶段的学习,得到了语义信息丰富的词表示。
DLM
ERNIE在DLM(对话语言模型)任务上对查询-响应对话结构建模。
对话数据对于语义表示很重要,因为相同回复的对应查询语义通常相似
数据不是单轮问答的形式(即问题+答案),而是多轮问答的数据,即可以是QQR、QRQ等等。同上面一样,也是把里面的单个token、实体、短语【MASK】掉,然后预测它们,另外在生成预训练数据的时候,有一定几率用另外的句子替代里面的问题和答案,所以模型还要预测是否是真实的问答对。论文提到DLM任务能让 ERNIE 学习到对话中的隐含关系,增加模型的语义表达能力。
注意看Segment Embedding被Dialogue Embedding代替了,但其它结构跟MLM模型是一样的,所以DLM任务可以和MLM任务联合训练,即Dialogue Embedding只会跟随DLM任务更新,Segment Embedding指挥跟随MLM任务跟新,而模型其它参数是随着DLM任务和MLM任务一起更新。
data
ERNIE采用异构语料库进行预训练。
绘制了中文维基百科、百度百科、百度新闻和百度贴吧的混合语料库。句子数分别为21M、51M、47M、54M
result
ERNIE 2.0
论文地址:https://ojs.aaai.org//index.php/AAAI/article/view/6428
github:https://github.com/PaddlePaddle/ERNIE
ERNIE2.0 的结构与 ERNIE1.0 、BERT 一样,ERNIE2.0 主要是从修改预训练任务来提升效果。
ERNIE 2.0的连续预训练框架目的是从训练语料库中提取词汇、句法和语义信息,该框架增量地构建预训练任务,然后通过持续的多任务学习在这些构建的任务上学习预训练模型
从BERT推出,到现在被广泛使用也有近三年的时间,这几年也有不少其它预训练模型的出现,它们大部分干的一件事就是提出难度更大、更多样化的预训练任务,从而增加模型的学习难度,让模型有更好的词语、语法、语义的表征能力!ERNIE2.0 正是如此,构建了三种类型的无监督任务。为了完成多任务的训练,又提出了连续多任务学习。
ERNIE2.0 不断引入大量的预训练任务,帮助模型高效地学习词汇、句法和语义表征,而不是用少量的预训练目标进行训练。
在调优期间,ERNIE模型首先使用预训练的参数初始化,然后使用来自特定任务的数据进行调优。
Continual Pre-training
首先,利用大数据和先验知识,不断构建无监督预训练任务。其次,通过持续的多任务学习对ERNIE模型进行增量更新。
Pre-training Tasks Construction
每次都可以构建不同类型的任务,包括单词感知任务、结构感知任务和语义感知任务。所有这些预训练任务都依赖于自监督或弱监督信号,这些信号可以从大量数据中获得,而无需人工注释。使用命名实体、短语和语篇关系等先验知识从大规模数据中生成标签.
Continual Multi-task Learning
ERNIE 2.0框架旨在从许多不同的任务中学习词汇、语法和语义信息。
目前比较火的联合训练策略:
- 策略一:Multi-task Learning,就是让模型同时学这3个任务,具体的让这3个任务的损失函数权重双加,然后一起反向传播更新参数;
- 策略二:Continual Learning,先训练任务1,再训练任务2,再训练任务3,这种策略的缺点是容易遗忘前面任务的训练结果,最后训练出的模型容易对最后一个任务过拟合;
- 策略三:Sequential Multi-taskLearning,连续多任务学习,即第一轮的时候,先训练任务1,但不完全让它收敛训练完,第二轮,一起训练任务1和任务2,同样不让模型收敛完,第三轮,一起训练三个任务,直到模型收敛完。
论文采用策略三:
每当有新的任务出现时,首先使用之前学习的参数对模型进行初始化,然后将新引入的任务与原始任务同时进行训练。这将确保学习的参数对之前学习的知识进行编码。
通过为每个任务分配 N 次训练迭代来解决这个问题。框架需要自动将每个任务的 N 次迭代分配到不同的训练阶段。这样,可以保证方法的效率,而不忘记之前训练过的知识
在每个阶段的连续多任务学习的架构包含一系列共享的文本编码层来编码上下文信息,可以通过使用循环神经网络或由堆叠的自我注意层组成的深度Transformer来定制上下文信息
一个是句子级损失,另一个是 token 级损失,这与BERT的损失函数类似。每个预训练任务都有自己的损失函数。在预训练过程中,可以将一个句子级损失函数与多个token级损失函数相结合,从而不断更新模型。
More unsupervised pre-training missions
模型的结构如下图所示,由于是多任务学习,模型输入的时候额外多了一个Task embedding
Word-aware Pre-training Tasks
- Knowledge Masking Task:这任务同ERNIE 1.0一样,把一些字、短语、实体【MASK】掉,预测【MASK】词语;
- Capitalization Prediction Task:预测单词是大写还是小写;
- Token-Document Relation Prediction Task:预测在段落A中出现的token,是否在文档的段落B中出现。
Structure-aware Pre-training Tasks
- Sentence Reordering Task:把文档中的句子打乱,预测正确顺序;
- Sentence Distance Task:分类句子间的距离(0:相连的句子,1:同一文档中不相连的句子,2:两篇文档间的句子)。
Semantic-aware Pre-training Tasks
- Discourse Relation Task:计算两句间的语义和修辞关系;
- IR Relevance Task:短文本信息检索关系,搜索数据(0:搜索并点击,1:搜素并展现,2:无关)。
data
数据集包括百科、书籍、新闻、对话、检索数据、修辞关系数据。可以看到相对于ERNIE1.0,所用的数据更多样化了。注意的是,并非每类型数据都应用到所有任务,如百科数据,就不用于训练语句级别的任务。
数据集的大小如下图所示
result
训练完后,在9个中文下游任务上分别进行fine-tunning,结果比 BERT 和 ERNIE1.0 要好
连续多任务学习的效果
上表展示的就是连续多任务学习,看 continual Multi-task Learing 那一行所示,对于具体的某个任务,不是把它放在一个stage里面就让模型学习收敛完,而是一个连续学习的过程,避免模型遗忘。可以看到,连续多任务学习相比 Continual Learing 和 Multi-task Learning 的效果都要好。
ELECTRA
论文地址:https://arxiv.org/pdf/2003.10555.pdf
github:https://github.com/google-research/electra
ELECTRA是这几年一个比较创新的模型,从模型架构和预训练任务都和BERT有一定程度的不同。
在论文的开始,指出了BERT训练的一个缺点,就是学习效率太慢,因为模型从一个样本中只能学习到15%的token信息,所以作者提出了一种新的架构让模型能学习到所有输入token的信息,这样模型学习效率会更好。作者实验证明,用相同的数据,ELECTRA达到和BERT、RoBERTa、XLNET相同效果时,所需要的训练轮数更少,假如相同的训练轮数,ELECTRA将超越上面所说的模型。
但看哈工大科大讯飞发布的中文ELECTRA模型来看,发现并没有比BERT等要好,甚至在一些中文任务上表现反而要差了,对于这个模型,相信大家目前还是有很多争议的。
Generator-Discriminator架构
ELECTRA的结构很简单,由一个Generator生成器和一个DIscriminator判别器组成
- 首先对一句话里面的token进行随机的【MASK】,然后训练一个生成器,对【MASK】掉的token进行预测(就是原生BERT的MLM任务),通常生成器不需要很大(原因在后面的实验部分有论证),生成器对【MASK】掉的token预测完后,得到一句新的话;
- 然后输入判别器,判别器判断每个token,是否是原样本的,还是被替换过的。注意的是,假如生成器预测出的token为原来的token,那这个token在判别器的输出标签里还是算原样本,而不是被替换过的(如上图的"the",生成器预测为"the",则"the"在判别器中的真实标签就为original,而不是replaced)
生成器
鉴别器
目标函数
虽然与GAN的训练目标相似,但有几个关键的区别。首先,如果生成器碰巧生成了正确的令牌,则该令牌被认为是“真实的”而不是“虚假的”
这个公式可以适度地提高下游任务的结果。更重要的是,生成器以最大似然的方式训练,而不是以对抗的方式训练来欺骗鉴别器。
对抗性训练生成器是具有挑战性的,因为不可能通过从生成器采样进行反向传播。
尽管尝试通过使用强化学习来训练生成器来规避这个问题,但这比最大似然训练表现得更差。
最后,不像GAN那样为生成器提供噪声矢量作为输入。
不通过生成器反向传播鉴别器损失(实际上,由于采样步骤,不能这样做)
在预训练之后,我们丢弃生成器并对下游任务的鉴别器进行微调
实验
权重共享
假如生成器和判别器采用同样架构的话,则两个模型可以权重共享,假如不是同样架构的话,也可以共享embedding层。所以作者分别对以下三种情况做了实验:
- 生成器和判别器的参数独立,完全不共享;
- 生成器和判别器的embedding参数共享,而且生成器 input层 和 output层
的embedding参数共享(想想为什么可以这样?因为生成器最后是一个全词表的分类,所以分类层跟输入时embedding矩阵的维度一致,而判别器最后是一个二分类,所以分类层跟embedding矩阵维度不一致),其他参数不共享; - 生成器和判别器的参数共享。
第一种方案GLUE score为83.6
第二种方案GLUE score为84.3
第三种方案GLUE score为84.4
从结果上,首先肯定的是共享参数能带来效果的提升,作者给出的理由是,假如不共享参数,判别器只会对输入token的embedding进行更新,而生成器则会对全词表进行权重更新(生成器最后可是做了一个全词表的分类),所以共享参数肯定是必要的
至于为什么作者最后采用方案二是不是方案三呢,是因为假如采用方案三的话,限定了生成器和判别器的模型结构要一样,极大影响了训练的效率。
更小的生成器
如下图所示,作者发现最佳的生成器大小为判别器规模的1/4~1/2,作者给出的理由是假如生成器太强大的话,会让判别器难以学习。
训练策略
作者提出了三种训练策略,结果如下图所示:
- 生成器和判别器联合训练;
- 二步训练,先训练生成器,再训练判别器;
- 引入对抗训练。
策略一和策略二
作者发现,假如不采用权重共享的话,二步训练法训练完的判别器可能什么都学不到,作者提出的理由是判别器的学习晚生成器太多。除此之外,假如是参数共享,且采用二步法,在生成器刚学完,切换到判别器开始学的时候,GLUE score有一个显著的提升,理由可能是由于参数共享,所以判别器并不是从一个小白开始训练起。
实验发现联合训练在GLUE上的指标是最好的,所以最后也是采用联合训练方法。
模型效果对比
实验效果自然是又快又好咯。具体的就是,达到相同的效果,ELECTRA所需要的训练时间更少。训练相同的时间,ELECTRA将超越RoBERTa和XLNET等的效果。
学习效率分析
上面的实验证明了ELECTRA确实训练更加的高效,但究竟这是什么带来的?
虽然说BERT每次只需要预测15%的token,但无论如何,模型输入的同样是所有的input token啊。为此,作者进行了以下的实验,目的是严谨地证明判别器对每个token的二分类任务能极大的提高训练效率
- ELECTRA 15%:判别器不对每一个token计算二分类损失,而是只对在生成器输入时,被【MASK】掉的15%的token求损失;
- Replace MLM:训练BERT MLM,其中input里的【MASK】使用ELECTRA生成器生成的token进行替换,目的是探讨只有预训练才出现【MASK】对模型的影响(因为大家吐槽BERT最多的就是,预训练里引入【MASK】,但在下游任务中输入没有【MASK】,这种预训练和fine
tuning的不一致会影响模型效果); - All-Tokens MLM:同Replace MLM一样,用生成器生成的token来替换【MASK】,但BERT输出的时候,对每一个token进行预测,这个模型架构有点像是BERT和ELECTRA的结合。
实验结果如上表所示,首先比较 ELECTRA 和 ELECTRA 15%,可以得出对每一个token进行二分类预测是能带来更好的效果的。
对比Replace MLM 和 BERT,可以得出,BERT预训练时引入【MASK】是给模型带来一定影响的。
最后发现ALL-tokens MLM最接近ELECTRA的效果。
总结,ELECTRA效果之那么好,大部分归功于对所有的token进行学习,其次是由于缓解了预训练和fine tuning时输入不一致的问题。
除此之外,如上图所示,作者还做实验发现,模型的规模越小,ELECTRA比BERT的效果就更好。作者解释是模型规模越小,ELECTRA就学习得越充分,越快收敛,因为本质上,ELECTRA判别器的二分类任务比BERT的预测词任务要简单。