当前位置:   article > 正文

对各大预训练语言模型的简单总结和评述(BERT/RoBERTa/ALBERT/ELECTRA/ERNIE/structBERT/SpanBERT...)_electra、macbert

electra、macbert

前言

本文系对BERT及其各种优化的简单总结。如RoBERTa、ALBERT、ERNIE、SBERT、MacBERT等。
随积累,即时更新。

总结

BERT

初始预训练任务简介:

  • MLM,即完形填空。我们对一个sequence/句子中15%的token进行随机地mask,然后对这些被mask的token进行预测;
  • NSP。判断两句话是否有上下文的关系。两句话可能来自不同的文章。
  • 在组成预训练数据时,有10%的可能随机将最大长度512的样本限制为小于512长度(BERT是128),一方面降低预训练时长,另一方面缓解由于[MASK]出现而导致的预训练和finetune的mismatch问题;

RoBERTa

  1. 对MLM的mask方式改进:相对于BERT的静态mask,换成动态mask,即每次数据被feed进模型时,重新做一遍随机mask,此举相当于扩大了训练数据的量级;
  2. 扩大更大的batch_size,更多的数据量;
  3. 训练时取消BERT中10%短句的限定,全部采用512的长句预训练;
  4. 取消NSP任务,它对结果没提升。

目前而言,对中文预训练语言模型来说,哈工大的RoBERTa-wwm可能是大多数时间、针对大多数下游任务的最优选择,其精度可能是最好的。如果用一句话概括RoBERTa对BERT的提升,那么一定是“大力出奇迹”。。。

ALBERT

  1. n-gram mask,假设n=3,则在mask时,按照一定的概率,分别选择连续mask3个、2个和1个token,增加模型在预测[MASK] token时的难度;
  2. 隐藏层之间参数共享。假设是base版本的ALBERT,那么12层参数共享,大大降低了显存占用。此外要说的是,之前让我倍感困扰的一个问题——ALBERT的12层参数,如何在反向传播时仍然保持一致?因为如果按照BERT来考虑,每一层的参数的梯度必然不同,在经过梯度更新后,原本一致的参数也不一致了,这就违背了ALBERT的初衷。所以说,ALBERT实际上可以被看做只有1层参数,但这一层参数在反向传播时被更新了12次;
  3. 拆解了embedding层。原本embedding的规模为VH,而ALBERT将其拆分成两个更小的矩阵,设embedding_size = E, 则是VE + E*H。E=128,128的size足够编码大量的字符信息了;
  4. 将NSP任务改为SOP任务:原本BERT的NSP任务中的两个句子,是随机选取的、可能来自不同文章的。SOP则是将两个连续的句子随机调换位置,让模型去预测顺序是否有误。

ALBERT原意是“A Lite BERT”,即轻量级BERT。我们当然不能说ALBERT没能达到这一点,但我们也得承认,它达到这一点的手段嘛,显得有点“猥琐”(开玩笑啦,ALBERT还是一篇很出色的论文的,实验做的有条理且很细致,值得精读)。

那么ALBERT到底是怎么达到加速的呢?因为它层参数共享的性质,导致其少占了很多内存,因此在一次predict中,就可以放得下更多的样本,在这个平均时间上来说,当然是更快了。然而我们也看得到,ALBERT虽然是使用了参数共享,但仍旧和BERT有一样的12层Transformer,所以单条样本的推理时间是没什么差别的。这一点,略微与其“轻量”的初衷稍有背离。

此外,在笔者的实验中,同样规模(如base版)的预训练模型中,ALBERT的效果往往比RoBERTa和BERT略差。此外,我个人感觉,由于其层参数共享的机制,所以使得其能学习到的知识,比BERT这种不共享层参数的模型更单一,有点类似老哥们吵架喜欢骂的那句“你二极管脑”,有点点这个意思,所以ALBERT的上限,可能确实没BERT/RoBERTa高,但我们从论文也看得出来,ALBERT想要达到与BERT相似的效果,所需时间是更短的。

