简介
本文假定读者已经阅读过 BERT 与 ERNIE 的论文。
ERNIE 掩蔽策略
ERNIE 针对无切分(unsegmented)的语言(如中文),提出了一种 MLM 的数据增强(数据增强)策略:
我们将一个短语或一个实体作为一个单元,通常由多个单词组成。在单词表示训练期间,同一单元中的所有单词都被屏蔽,而不是仅一个单词或字符被屏蔽。以这种方式,在训练过程中隐式地学习了短语和实体的先验知识。
简单概括,ERNIE 会利用分词的信息,在词的粒度(短语级别)做掩蔽,通过这种策略可以使模型隐式地学习到词粒度的知识。与之相对的,BERT 的基本掩蔽策略是基于基础语言单元粒度的(basic language unit,在中文里对应输入的每一个字):
它将句子视为基本语言单位的序列,对于英语,基本语言单位为单词,对于中文,基本语言单位为汉字。
…
词组是一小部分单词或字符,一起充当概念单元……并使用一些依赖于语言的细分工具来获取其他语言(例如中文)的词/短语信息。
原始解析
通过简单的转换逻辑,可以直接把 ERNIE 与 BERT 在模型结构上没有明显的区别。可以将其发布到 ERNIE 与 BERT 在模型结构上没有明显的区别。
主要的差异在 MLM 的数据预先逻辑部分:
- BERT 的数据预处理的输入是若干个 txt 文本,输出是带 NSP,MLM 标注的序列数据集,详见BERT 系列:数据重新编码解析一文。
- ERNIE 的数据初步分为两个阶段:
- 训练前的数据准备:建立序列与标记分词边界信息。
- 训练过程中的数据准备:在每个纪元,基于分词边界信息动态构建 MLM 标注。
构建序列与标记分词边界信息
这一步的输出是一个 txt 文件:
每个样本由 5 个’
;
‘的分隔词组成,数据格式:token_ids; sentence_type_ids; position_ids; seg_labels; next_sentence_label
;其中seg_labels
表示分词边界信息:0 表示词首,1 表示非词首,-1 为占位符,其对应的词为CLS
或者SEP
;
ERNIE 没有开源步骤步的代码。个人建议,可以重复 BERT 的预编码转换序列,然后利用百度的词法分析 API 加入分词边界信息。
动态打造 MLM 标注
论文的3.2 知识整合小节里提到:
我们提出了一种多阶段的知识掩盖策略,而不是直接添加知识嵌入,而是将短语和实体级知识集成到语言表示中。
通过阅读代码,实际上这个所谓的多阶段知识掩盖策略的逻辑是:在每个时代,以某个概率(这个值没给)随机选择mask_word
或者mask_char
模式。mask_word
模式后续会走短语级掩盖逻辑,会利用分词边界信息;mask_char
模式后续会走的基本级别掩蔽的逻辑,不会利用分词边界信息。
论文的3.2.2 短语的级遮蔽里提及:
在短语级掩码阶段,我们还使用基本语言单元作为训练输入,这与随机基本单元掩码不同,这次我们随机选择句子中的几个短语,对同一短语中的所有基本单元进行掩码和预测。
短语级屏蔽的实现见:
- 与 BERT 相对的,ERNIE 这一步是在每个时代动态生成的,且 Masking 的数量没有上限(没有
max_predictions_per_seq
的限制)。 - 基于分词信息,以词为单位决定是否触发 masking 逻辑。
- 对于每个需要 mask 的字符串(一个词),遍历其中每个输入(字符):
- 80%的概率,把输入替换为
[MASK]
。 - 10%的概率,把输入替换为随机的令牌。
- 10%的概率,维持输入不变。
- 80%的概率,把输入替换为