分享

Bert系列之模型演化

 520jefferson 2021-12-22

提纲

1.    Bert

2.    Roberta

3.    Albert

4.    Xlnet

5.    TinyBert

6.    ELECTRA

参考文献

预训练模型在自然语言处理领域风头正热,各种Bert的变体层出不穷,在各大评测任务上不断刷新记录,大有一统天下的趋势。于此相对,大家在学习自然语言处理的预训练模型时,会遇到各种各样的相关模型,Bert, Albert, Xlnet, Roberta等等,心中不免有很多困惑,Bert的相关变种为何如此之多,它们之间在模型结构或者训练方式上有什么区别,是出于什么目的都设计出来的的,彼此之间有什么优劣对比吗?为此,作者根据自己的理解对Bert的若干知名变体做下介绍。

图片

图1: Bert的若干变体

1. Bert

    Bert的全称是Bidirectional Encoder Representation from Transformers, 也就是双向的Transformer的Encoder, 并没有用到Transformer的Decoder结构(面试时经常会发现很多人都搞混Bert,GPT, Transformer结构上的联系跟区别)。

1.1 Bert的结构

    Bert的模型结构主要分为Embedding层,Encoder层跟Pooling层。其中Embedding层是将token转化为向量,这里的向量包括三个部分,Token Embeddings是词向量,表征token基本的语义信息。Segment Embeddings是分片向量,表征当前token处于哪个句子下。原生的Bert的预训练任务NSP,每次会同时将两个句子拼接到一起输入Bert,就可以通过Segment Embeddings来记录当前token属于第一个句子还是第二个句子,这里的Segment Embeddings也就只有两种取值。Position Embeddings是位置向量,表征当前token位于句子的哪个位置下。经常会听到Bert的长度限制是512其实就是因为预训练时的Position Embeddings的取值范围是1~512,长度超过512的token就没办法获取对应的位置向量了。

图片

图2: Bert的embedding层

    Encoder层是对句子的语义信息进行编码,这里是通过将同样结构的Transformer的encoder堆叠多次作为Encoder层(Bert base是12层,Bert large是24层)。Bert被称为双向的语言模型也就是因为这里编码过程里Transformer的self-attention,每个token都可以同时用到在它之前和在它之后的其余token的信息,所以称为双向的。

    Pooling本质上是一个全连接网络,接在Bert的Encoder层后面,输出对应的编码结果。

1.2 Bert的训练任务

    Bert有两个训练任务,一个是MLM(Masked Language Model), 以一定的概率随机将文本的每个token替换为[Mask],然后预测出[Mask]位置上原来的token。具体策略是以15%的概率随机选中文本某个token的位置,那么被选中的token有80%的概率被替换为[Mask],有10%的概率被替换为随机的其他token,有10%的概率保持原来的token,再用该位置最后的向量输出预测原来的token,计算其中的交叉熵损失。该策略能够使得Bert可以抽取到token的表征信息。另一个任务是NSP(Next Sentence Prediction),MLM主要是为了抽取token层次的信息,而NSP则是为了抽取句子层次的信息。NSP就是预测句子对中两个句子是否是前后连续的关系,具体做法是构建数据集是,50%的句子对前后是连续的,50%的句子是从不同文档中随机随机挑选的前后不连续的,将句子对拼在一起输入到Bert中,用[CLS]对应的输出做一个二分类预测,判断句子对是否前后连续。

1.3 Bert的问题

    a). 训练过程跟微调跟推理过程不匹配,预训练过程有大量的[Mask],但是微调和推理过程却没有该字符。

    b). 句子长度限制为512,超过该长度的文本没办法直接编码,只能截断。

    c). NSP任务过于简单,对Bert的效果没有提升。

2. Roberta

    从模型结构上,Roberta基本上没有太大创新,更多的是诠释了大力出奇迹的真理,它主要是在Bert的基础上做了以下几点调整。

    a). 训练时间更长,训练batch_size更大,训练数据更多。

    b). 将静态mask(static masking)换成动态mask(dynamic masking).

