天天看点

BERT, RoBERTa, DistilBERT, XLNet,Albert

BERT

BERT 是一个双向Transformer,用于对大量未标记的文本数据进行预训练,以学习可用于微调特定机器学习任务的语言表示。尽管BERT在一些艰巨的任务上胜过一些NLP的最新技术,但其性能的提高主要归因于:双向的Transformer,基于大量训练数据的新颖的Masked Language Model和Next Structure Prediction预训练任务。当然同样重要的是谷歌强大的算力加持。

扩展Bert-wwm & Bert-wwm-ext

XLNet

XLNet是一个通过排列语言模型实现双向上下文信息的自回归模型。它通过随机排列输入序列而预测某个位置可能出现的词,进而训练出具有上下文的语境化词向量。

XLNet是采用通用得自回归预训练方法(AR模型),而基于DAE(去噪自编码器)得Bert模型采用得是降噪得自动编码方法(AE模型),bert和AR模型的区别主要是:

  1. 独立性假设

    bert中一个序列中会被mask掉不超过15%的单词,但是在预训练时的目标函数是基于mask值彼此独立、互不干扰的假设下进行计算的,而AR模型中不需要设置mask值,预训练时的目标函数也不必设立独立假设。同时,mask的设置会导致预训练-微调的数据上的不统一,这也是Bert的一个缺陷。

  2. 输入噪声

    Bert在预训练时对输入序列进行随机mask,这是一种输入噪声设定,但是在下游任务进行微调时却并没有对输入序列设置输入噪声,即随机mask,这引起了预训练-微调间的差异。与之相反,AR模型不设置输入噪声,因而不会有这种问题。

  3. 上下文依赖

    AR模型只考虑前向信息或者后向信息,而bert要考虑双向信息,结果就是,bert的目标函数允许模型被训练为能够更好地抓取双向信息。

XLNet与Bert比较

Bert隐藏了15%的词,用85%去预测15%的词。缺少了15%的词中的关联性(从而忽略了被 mask 位置之间的依赖关系)。

XLNet是通过整个上下文去预测某个词,这样的词的利用率更高,理论上效果更好。

XLNet 的核心思想是 PLM,排列原来的句子,然后预测末尾的单词。这样可以学习到单词之间的依赖关系,而且可以利用 token 前后向的信息。

XLNet PLM 的实现需要用到 Two-Stream Self-Attention,包含两个 Stream,Query Stream 用于预测,只包含当前位置的位置信息。而 Content Stream 保存了 token 的内容。

XLNet 还使用了 Transformer-XL 的优化方式(段循环&相对位置编码)。

BERT, RoBERTa, DistilBERT, XLNet,Albert

详情参见:

https://cloud.tencent.com/developer/article/1449495

https://www.pianshen.com/article/6717954811/

PLM:https://baijiahao.baidu.com/s?id=1654814515140351919&wfr=spider&for=pc

https://blog.csdn.net/u012526436/article/details/93196139

中文预训练模型下载

RoBERTa

RoBERTa在模型层面没有改变Google的Bert,改变的只是预训练的方法。这是对BERT的retraining,增加了1000%的文本数据和相应的计算能力。为了改进训练过程,RoBERTa 从 BERT 的预训练中移除了下一句预测(Next Sentence Prediction,NSP)任务,并引入了Dynamic Masking(动态 Masking),以便masked token在训练期间发生变化。此外还发现在训练过程中使用更大的batch-training更有用。

更重要的是,RoBERTa使用160 GB的文本进行预训练,包括BERT中使用的16 GB的Books Corpus和English Wikipedia。 其他数据还包括Common Crawl News数据集(6300万篇文章,76 GB),Web文本语料库(38 GB)和Common Crawl的故事(31 GB)。加上一天的1024个Tesla 100 V GPU的出色表现,完成了对RoBERTa的预训练任务。

学习奥运精神,更高更快更强;最强预训练模型,(数据)更多(训练)更久(批次)更大

1. 静态Masking vs 动态Masking

原来Bert对每一个序列随机选择15%的Tokens替换成[MASK],为了消除与下游任务的不匹配,还对这15%的Tokens进行(1)80%的时间替换成[MASK];(2)10%的时间不变;(3)10%的时间替换成其他词。但整个训练过程,这15%的Tokens一旦被选择就不再改变,也就是说从一开始随机选择了这15%的Tokens,之后的N个epoch里都不再改变了。这就叫做静态Masking。

而RoBERTa一开始把预训练的数据复制10份,每一份都随机选择15%的Tokens进行Masking,也就是说,同样的一句话有10种不同的mask方式。然后每份数据都训练N/10个epoch。这就相当于在这N个epoch的训练中,每个序列的被mask的tokens是会变化的。这就叫做动态Masking。

那么这样改变是否真的有效果?作者在只将静态Masking改成动态Masking,其他参数不变的情况下做了实验,动态Masking确实能提高性能。

可以看出,修改版的静态mask与BERT原始静态mask效果相当;动态mask又与静态mask效果差不多,或者说略好于静态mask。

BERT, RoBERTa, DistilBERT, XLNet,Albert

2. with NSP vs without NSP

原本的Bert为了捕捉句子之间的关系,使用了NSP任务进行预训练,就是输入一对句子A和B,判断这两个句子是否是连续的。在训练的数据中,50%的B是A的下一个句子,50%的B是随机抽取的。

