虽然这确实允许我们获得双向预训练模型,但该方法有两个缺点。首先,我们正在创建预训练和微调之间的不匹配,因为在微调期间从未看到[MASK]词块。为了缓解这个问题,我们并不总是用实际的[MASK]词块替换“遮蔽”单词。相反,训练数据生成器随机选择15%的词块,例如,在句子:我的狗是毛茸茸的,它选择毛茸茸的。然后完成以下过程:
并非始终用[MASK]替换所选单词,数据生成器将执行以下操作:
80%的时间:用[MASK]词块替换单词,例如,我的狗是毛茸茸的!我的狗是[MASK]
10%的时间:用随机词替换遮蔽词,例如,我的狗是毛茸茸的!我的狗是苹果
10%的时间:保持单词不变,例如,我的狗是毛茸茸的!我的狗毛茸茸的。这样做的目的是将该表征偏向于实际观察到的单词。
变换器编码器不知道它将被要求预测哪些单词或哪些单词已被随机单词替换,因此它被迫保持每个输入词块的分布式语境表征。此外,因为随机替换只发生在所有词块的1.5%(即15%的10%),这似乎不会损害模型的语言理解能力。
使用MLM的第二个缺点是每批中只预测了15%的词块,这表明模型可能需要更多的预训练步骤才能收敛。在5.3节中,我们证明MLM的收敛速度略慢于从左到右的模型(预测每个词块),但MLM模型在实验上的改进远远超过所增加的训练成本。
3.3.2 任务#2:下一句预测很多重要的下游任务,例如问答(QA)和自然语言推理(NLI),都是基于对两个文本句子间关系的理解,而这种关系并非通过语言建模直接获得。为了训练一个理解句子关系的模型,我们预训练了一个二值化下一句预测任务,该任务可以从任何单语语料库中轻松生成。具体来说,选择句子A和B作为预训练样本:B有50%的可能是A的下一句,也有50%的可能是来自语料库的随机句子。例如:
输入=[CLS]男子去[MASK]商店[SEP]他买了一加仑[MASK]牛奶[SEP]
Label= IsNext
输入=[CLS]男人[面具]到商店[SEP]企鹅[面具]是飞行##少鸟[SEP]
Label= NotNext
我们完全随机选择这些NotNext语句,最终预训练模型在此任务中达到97%-98%的准确率。尽管它很简单,但我们在5.1节中证明,面向该任务的预训练对QA和NLI都非常有益。
3.4 预训练过程BERT预训练过程主要遵循现有的语言模型预训练文献。对于预训练语料库,我们使用BooksCorpus(800M单词)(Zhu等,2015)和英语维基百科(2,500M单词)的串联。对于维基百科,我们只提取文本段落并忽略列表、表格和题头。至关重要的是,使用文档级语料库而不是洗牌式(乱词序)句子级语料库,例如Billion Word Benchmark(Chelba等,2013),以便提取长的连续序列。
为了生成每个训练输入序列,我们从语料库中采样两个文本跨度,我们将其称为“句子”,即使它们通常比单个句子长得多(但也可以更短)。第一个句子接收A嵌入,第二个句子接收B嵌入。B有50%可能刚好是A嵌入后的下一个句子,亦有50%可能是个随机句子,此乃为“下一句预测”任务而做。对它们采样,使其组合长度≦512个词块。该LM遮蔽应用于具有15%统一掩蔽率的WordPiece词块化之后,并且不特别考虑部分字块。
我们训练批量大小为256个序列(256个序列*512个词块=128,000个词块/批次),持续1,000,000个步骤,这比33亿个单词语料库大约40个周期。我们使用Adam(学习程序),设其学习率为1e-4,β1=0.9,β2=0.999,L2权重衰减为0.01,学习率预热超过前10,000步以上以及线性衰减该学习率。我们在所有层上使用0.1的丢失概率。在OpenAIGPT之后,我们使用gelu激活(Hendrycks和Gimpel, 2016)而不是标准relu。训练损失是平均的遮蔽LM可能性和平均的下一句子预测可能性的总和。