静态mask: Bert在处理训练数据时,会先处理好哪些位置要被mask,所以训练时同一句话被mask的位置跟方式都是一样的,无论训练过程有多少个epoch。动态mask: Roberta在训练时才进行实时mask,所以训练时同一句话都mask的位置跟方式都是随机的,存在多种可能,多少个epoch就对应多种可能的mask位置跟方式。

    相比静态mask的方式,动态mask可以让模型看到多种mask的可能性,从而提升模型效果。很多中文的Roberta模型也没有直接采用动态mask的方式,同时N个epoch的动态mask的方式也可以通过将一份数据复制N次再采取静态mask的手段实现。

    c). 移除了NSP任务,Roberta发现NSP对模型效果没有提升就移除了该任务,只保留MLM任务。

    d). 将character-level BPE切换为byte-level BPE, 进一步扩大了词表,缓解了OOV的问题。简单理解为word在Bert里是最小粒度的单位了,但是在Roberta里,word可以被分解为wo,rd#两个更小力度的单位。英文的Roberta模型会比Bert更大,很大部分就是因为这个原因导致词表更大了,所以embedding参数更多。但是对于中文而言,字已经是最小粒度了,所以中文Roberta也没有这个调整。

3. Albert

    Albert的问世并不是为了进一步在Bert的基础上去提升效果,它考虑到更多的是由于预训练模型越来越大的参数量,对于算力的要求越来越高,训练时间越来越长,甚至有时参数量增大了但模型表现却没有提升等一系列问题。为此,Albert主要提出了两种减少参数量的方法去缓解内存消耗的问题。

    a). Factorized embedding parameterization,对于Bert,Roberta,Xlnet等模型,embedding size(词嵌入层的维度) E跟hidden layer size(隐藏层的维度) H都是一致的,即E=H。但从模型的角度看,embedding的设计是去学习跟上下文无关的表示,而hidden layer要去学习的是跟上下文相关的表示,显然会更加复杂,需要更多的参数,所以理论上应该是H>>E。但是通常模型的词表V是比较庞大的,那么在H=E的情况下直接增大H,会导致embedding的参数O(V*H)变得更加庞大,这显然是不可以被接受的。为此Albert对embedding的参数做了分解,对于一个token,现将它通过矩阵映射到一个低纬度E的空间,然后再映射到一个更高维度的隐藏层空间H,对应embedding的参数也就只有O(V*E+E*H)。在H>>E的情况下O(V*H)>> O(V*E+E*H).

    b). Cross-layer parameter sharing(跨层参数共享),我们知道Bert的编码层是有若干层结构相同的transformer的encoder结构堆叠得到的,Albert通过让其中的所有encoder层共享参数来减少模型参数量,Albert尝试了全部共享,只共享attention层,只共享前向网络层等方式,效果相对于不共享的方式会有下降但不明显。相对于参数量的急剧较少,些微的效果下滑也是可以理解的。(这里有一点需要提醒,跨层参数共享减少的是模型的内存,但是模型推理时间并没有减少,对于工业应用来说,推理时间才是更为致命的点。)

    Albert除了在减少参数上做了两点调整外,还对Bert的NSP任务做了调整,它认为NSP任务之所以没提升模型效果是由于训练数据构造的问题,之前NSP的负例都是随机选择的,所以同个负例下两个句子基本都是不同话题的,这导致模型更多的是通过话题去判别两个句子之间关系,这会导致NSP这个任务变得简单,对模型效果没有提升。为此,Albert对NSP的负例构造做了调整,负例的两个句子会从同一个文档抽取两个连续的句子并交换顺序得到,以此保证负例中话题的一致,模型更多关注的句子之间的连续性。

4. Xlnet

    众所周知,语言模型都两种类型,一种是自回归语言模型(AR),利用上文或者下文预测下一个token的模型,比如GPT,ELMO等,一种是自编码语言模型(AE),从损坏的输入中预测token进行重建的模型,比如Bert,Roberta等。AR模型优点是擅长生成类任务,但他的缺点是只能是单向生成的,这就意味着不能同时利用到上文或者下文的信息。AE模型的优点是可以同时利用到上下文,但是它的缺点就是训练跟推理过程的不匹配。Xlnet的提出就是为了集合AR模型跟AE模型的优势,但是Xlnet本质上是一个AR模型,它通过将句子顺序打乱可以看到上下文的信息,关于怎么用简明的语言表述这个过程,我确实有点力不从心,有兴趣的朋友可以自行了解下。

此外,Xlnet使用了transformer_XL的架构,使用相对位置编码代替了绝对位置编码,所以Xlnet解决了Bert的输出长度限制问题,能接受的输出长度不受限制。

