在学习 BERT 模型时,我们大家肯定知道其 MLM 的预训练任务,它会对输入中的 15% 的 Token 进行如下操作:
- 15% 中的 80% Token 使用 [MASK] Token 来替换;
- 15% 中的 10% Token 保持原始 Token 不变;
- 15% 中的 10% Token 随机使用其他 Token 来替换。
我们需要有个解释来描述这样做的有效性,才能更好理解 MLM 预训练任务。我们知道 BERT 能对很多 NLP 任务有效,例如:完形填空、分类任务、文本纠错等,这些能力就是由 BERT 的预训练任务来提供。例如:
- 在预训练时,我们把某些词替换为 [MASK] 由模型学习当前位置的词,可以让模型具备根据上下文预测当前词的能力,即完型填空;
- 在预训练时,我们把某些词替换为随机的其他的词,让模型去预测被随机替换的词,可以让模型具备根据上文对该位置词的纠错能力;
- 在预训练时,我们通过真实词,让模型能够学习到词的更合理的表达,进而能够实现 Token 或者 Sequence 级别的分类问题;
- …等等
我们经常理解,MLM 能都使得 BERT 更好的学习上下文依赖。再具体点的话,我的理解是每个词的向量表示更加依赖于其他词的表示,词之间的关联性增强了,就具备了通过上下文进行填空、纠错、以及句子更好的表示,它是如何通过 MLM 增加上下文依赖?
我们简单回顾 BERT 简单的计算过程:
- 输入一个序列,MHA 通过词之前的依赖程度来表示每个词,此时词之前已经初步建立关联;
- 通过 MLM LOSS 反向传播来调整词之间的关联强度。
如果当前位置的词被替换为 [MASK] 的话,相当于当前位置不包括词的信息,只包含位置信息,预测的当前位置的词时,反向传播就会调整对其他词的依赖程度来使得当前词能够更正确的预测,此时模型在学习位置与其他词之间更准确的关联,这样看起来模型具备了完型填空的能力。
如果当前位置的词被替换为 [随机词],而不是 [MASK] , 相当于当前位置包含了词的信息,但是包含的是错误的信息,模型为了预测正确当前位置的词,反向传播时,需要更大的力度依赖当前位置的上下文信息,此时模型在错误干扰的情况下,学习与其他词之间更强的关联,这样看起来使得模型具备了纠错的能力。
模型大部分的词都是没有经过替换的词,和前面一样也是先经过 MHA 建立初级关联,再由 MLM LOSS 调整词之间的关联,这么做的目的就是希望模型能够更加准确的表达每一个词。因为我们只有能够更加准确的对每个词进行表示,才能够区分开每个词,每个句子,进而进行 token 或者 sequence 级别的 NLL 分类任务。
按照上面的理解过程,如果我们希望模型能够在自己数据集上更加具备完型填空的能力,我们就可以继续在自己数据集上 fine-tuning 这方面的能力,如果希望在自己数据集上能够更好的纠错,那么久可以 fine-tuning 这部分的能力,对于文本分类也是一样的。
如果我们要进行分类任务,由于预训练时模型是对包含 [MASK] 的输入进行学习, 但实际上进行分类任务时,数据中是不包括 [MASK] 的,此时多少会对分类任务带来一些影响。这是因为预训练模型也对 [MASK] 这个特殊的 Token 的表示也进行了学习,[MASK] 的存在会影响到其他词之间的关联关系。
就相当于我们学习英语时,夹杂一些俄语单词,当进行英语考试时,又不存在俄语单词,但是你在学习时接触到的俄语单词多少对你考试会带来一些混淆的影响。我觉得这也是为啥 XLNET、ELECTRA 模型想办法要去掉 [MASK] 的原因吧。