ERNIE1.0

  1. knowledge unit mask。ERNIE1.0设计了三个维度的knowledge unit进行mask,分别是token层面、word层面和实体层面。这一点有点类似Google对BERT的改进——whole-word-mask思想了;
  2. DLM。D指的是Dialog,DLM实际上就是MLM的部分升级版,由于DLM用的是论坛对话数据,是query-response形式的数据,所以天生有更强的上下文关联,更利于语义信息的学习。

ERNIE2.0

  1. 多个level的多种预训练任务,可以提供预训练任务设计的思路:
    • 词层面:
      • Knowledge Masking:传统MLM + 短语mask & 实体mask;
      • Token-Document Relation:预测出现在当前segment中的某token,是否会出现在其他segment中。此任务意在判断当前token是否是该segment的关键词,因为关键词会较少多次地出现;
      • Capital Prediction:预测一个word的首字母是否大写,显然,这是个英文only的任务。
    • 篇章结构(句)层面:
      • Sentences Reordering:将一个样本中的k个句子打乱顺序,按照全排列公式,它共有N = A(k, k)种可能的顺序(假设k=3,则共有N=6种顺序),所以相当于一个N分类的问题;
      • Sentences Distance:相当于ALBERT-SOP任务的强化版本,是一个3分类任务。label-0意味着两个句子相邻、label-1意味着两个句子来自同一个segment但非相邻、label-2意味着两个句子不来自同一个segment。
    • 语义层面:
      • Discourse Relation:语篇关系任务:预测两个句子之间语义或修辞学上是否有关;
      • IR Relevance:从题目即可看出,这是个和IR有关的任务。该任务对query和待选文本的title的相关性进行预测,该title就是候选document的title,所以是短文本匹配的3分类任务。该数据发挥了百度搜索的优势,即来自百度搜索。label-0意味着,用户输入query,搜索到待选答案后并进行点击的样本,是强相关;label-1意味着用户query搜到的,但没有被用户点击的样本,是若相关;label-2是不相关样本,随机选取。
  2. 提出了个持续学习框架,可实践性不佳。

Chinese-wwm-BERT

这可能不能完全被算作一个模型,它只是将whole word mask在中文BERT预训练上加以实践。论文以LTP为工具,对语料进行中文分词,然后对整个词进行mask。

structBERT

本论文的核心思想就是“引入乱序”。因为你随意打乱几个有限的字的顺序,你往往仍然可以明确地知道这句话的意思,但客观上说这的确增加了我们在理解时候的难度。该模型也介于此,构造了两种和乱序有关的新任务,借此加大模型学习任务的难度:

  1. word structural objective:在句子中引入词乱序,原文设置K=3,即最大的乱序范围是3,一个字被打乱顺序后,最远被shuffle到小于3这个范围内的位置。此外,该乱序执行与非mask的tokens上,然后要模型对连续shuffle的3个token预测出其原本的顺序;
  2. Sentence Structural Objective:这就相当于一个更难的SOP任务,和ERNIE2.0的Sentences Distance任务极像。对于两句话(S1, S2),同样是3分类问题,label-0代表S1在S2之前,label-1代表S2在S1之前,label-2代表二者不选自于一个document

我个人还是觉得structBERT提出的词乱序思路很不错的,因为它的“乱序不改其义”的思想是很普遍的,而且引入乱序的操作非常简单,shuffle一下,然后记着shuffle前的原始顺序就ok了,所以这个操作基本在我各种预训练的时候必加,而且确实有一定的提升。
此外,在对于某些多模态模型的预训练任务中,如微软所提的LayoutLM,就可以在原token序列上加乱序,然后令模型去结合另一种模态信息找到原本的顺序,这也是一种模态对齐的任务,这对于多模态之间可能存在的gap还是颇有帮助的。

ELECTRA

ELECTRA采取了和BERT截然不同的架构。它使用了生成器G和判别器D两个模型(BERT),使用小生成器G-BERT,对随机15%mask的mask-token进行预测;然后再使用大判别器D-BERT,对所有的词是否和原token一致,进行二分类的判断。训练完毕后,我们使用D-BERT作为最终的预训练语言模型。

