0
雷锋网 AI 开发者按:一个月前,在「AICon 全球人工智能与机器学习技术大会」上,华为诺亚方舟实验首席科学家刘群刚分享了新发布的中文预训练语言模型 NEZHA(哪吒);就在这两天,NEZHA 已在 Github 上开源,同时开源的还有压缩 BERT 模型「TinyBERT」,它在推理时大小可缩小 7.5 倍,并且速度加快 9.4 倍。
可以看到的是近两年预训练模型的发展非常快速,从 Word2Vec 到 ULMFiT、CoVe 再到 BERT、XLNET 等,都各有特点且在不断完善中。聚焦于「多项中文 NLP 任务性能」的 NEZHA 也有亮眼的性能升级。在此,雷锋网 AI 开发者将 NEZHA 详细内容及 TinyBERT 相关地址整理如下。
预训练语言模型本质上,就是神经网络语言模型。它主要有两个特点,即:可以使用大规模无标注纯文本语料进行训练,以及可以用于各类下游 NLP 任务,各项性能指标均获得大幅度提高,并可以将各类下游任务的解决方案统一简化为集中固定的 fine-tune 框架。
预训练语言模型通常有两个大类型。一类是 Encoder,用于自然语言理解,输入整个文章,用于自然语言理解;另一类是 Decoder,是解码式的,用于自然语言生成,只能来看到已经生成的内容,看不到没有生成的内容,这两类模型有所区别。
更直观来看,github 上来自清华大学的两位同学——王晓智和张正彦(在读本科生)整理的一份关于预训练模型的关系图,则可以从功能方面更简单明了的帮我们理解该类模型类别。
预训练模型的关系图
更多详细内容,可参见 PLM 论文整理 Github 项目地址:
图中列出了 BERT、GPT、XLNet、ERNIE 等模型以及它们之间的关系,并拟出了一份相关的论文列表。列表把预训练模型主要分为了三个部分,包括:模型、知识蒸馏与模型压缩。按照这样的分类,TinyBERT 模型则可以归类为「知识蒸馏与模型压缩」部分;NEZHA 则归为「模型」部分。
而根据研究结果显示,近年来的模型大多将重心落到了数据与算力部分。与早期的 ResNet(视觉模型)模型参数相比,数据显示 GPT1 为 100M,BERT large 为 340M,GPT2 为 1.5BN,GPT-2 8B 为 8.3BN。
预训练语言模型研究结果
因此,在预训练模型开发过程中,华为诺亚方舟研究者提出了一种为基于 transformer 的模型设计的知识蒸馏方法——压缩 BERT 模型 TinyBERT(详细解读可查看:https://mp.weixin.qq.com/s/f2vxlhaGW1wnu8UYrvh-tA);该模型大小不到 BERT 的 1/7,但速度是 BERT 的 9 倍多。
而在模型方面,他们选择在内部重现了 Google Bert-base 和 Bert-large 的实验;利用 BERT 的代码,实现了 OpenAI GPT-2 模型;实现基于 GPU 多卡多机并行训练,并且对训练过程进行了优化,提高训练效率,最终得到了「多中文 NLP 任务」预训练模型 NEZHA。
尽管这一预训练模型 NEZHA 的名称听起来有些匪夷所思,但它的开发者们将其视为「无所不能,可以解决不同任务」的寓意。在这个模型中,除了之前提到的重现、多卡多机并行训练之外,主要有两项改进,即:函数式相对位置编码与全词覆盖的实现。
一、函数式相对位置编码
位置编码有函数式和参数式两种,函数式通过定义函数直接计算就可以了。参数式中位置编码涉及两个概念,一个是距离;二是维度。其中,Word Embedding 一般有几百维,每一维各有一个值,一个位置编码的值正是通过位置和维度两个参数来确定。
NEZHA 预训练模型则采用了函数式相对位置编码,其输出与注意力得分的计算涉及到他们相对位置的正弦函数,这一灵感正是来源于 Transformer 的绝对位置编码,而相对位置编码则解决了在 Transformer 中,每个词之间因为互不知道相隔的距离引发的一系列资源占用问题。
位置编码模型
具体而言,Transformer 最早只考虑了绝对位置编码,而且是函数式的;后来 BERT 的提出就使用了参数式,而参数式训练则会受收到句子长度的影响,BERT 起初训练的句子最长为 512,如果只训练到 128 长度的句子,在 128~520 之间的位置参数就无法获得,所以必须要训练更长的语料来确定这一部分的参数。
而在 NEZHA 模型中,距离和维度都是由正弦函数导出的,并且在模型训练期间是固定的。也就是说,位置编码的每个维度对应一个正弦,不同维度的正弦函数具有不同的波长,而选择固定正弦函数,则可以使该模型具有更强的扩展性;即当它遇到比训练中序列长度更长的序列时,依然可以发挥作用。函数式相对位置编码公式,如下图所示:
二、全词覆盖
现在的神经网络模型无论是在语言模型还是机器翻译任务中,都会用到一个词表;而在 Softmax 时,每个词都要尝试比较一下。每次运算时,所有词要都在词表中对比一遍,往往一个词表会包含几万个词,而机器翻译则经常达到六七万个词,因此,词表是语言模型运算中较大的瓶颈。
而 NEZHA 预训练模型,则采用了全词覆盖(WWM)策略,当一个汉字被覆盖时,属于同一个汉字的其他汉字都被一起覆盖。该策略被证明比 BERT 中的随机覆盖训练(即每个符号或汉字都被随机屏蔽)更有效。
BERT 中的随机覆盖
在 NEZHA 的 WWM 实现中,研究者使用了一个标记化工具 Jieba2 进行中文分词(即寻找中文单词的边界)。在 WWM 训练数据中,每个样本包含多个覆盖汉字,覆盖汉字的总数约占其长度的 12%,随机替换的占 1.5%,尽管这样预测整个词运算难度有所增加,但最终取得的效果更好。
三、混合精度训练及 LAMB 优化器
在 NEZHA 模型的预训练中,研究者采用了混合精度训练技术。该技术可以使训练速度提高 2-3 倍,同时也减少了模型的空间消耗,从而可以利用较大的批量。
传统的深度神经网络训练使用 FP32(即单精度浮点格式)来表示训练中涉及的所有变量(包括模型参数和梯度);而混合精度训练在训练中采用了多精度。具体而言,它重点保证模型中权重的单精度副本(称为主权重),即在每次训练迭代中,将主权值舍入 FP16(即半精度浮点格式),并使用 FP16 格式存储的权值、激活和梯度执行向前和向后传递;最后将梯度转换为 FP32 格式,并使用 FP32 梯度更新主权重。
LAMB 优化器则是为专为深度神经元网络的大批量同步分布训练而设计。尽管大小批量 DNN 训练是加快 DNN 训练速度的有效方法,但是如果不仔细调整学习速率的调度,当批量处理的大小超过某个阈值时,模型的性能可能会受到很大影响。
LAMB 优化器则不需要手动调整学习速率,而是采用了一种通用的自适应策略。优化器通过使用非常大的批量处理大小(实验中高达 30k 以上)来加速 BERT 的训练,而不会导致性能损失,甚至在许多任务中获得最先进的性能。值得注意的是,BERT 的训练时间最终从 3 天显著缩短到 76 分钟。
实验通过对各种自然语言理解(NLU)任务进行微调来测试预训练模型的性能,并将 NEZHA 模型和最先进的汉语预训练语言模型:谷歌 BERT(汉语版),BERT-WWM 以及 ERNIE 进行了对比(详细参数见论文),最终结果如下:
NEZHA 实验结果
可以看到,NEZHA 在大部分情况下,都取得了相较更好的性能;尤其在 PD-NER 任务下,NEZHA 最高达到了 97.87 分。另一个表现较亮眼的模型还有 ERNIE Baidu 2.0,颇有超越 NEZHA 的趋势。关于这个情况,论文中作者也解释到,由于实验设置或微调方法可能存在差异,比较可能不完全公平,之后其它模型新版发布后,他们将在相同的设置下对其进行评估并更新此报告。
更多详情,可参见 NEZHA 论文地址:
https://arxiv.org/pdf/1909.00204.pdf
关于知识蒸馏模型 TinyBERT 详细解读,可参考往期内容:
https://mp.weixin.qq.com/s/f2vxlhaGW1wnu8UYrvh-tA
Github 开源地址(包含 NEZHA 与 TinyBERT ):
雷峰网原创文章,未经授权禁止转载。详情见转载须知。