赞
踩
本文系对BERT及其各种优化的简单总结。如RoBERTa、ALBERT、ERNIE、SBERT、MacBERT等。
随积累,即时更新。
初始预训练任务简介:
目前而言,对中文预训练语言模型来说,哈工大的RoBERTa-wwm可能是大多数时间、针对大多数下游任务的最优选择,其精度可能是最好的。如果用一句话概括RoBERTa对BERT的提升,那么一定是“大力出奇迹”。。。
ALBERT原意是“A Lite BERT”,即轻量级BERT。我们当然不能说ALBERT没能达到这一点,但我们也得承认,它达到这一点的手段嘛,显得有点“猥琐”(开玩笑啦,ALBERT还是一篇很出色的论文的,实验做的有条理且很细致,值得精读)。
那么ALBERT到底是怎么达到加速的呢?因为它层参数共享的性质,导致其少占了很多内存,因此在一次predict中,就可以放得下更多的样本,在这个平均时间上来说,当然是更快了。然而我们也看得到,ALBERT虽然是使用了参数共享,但仍旧和BERT有一样的12层Transformer,所以单条样本的推理时间是没什么差别的。这一点,略微与其“轻量”的初衷稍有背离。
此外,在笔者的实验中,同样规模(如base版)的预训练模型中,ALBERT的效果往往比RoBERTa和BERT略差。此外,我个人感觉,由于其层参数共享的机制,所以使得其能学习到的知识,比BERT这种不共享层参数的模型更单一,有点类似老哥们吵架喜欢骂的那句“你二极管脑”,有点点这个意思,所以ALBERT的上限,可能确实没BERT/RoBERTa高,但我们从论文也看得出来,ALBERT想要达到与BERT相似的效果,所需时间是更短的。
这可能不能完全被算作一个模型,它只是将whole word mask在中文BERT预训练上加以实践。论文以LTP为工具,对语料进行中文分词,然后对整个词进行mask。
本论文的核心思想就是“引入乱序”。因为你随意打乱几个有限的字的顺序,你往往仍然可以明确地知道这句话的意思,但客观上说这的确增加了我们在理解时候的难度。该模型也介于此,构造了两种和乱序有关的新任务,借此加大模型学习任务的难度:
我个人还是觉得structBERT提出的词乱序思路很不错的,因为它的“乱序不改其义”的思想是很普遍的,而且引入乱序的操作非常简单,shuffle一下,然后记着shuffle前的原始顺序就ok了,所以这个操作基本在我各种预训练的时候必加,而且确实有一定的提升。
此外,在对于某些多模态模型的预训练任务中,如微软所提的LayoutLM,就可以在原token序列上加乱序,然后令模型去结合另一种模态信息找到原本的顺序,这也是一种模态对齐的任务,这对于多模态之间可能存在的gap还是颇有帮助的。
ELECTRA采取了和BERT截然不同的架构。它使用了生成器G和判别器D两个模型(BERT),使用小生成器G-BERT,对随机15%mask的mask-token进行预测;然后再使用大判别器D-BERT,对所有的词是否和原token一致,进行二分类的判断。训练完毕后,我们使用D-BERT作为最终的预训练语言模型。
ELECTRA的论文优点有以下几个:
缺点:
更详细的解读,请见我的另一篇博客:ELECTRA论文阅读笔记
SpanBERT的意义一望便知——它对于Span抽取类任务有着较大的效果提升,如抽取式QA,以及用MRC方式解决的NER问题。若提前知道下游任务是span相关类任务,该预训练task不妨一试。
该名字Mac的由来并非MacBook,也不是说这个BERT是用Mac训练的。它是“MLM as correction”的缩写。具体含义就是,对于原BERT而言,mask token的处理方式,是80%保留[MASK]样式,10%不变,10%从词表随机采样。而MacBERT,是使用了synonym同义词工具,对于被mask的word进行同义词的替换——当然了,替换就得找字数相同的,如若“天安门”被mask,则可以替换为“卢浮宫”而不是“红场”。这样一来,使用同义词替换被mask的词,一方面减少了句中[MASK] token老生常谈会带来的mis-match问题,还可以提升句意的完整性。
与上面其他的对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表示。后序做法则取决于目的了。
本论文是对当前预训练语言模型的使用范式作出了一个总结。该论文思路清晰地将预训练语言模型的使用分成了4个阶段,分别是:
以上四个步骤,第一个已经被BERT/RoBERTa做完了;第二个,则是拿到我们手头的领域内语料进行预训练;第三个,则是拿我们即将要进行的下游任务的有标注数据,来进行无监督地预训练。据论文介绍,TAPT效果十分显著,是一定要做的,且由于下游任务数据一般不多,所以对计算资源的要求并不大,所以从客观来说也是可行的;第四个,则是大家熟知的fine-tune步骤了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。