5. TinyBert

    TinyBert的想法主要是想利用知识蒸馏的方式,让TinyBert去学习到Bert的知识跟能力,在保证模型效果的基础上去实现预训练模型的推理加速和减少模型规模。整个TinyBert的蒸馏过程分为两个环节,第一阶段是通用蒸馏,teacher model是预训练好的Bert, 可以帮助TinyBert学习到丰富的知识,具备强大的通用能力,第二阶段是特定任务蒸馏,teacher moder是经过finetune的Bert, 使得TinyBert学习到特定任务下的知识。两个蒸馏环节的设计,能保证TinyBert强大的通用能力跟特定任务下的提升。

    在每个蒸馏环节下,模型蒸馏主要分为三个部分,Embedding-layer Distillation,Transformer-layer Distillation, Prediction-layer Distillation。Embedding-layer Distillation是词嵌入层的蒸馏,使得TinyBert更小维度的embedding输出结果尽可能的接近Bert的embedding输出结果。Transformer-layer Distillation是其中transformer层的蒸馏,这里的蒸馏采用的是隔k层蒸馏的方式。也就是,假如teacher model的Bert的transformer有12层,如果TinyBert的transformer设计有4层,那么就是就是每隔3层蒸馏,TinyBert的第1,2,3,4层transformer分别学习的是Bert的第3,6,9,12层transformer层的输出。Prediction-layer Distillation主要是对齐TinyBert跟Bert在预测层的输出,这里学习的是预测层的logit,也就是概率值。前面两部分的损失都是MSE计算,最后一部分的损失是通过交叉熵损失计算的。通过这三部分的学习,能保证TinyBert在中间层跟最后预测层都学习到Bert相应的结果,进而保证准确率。

    (还有另外一种做比较类似的方法distillBert,有兴趣的朋友可以自行学习下)。

6. ELECTRA

    前面几种变体虽然能得到很不错的模型效果,但是都需要大量的语料训练作为支撑。为此,ELECTRA作为一种更加高效的预训练方法被提出。不同与之前的预训练模型只对mask的位置进行预测,ELECTRA会对所有token进行预测,从而更加高效的更新模型参数。为了实现这个目的,ELECTRA引入了类似对抗网络(GAN)的生成器跟判别器的训练方式。

图片

图3: ELECTRA的训练方式

    ELECTRA的生成器跟判别器是两个不同的模型,但是共享token embedding。生成器可以是任何能够生成输出token概率分布的模型,生成器这里会充当一个MLM语言模型,建议参数量是判别器的1/4-1/2,原始文本进入生成器,会随机选择一部分token被替换为[Mask],然后用生成器预测对应[Mask]位置上的输出。所以生成器这里主要是去训练如何预测被mask掉的token的能力。ELECTRA的判别器是一个预训练模型,它会对生成器的所有token被进行判别,判别该token是生成器生成的(False),还是真实文本的(TRUE)。

与GAN不同的是,

    a).如果生成器生成的[Mask]位置上token是真实de的token,那么这个token在判别器应该被识别为TRUE。

    b).生成器这里的训练目标是最大似然,而不是能够欺骗判别器的样本伪造能力。生成器的训练目标是从损失的文本进行重建,而不是生成能够混淆判别器的伪造数据。

相比于Bert,ELECTRA有两个优势:

    a).解决了不匹配问题,ELECTRA的判别器输入已经没有[Mask]的token了。

    b).更加高效,区别于Bert只对被随机mask的位置进行预测,ELECTRA可以从所有token进行学习。

参考文献

1.(Bert, 2018) BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

https:///pdf/1810.04805.pdf

2.(Roberta, 2019) RoBERTa: A Robustly Optimized BERT Pretraining Approach

https:///abs/1907.11692v1

3.(Albert, 2019) ALBERT: A Lite BERT For Self-Supervised Learning Of Language Representations

https:///abs/1909.11942v6

4.(Xlnet, 2019) XLNet: Generalized Autoregressive Pretraining for Language Understanding

https:///pdf/1906.08237.pdf

5.(TinyBert, EMNLP2020) TinyBERT: Distilling BERT for Natural Language Understanding

https:///abs/1909.10351

6.(ELECTRA, ICLR2020) ELECTRA: PRE-TRAINING TEXT ENCODERS

AS DISCRIMINATORS RATHER THAN GENERATORS

https:///pdf?id=r1xMH1BtvB

AINLP
一个有趣有AI的自然语言处理公众号:关注AI、NLP、机器学习、推荐系统、计算广告等相关技术。公众号可直接对话双语聊天机器人,尝试自动对联、作诗机、藏头诗生成器,调戏夸夸机器人、彩虹屁生成器,使用中英翻译,查询相似词,测试NLP相关工具包。
340篇原创内容
公众号

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章