针对有两个及两个以上连续字组成的词,随机mask字割裂了连续字之间的相关性,使模型不太容易学习到词的语义信息。比如一句话:‘北京是中国的首都,是一座美丽的城市’,在bert的随机mask LM任务中,可能是把‘京’mask掉在再做预测,这样就把‘北京’两个字的语义割裂了。
针对bert存在的问题,ERNIE改变了mask的方式,不再是单个token的mask,而是加入了实体和短语的mask,这让模型具有了更强的语法学习能力。
上图直观地显示了BERT和ERNIE的采取的不同的masking策略,这是ERNIE引入知识(Knowledge Inegration)的主要手段,介绍如下:
在每个epoch会随机选择句子是mask_word(mask实体和短语) 还是 mask_char(mask单字) 模式
ERNIE除了mask的重大改变,同时在训练数据集上增加了很多。bert使用了中文维基百科,ERNIE也同样使用了,并且在此基础上加入百度自有的数据集:百度百科(实体、强描述性)、百度新闻(专业通顺语料)、百度贴吧(多轮对话)。这三个数据集的侧重点不同,对模型应该也有较好的提升。对语料的处理加入了中文繁体–>简体,英文大写–>小写,词表大小为17964。
针对bert存在的第二个问题,ERNIE对NSP任务做了修改,输入层使用多轮对话来替代句子对分类任务。输入格式为[CLS]S1[SEP]S2[SEP]S3[SEP] ,这种组合可以表示多轮对话,例如QRQ、QRR、QQR,Q是提问,R是回答。随机替换R,然后让模型判断这个多轮对话是真的还是假的。
RoBERTa 主要试验了 BERT 中的一些训练设置 (例如 NSP Loss 是否有意义,batch 的大小等),并找出最好的设置,然后再更大的数据集上训练 BERT。
原来的 BERT 只使用了 16G 的数据集,而 RoBERTa 在更大的数据集上训练 BERT,使用了 160G 的语料
BERT 在训练的过程中采用了 NSP Loss,原本用意是为了让模型能够更好地捕捉到文本的语义,给定两段语句 X = [x1, x2, …, xN] 和 Y = [y1, y2, …, yM],BERT 中的 NSP 任务需要预测 Y 是不是 出现在 X 的后面。
但是 NSP Loss 受到不少文章的质疑 ,例如 XLNet,RoBERTa 采用了一个实验验证 NSP Loss 的实用性。实验中采用了四种组合:
RoBERTa 使用 NSP 和不使用 NSP。使用 Segment-Pair (多个句子) 要好于 Sentence-Pair (单个句子),实验结果显示使用单个句子会使 BERT 在下游任务的性能下降,主要原因可能是使用单个句子导致模型不能很好地学习长期的依赖关系。
中间两行是不使用 NSP Loss 的结果,两种方式都是比使用 NSP 效果要好的,这说明了 NSP Loss 实际上没什么作用,因此在 RoBERTa 中丢弃了 NSP Loss。
原始的 BERT 在训练之前就把数据 Mask 了,然后在整个训练过程中都是保持数据不变的,称为 Static Mask。即同一个句子在整个训练过程中,Mask 掉的单词都是一样的。
RoBERTa 使用了一种 Dynamic Mask 的策略,将整个数据集复制 10 次,然后在 10 个数据集上都 Mask 一次,也就是每一个句子都会有 10 种 Mask 结果。使用 10 个数据集训练 BERT。
之前的一些关于神经网络翻译的研究显示了使用一个大的 batch 并相应地增大学习率,可以加速优化并且提升性能。RoBERTa 也对 batch 大小进行了实验,原始的 BERT 使用的 batch = 256,训练步数为 1M,这与 batch = 2K,训练步数 125K 的计算量是一样的,与 batch = 8K 和训练步数为 31K 也是一样的。
在BERT、XLNet、RoBERTa中,词表的embedding size(E)和transformer层的hidden size(H)都是相等的,这个选择有两方面缺点:
从建模角度来讲,wordpiece向量应该是不依赖于当前内容的(context-independent),而transformer所学习到的表示应该是依赖内容的。所以把E和H分开可以更高效地利用参数,因为理论上存储了context信息的H要远大于E。
从实践角度来讲,NLP任务中的vocab size本来就很大,如果E=H的话,模型参数量就容易很大,而且embedding在实际的训练中更新地也比较稀疏。
因此作者使用了小一些的E(64、128、256、768),训练一个独立于上下文的embedding(VxE),之后计算时再投影到隐层的空间(乘上一个ExH的矩阵),相当于做了一个因式分解。
跨层参数共享,就是不管12层还是24层都只用一个transformer。
作者对比了每层输入输出的L2距离和相似度,发现了BERT的结果比较震荡,而ALBERT就很稳定,可见ALBERT有稳定网络参数的作用。
后BERT时代很多研究(XLNet、RoBERTa)都发现next sentence prediction没什么用处,所以作者也审视了一下这个问题,认为NSP之所以没用是因为这个任务不仅包含了句间关系预测,也包含了主题预测,而主题预测显然更简单些(比如一句话来自新闻财经,一句话来自文学小说),模型会倾向于通过主题的关联去预测。因此换成了SOP(sentence order prediction),预测两句话有没有被交换过顺序。实验显示新增的任务有1个点的提升。
https://zhuanlan.zhihu.com/p/70257427
bilibili.com/video/BV1A64y1176Y?p=30