而RoBERTa去除了NSP,而是每次输入连续的多个句子,直到最大长度512(可以跨文章)。这种训练方式叫做(FULL - SENTENCES),而原来的Bert每次只输入两个句子。实验表明在MNLI这种推断句子关系的任务上RoBERTa也能有更好性能。

BERT, RoBERTa, DistilBERT, XLNet,Albert

3. 更大的mini-batch

原本的BERT-base 的batch size是256,训练1M个steps。RoBERTa的batch size为8k。为什么要用更大的batch size呢?(除了因为他们有钱玩得起外)作者借鉴了在机器翻译中,用更大的batch size配合更大学习率能提升模型优化速率和模型性能的现象,并且也用实验证明了确实Bert还能用更大的batch size。

BERT, RoBERTa, DistilBERT, XLNet,Albert

4. 更多的数据,更长时间的训练

借鉴XLNet用了比Bert多10倍的数据,RoBERTa也用了更多的数据。性能确实再次彪升。当然,也需要配合更长时间的训练。

BERT, RoBERTa, DistilBERT, XLNet,Albert

参考:

https://www.jianshu.com/p/eddf04ba8545

https://blog.csdn.net/ljp1919/article/details/100666563

中文预训练模型下载

wwm模型下载

DistilBERT是一种蒸馏(近似)版本的BERT。它保留了BERT大概97%的性能,但仅有一半的参数量。具体来说,它没有Token-type Embeddings和Pooler,仅保留了Google BERT的一半图层。DistilBERT使用了一种称为蒸馏的技术,它将Google的BERT近似为一个较小的神经网络。这个想法是,一旦训练了大型神经网络,就可以使用较小的网络来近似其完整的输出分布。这在某种意义上类似于后验近似。贝叶斯统计中用于后验逼近的关键优化函数之一是Kulback-Leiber散度,自然也被用于此。

Albert

ALBERT模型是BERT的改进版,与最近其他State of the art的模型不同的是,这次是预训练小模型,效果更好、参数更少。

它对BERT进行了三个改造 Three main changes of ALBert from Bert:

  1. 词嵌入向量参数的因式分解 Factorized embedding parameterization
O(V * H) to O(V * E + E * H)
 如以ALBert_xxlarge为例,V=30000, H=4096, E=128
 那么原先参数为V * H= 30000 * 4096 = 1.23亿个参数
 现在则为V * E + E * H = 30000*128+128*4096 = 384万 + 52万 = 436万,
 词嵌入相关的参数变化前是变换后的28倍。
           
  1. 跨层参数共享 Cross-Layer Parameter Sharing
参数共享能显著减少参数。共享可以分为全连接层、注意力层的参数共享;注意力层的参数对效果的减弱影响小一点。
           
  1. 段落连续性任务 Inter-sentence coherence loss.

    在ALBERT中,为了只保留一致性任务去除主题识别的影响,提出了一个新的任务 sentence-order prediction(SOP),SOP的正样本和NSP的获取方式是一样的,负样本把正样本的顺序反转即可。SOP因为实在同一个文档中选的,其只关注句子的顺序并没有主题方面的影响。并且SOP能解决NSP的任务,但是NSP并不能解决SOP的任务,该任务的添加给最终的结果提升了一个点。

4. 移除dropout

除了上面提到的三个主要优化点,ALBERT的作者还发现一个很有意思的点,ALBERT在训练了100w步之后,模型依旧没有过拟合,于是乎作者果断移除了dropout,没想到对下游任务的效果竟然有一定的提升。这也是业界第一次发现dropout对大规模的预训练模型会造成负面影响。

总结:

ALBERT实际上是通过参数共享的方式降低了内存,预测阶段还是需要和BERT一样的时间,如果采用了xxlarge版本的ALBERT,那实际上预测速度会更慢。

参考:

https://blog.csdn.net/u012526436/article/details/101924049

https://baijiahao.baidu.com/s?id=1654588517875312379&wfr=spider&for=pc

中文预训练模型下载

中文版下载地址

Base

https://storage.googleapis.com/albert_models/albert_base_zh.tar.gz

Large

https://storage.googleapis.com/albert_models/albert_large_zh.tar.gz

XLarge

https://storage.googleapis.com/albert_models/albert_xlarge_zh.tar.gz

Xxlarge

https://storage.googleapis.com/albert_models/albert_xxlarge_zh.tar.gz

ALBERT v2下载地址

Base

[Tar File]:

https://storage.googleapis.com/albert_models/albert_base_v2.tar.gz

[TF-Hub]:

https://tfhub.dev/google/albert_base/2

Large

[Tar File]:

https://storage.googleapis.com/albert_models/albert_large_v2.tar.gz

[TF-Hub]:

https://tfhub.dev/google/albert_large/2

XLarge

[Tar File]:

https://storage.googleapis.com/albert_models/albert_xlarge_v2.tar.gz

[TF-Hub]:

https://tfhub.dev/google/albert_xlarge/2

Xxlarge

[Tar File]:

https://storage.googleapis.com/albert_models/albert_xxlarge_v2.tar.gz

[TF-Hub]:

https://tfhub.dev/google/albert_xxlarge/2

继续阅读