系列文章,请多关注
NLP预训练模型1 – 综述
NLP预训练模型2 – BERT详解和源码分析
NLP预训练模型3 – 预训练任务优化(ERNIE、SpanBERT)
NLP预训练模型4 – 训练方法优化(RoBERTa、T5)
NLP预训练模型5 – 模型结构优化(XLNet、ALBERT、ELECTRA)
NLP预训练模型6 – 模型轻量化(ALBERT、Q8BERT、DistillBERT、TinyBERT等)
Transformer家族1 – Transformer详解和源码分析
上文 NLP预训练模型3 – 预训练任务优化(ERNIE、SpanBERT)我们从预训练任务的角度讲解了如何对BERT进行优化,本文我们从训练方法的角度来讲解BERT优化。
训练方法包括数据语料、文本预处理、超参调整等。
本文从数据语料和超参调整的角度,来讲解怎么通过训练方法优化来提升预训练模型performance。训练方法优化这个角度始终让人感觉不像模型结构优化、预训练任务优化那样fancy,比如RoBERTa就被ICLR拒稿了。但个人认为,在工业界应用中,还是效果为王。不管白猫黑猫,只要抓到耗子就是好猫嘛。况且Google、Facebook耗费大量人力物力,大力出奇迹搞出来的预训练模型,在工业界下游任务中确实很香。本文主要以RoBERta和T5两个模型为例,进行分析。
论文信息:2019年7月,Facebook & 华盛顿大学
论文地址 https://arxiv.org/abs/1907.11692
代码和模型地址 https://github.com/pytorch/fairseq
BERT在预处理阶段,对sequence进行了随机mask。训练时,同一个sequence中的mask,在不同的epochs中是不会改变的,也就是static masking静态掩码。这种固定mask的方式,不利于学习到更多不同信息。RoBERTa采用了动态掩码,dynamic Masking的方式,步骤为
通过这种类似于cross-validation的方式,使得每一份语料产生了不同的mask,从而可以学习到更多不同信息。总共训练40个epochs,10份语料的情况下,每份语料应用到4个epochs中。这种方式就叫dynamic masking。
动态掩码是否有效果呢,实验证明,还是能提高一点performance的。
如上所示,效果不算很明显,原因应该是BERT包含的数据本身就很大了,信息量已经很充足了,故dynamic masking带来的信息增益不是很明显。
在SpanBERT中,我们也提到过NSP反而会带来一定的副作用,主要原因为
RoBERTa对有没有NSP,以及如何构建sequence,也进行了充足的实验,如下
作者进行了四种不同的sequence构造方法,进行了对比实验,如下:
RoBERTa的各种实验,基本是给NSP判了死刑。后面越来越多文章,都要么舍弃了NSP,要么对其进行了改造。
RoBERTa对超参也进行了充分实验,增大batch size和训练迭代次数,有助于提升模型performance。在相同总训练step的情况下,batch size的增加可以提升模型效果。这也很容易理解,数据量大的情况下,适当增加batch size可以有助于模型跳出局部最优点,单次训练信息量更充足,视野更宽阔。甚至有人还在尝试32k的batch size,只能说有矿真好。
作者对总训练次数steps也做了分析,如下表,在相同data和batch size情况下,对比了总训练次数steps,分别在100k、300k、500k下的效果,最后还是steps=500k效果最好。毕竟训练充分,大力出奇迹嘛。但也要注意不要过拟合了。
原始BERT采用了BooksCorpus和English Wiki语料,总共16GB。XLNet认为是13G,主要差别在于二者English Wiki的预处理过滤方法不同,可以基本认为是一个意思。RoBERTa将原始语料增大到了160GB。主要包括
增大数据量带来的效果还是很明显的,上面那张表中对比了16GB和160GB语料下的模型效果。增大数据量能带来一定的模型效果提升。
原始BERT采用字符级别的BPE编码,英文vocab size为30k。容易出现UNK问题,影响模型效果。RoBERTa采用了Byte级别的BPE词汇表,vocab size为50k。vocab size的增加使得模型参数量有所增加,BERT-base增加了15M,BERT-large增加了20M。但也提升了一定的效果。
RoBERTa大力出奇迹,朴实无华的方法,带来了模型效果较大的提升,在GLUE上的表现远超BERT,如下表。
同时在SQuAD和RACE上效果也是比BERT,提升了很多。
RoBERTa虽然创新点不是很fancy,其大力出奇迹的方法也没法复现,但确实大大提升了下游任务的performance。也使得各种比赛中,RoBERTa的应用越来越广泛。
论文信息:2019年10月,谷歌
论文地址 https://arxiv.org/abs/1910.10683
代码和模型地址 https://github.com/google-research/text-to-text-transfer-transformer
T5创造性的将每个NLP任务,包括NLU和NLG,统一成了"text-to-text"的问题。如下图在机器翻译、文本分类、文本相似度、文本摘要四个不同任务上,添加不同的prefix在输入上,即可通过生成模型得到输出结果。
由于统一成了生成问题,故采用了原版Transformer的encoder和decoder。而不像BERT仅采用了Transformer Encoder。不同之处在于采用了position embedding采用了相对位置编码。根据self-attention中「key」和「query」之间的偏置生成一个不同的position embedding,而不是固定的位置编码。
作为大力出奇迹的典范,T5怎么可能会少了数据上的创新。T5采用了750GB的C4语料(**Colossal Clean Crawled Corpus **),大大超过了RoBERTa的160GB。对爬取到的网络数据,进行了很细致的清洗,大大提高了语料数量和质量。清洗过程我们就不赘述了。
在训练方法层面,T5集众家之所长,进行了充分的对比实验,可谓是良心之作。
T5最大模型可达110亿参数,是BERT-base的100倍。真的是大力出奇迹啊。为了适应不同使用场景,T5有五个不同size。Small、Base、Large、3B 和 11B, 模型参数量分别为 6000 万、2.2 亿、7.7 亿、30 亿和 110 亿。
T5五个不同size模型在glue上的结果如下,11B参数量的T5模型,刷新了大多数任务的SOTA。
增加语料数据和精细化调参,其他论文和模型也有一定的体现。比如XLNet采用了126GB数据,ERNIE(baidu)增加了很多中文语料。语料数据的增加和精细化调参,对提升模型performance还是很重要的。虽然不是那么fancy,而且需要大量人力物力投入,但还是大大提升了下游任务效果,造福了工业界。
系列文章,请多关注
NLP预训练模型1 – 综述
NLP预训练模型2 – BERT详解和源码分析
NLP预训练模型3 – 预训练任务优化(ERNIE、SpanBERT)
NLP预训练模型4 – 训练方法优化(RoBERTa、T5)
NLP预训练模型5 – 模型结构优化(XLNet、ALBERT、ELECTRA)
NLP预训练模型6 – 模型轻量化(ALBERT、Q8BERT、DistillBERT、TinyBERT等)
Transformer家族1 – Transformer详解和源码分析