0. 背景
0.1 摘要
1. 介绍
本文的NEZHA使用函数式相对位置编码,通过预定义函数的方式在自注意力层编码相对位置。实验结果表明,该方法是一种有效的位置编码方案,并在实验中取得了一致的效果。此外,NEZHA在训练过程中使用了三种已被证明是有效的预训练BERT技术,即全词覆盖,混合精度训练和LAMB优化。
2. NEZHA 模型
由于NEZHA也是基于BERT,所以关于Transformer和BERT的详情请直接阅读原始论文或者查阅本人之前的博文。在此不赘述。
函数式相对位置编码
在Transformer 中,每个词之间互相都要Attending,并不知道每个词离自己的距离有多远,这样把每个词平等的对待,是会有问题的。
NEZHA中的函数式相对位置编码,通过使用相对位置的正弦函数计算输出和attention的得分。该想法源于Transformer中使用的函数式绝对位置编码。在本文的模型中, a i j V a_{i j}^{V} aijV和 a i j K a_{i j}^{K} aijK都是正弦函数,且在训练过程固定不变。为了简化起见,直接将 a i j V a_{i j}^{V} aijV和 a i j K a_{i j}^{K} aijK简写为 a i j a_{ij} aij。维度为 2 k 2k 2k和 2 k + 1 2k+1 2k+1的 a i j a_{ij} aij分别如下:
a i j [ 2 k ] = sin ( ( j − i ) / ( 1000 0 2. k d z ) ) a i j [ 2 k + 1 ] = cos ( ( j − i ) / ( 1000 0 2. k d z ) ) \begin{aligned} a_{i j}[2 k] &=\sin \left((j-i) /\left(10000^{\frac{2 . k}{d_z}}\right)\right) \\ a_{i j}[2 k+1] &=\cos \left((j-i) /\left(10000^{\frac{2.k}{d_ z}}\right)\right) \end{aligned} aij[2k]aij[2k+1]=sin((j−i)/(10000dz2.k))=cos((j−i)/(10000dz2.k))
位置i和位置j的相对位置编码由2部分组成,维度为2k和2k+1。假设 d z d_z dz=512,那么k的取值从0,1,255。由此可以看出,位置编码的每个维度都由正弦函数决定。不同维度(即不同 d z d_z dz)的正弦函数会有不同的波长。上述公式中, d z d_z dz表示NEZHA模型的每个head的隐含层大小。波长是一个从 2 π 2\pi 2π到 10000 ⋅ 2 π 10000 \cdot2\pi 10000⋅2π的几何级数。选择固定正弦函数,可以使该模型具有更强的扩展性;即当它遇到比训练中序列长度更长的序列时,依然可以发挥作用。
全词覆盖
在初始的BERT中,每个token或者每个汉字都是随机覆盖的。而 NEZHA 预训练模型,则采用了全词覆盖(WWM)策略,当一个汉字被覆盖时,属于同一个汉字的其他汉字都被一起覆盖。该策略被证明比 BERT 中的随机覆盖训练(即每个符号或汉字都被随机屏蔽)更有效。在 NEZHA 的 WWM 实现中,使用了一个Jieba进行中文分词。在 WWM 训练数据中,每个样本包含多个覆盖汉字,覆盖汉字的总数约占其长度的 12%,随机替换的占 1.5%。尽管这样预测整个词运算难度有所增加,但最终取得的效果更好。
混合精度训练和LAMB优化器
在 NEZHA 模型的预训练中采用了混合精度训练技术。该技术可以使训练速度提高2-3倍,同时也减少模型的空间占用,从而可以利用较大的batch size。
传统的深度神经网络训练使用 FP32 (即单精度浮点格式)来表示训练中涉及的所有变量(包括模型参数和梯度);而混合精度训练在训练中采用了多精度。具体来说,它重点维持模型中权重的单精度副本(称为主权重),即在每次训练迭代中,将主权重舍入为FP16(即半精度浮点格式),并使用 FP16 格式存储的权重、激活和梯度执行向前和向后传递;最后将梯度转换为FP32格式,并使用FP32梯度更新主权重。
LAMB 优化器是专为深度神经元网络大batch size同时分布式训练而设计。尽管使用大的batch size训练可以有效地加快 DNN 训练速度,但是如果不仔细调整学习率,当batch size处理的大小超过某个阈值时,模型的性能可能会受到很大影响。LAMB 优化器则不需要手动调整学习率,而是采用了一种通用的自适应策略。优化器通过使用非常大的batch size(实验中高达 30k 以上)来加速BERT的训练,而不会导致性能损失,甚至在许多任务中获得最先进的性能。值得注意的是,BERT的训练时间最终从3天显著缩短到 76 分钟。
3. 实验结果
预训练
实验结果
评测数据集:CMRC(中文阅读理解2018)、XNLI(跨语言自然语言推理)、LCQMC(大规模中文问题匹配语料)、PD-NER(人民日报命名实体实体数据集)、ChnSenti(中文情感分类数据集)
从消融研究的实验结果可以看出,上述因素都能够促进下游任务性能的提升。对比函数式相对位置编码、参数式绝对位置编码和参数式相对位置编码,可以看出函数式相对位置编码显著优于其他位置编码方式。在CMRC任务中可以看出,相较于相对位置编码使用绝对位置编码真是弱爆了。
总结
本文提出一个基于中文语料的大规模预训练模型:NEZHA。其中最为重要的贡献在于使用了函数式相对位置编码,该方法显著优于其他位置编码方式。另外,NEZHA模型也集成了几项先进技术:全词覆盖、混合精度训练和LAMB优化器。NEZHA在数个中文自然语言理解任务中取得SOTA结果。
PS:其实这篇文章再9月初已经放出来了,当时没有开放预训练模型,是在走内部的审批流程,直到12月初。。。终于放出来,这时候似乎没了新鲜感。看了下技术点,除了函数式相对位置编码,其他的算是平平无奇吧。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227111.html原文链接:https://javaforall.net