ELECTRA的论文优点有以下几个:

  1. 相较于BERT的随机15%token的mask后预测任务,ELECTRA的任务难度更难。其G-BERT的存在,就是要用它不怎么灵光(规模小,即hidden_size小)的脑袋瓜,给更灵光(规模更大)的D-BERT筛选难题,把那些被mask掉的更有难度的token,给预测成错得很真实的token,如“我吃苹果”->“我吃苹果”。而任务难度的提升,更好地锻炼了D-BERT,使得ELECTRA比BERT更有提升;
  2. BERT在对mask token做预测时,是无法利用到[MASK]的token的语义信息的,因为我们认为该token的信息被全部编码在上下文里了。ELECTRA则显然可以用到被预测的这个token的语义信息——当然,它不一定对,但一般来说,会不像[MASK]错的这么离谱;
  3. 从BERT-MLM的V分类变为ELECTRA-D-BERT的二分类,算法复杂度下降,模型学的更快了,所以论文中试验显示,达到相同的成绩,ELECTRA所耗算力比BERT更少。

缺点:

  1. D-BERT的二分类的预训练任务,致使其final hidden-layer对token/word/sentence的表征能力不足。所以当ELECTRA面对复杂的下游任务,如QA、序列标注时,可能效果不佳。

更详细的解读,请见我的另一篇博客:ELECTRA论文阅读笔记

SpanBERT

  • SBO(Span Boundary Objective):
    • 对于被mask的span(这个span可以随机选取,也可以是一个word、一个实体),我们获取该span前一个以及后一个位置的token s和e,然后再结合该span的各个token的index,对每个被mask的token进行预测。举个例子,“我们/热爱/北京/天安门/。/”, 假设被mask的是“北京”这个span,那么s = “爱”,e = “天”,pos_0 = 4, pos_1 = 5.

SpanBERT的意义一望便知——它对于Span抽取类任务有着较大的效果提升,如抽取式QA,以及用MRC方式解决的NER问题。若提前知道下游任务是span相关类任务,该预训练task不妨一试。

MacBERT

该名字Mac的由来并非MacBook,也不是说这个BERT是用Mac训练的。它是“MLM as correction”的缩写。具体含义就是,对于原BERT而言,mask token的处理方式,是80%保留[MASK]样式,10%不变,10%从词表随机采样。而MacBERT,是使用了synonym同义词工具,对于被mask的word进行同义词的替换——当然了,替换就得找字数相同的,如若“天安门”被mask,则可以替换为“卢浮宫”而不是“红场”。这样一来,使用同义词替换被mask的词,一方面减少了句中[MASK] token老生常谈会带来的mis-match问题,还可以提升句意的完整性。

SBERT(Sentence BERT)

与上面其他的对BERT的精度优化的模型不同,SBERT是对BERT的工程化实践,是对BERT生成句向量表征的加速。其实思路非常非常朴素,就类似经典的DSSM双塔模型,搞两个BERT,线下提前算完存好建立向量索引库,线上即时计算得到vector后,再去进行向量检索或作为他用。
和SBERT有个思路相似的方法,叫poly-encoders。该方法相较于SBERT,增加了更多的动态性。具体做法是,线上来的query,使用encoder得到m种不同的向量化表示vec_q,然后对线下计算好的vec_cand和当前的m个vec_q分别计算Attention score,然后根据该得分对这m个vec_q进行求和,得到最终的在线query表示。后序做法则取决于目的了。

Don’t stop pretraining

本论文是对当前预训练语言模型的使用范式作出了一个总结。该论文思路清晰地将预训练语言模型的使用分成了4个阶段,分别是:

  1. pretraining from scratch
  2. DAPT – Domain Adaptive PreTraining
  3. TAPT – Task Adaptive PreTraining
  4. Fine-tune

以上四个步骤,第一个已经被BERT/RoBERTa做完了;第二个,则是拿到我们手头的领域内语料进行预训练;第三个,则是拿我们即将要进行的下游任务的有标注数据,来进行无监督地预训练。据论文介绍,TAPT效果十分显著,是一定要做的,且由于下游任务数据一般不多,所以对计算资源的要求并不大,所以从客观来说也是可行的;第四个,则是大家熟知的fine-tune步骤了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/587444
推荐阅读
相关标签
  

闽ICP备14008679号