Bert的训练数据生成和解读

在网上看了久,还没看到仔细梳理bert训练数据的解读文章,本人基于bert源码和faspell作者的demo梳理了下bert的训练数据的生成过程,便于小白入门。本人水平有限,如果写有不当之处,烦请大家指正。

生成MLM任务需要的mask数据

用于训练的文本材料是以行排列的句子。

首先读取一行句子,以:“工时填写。”为例,该句子会被认为是一个document和一个chunk,认定只有一个句子后,会随机从其他行的句子中挑一个出来,与该句组合成如下的结构:

[‘[CLS]’, ‘工’, ‘时’, ‘填’, ‘写’, ‘[SEP]’, ‘平’, ‘安’, ‘好’, ‘医’, ‘生’, ‘非, ‘常’, ‘优’, ‘秀’, ‘[SEP]’]

 

当然,在组合数据的过程中,会随机有如下的调整:

在mask的个数范围之内,此处举例有3个mask,其中有80%的概率某字会变成’[MASK]’,有10%的概率不会变化,有10%的概率会随机用另一个字代替它,接下来可能会变化成如下的内容:[‘[CLS]’, ‘工’, ‘时’, ‘[MASK]’, ‘写’, ‘[SEP]’, ‘平’, ‘安’, ‘好’, ‘特’, ‘生’, ‘非, ‘常’, ‘优’, ‘秀’, ‘[SEP]’]。

 

同时我们也会得到相印的mask信息:

segment_ids:这是一个list,用于区分句子之间的覆盖的范围,对应上述内容,其值为[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];

is_random_next:这是一个重点,它表示两句话之间是否有上下文关系,注意,这里的random,这表示该变量如果是True,则两句没有上下文关系,这是一个随机生成的句子对。当每个document中只有一个句子时一定会随机找一个对子与之配对,如果是两个有关的句子,则有50%的概率随机找一个句子与前一个句子配对;

masked_lm_positions:这是一个list,表示本句中出现掩码的位置,其值为[3, 6, 9];

masked_lm_labels:这是一个list,是与position对应的字,其值为[‘填’, ‘平’, ‘医’];

 

上述所有信息会封装在一个instance对象中。

 

如下图所示,红框是带有上下文关系的训练数据,其他的就是单个句子的训练数据:


Bert的训练数据生成和解读