预训练数据 预训练过程很大程度上遵循了关于语言模型预训练的现有文献。 对于预训练语料库,我们使用 BooksCorpus(800M 字)(Zhu et al.,2015)和英文维基百科(2500M 字)。 对于维基百科,我们只提取文本段落而忽略列表、表格和标题。 为了提取长的连续序列,使用文档级语料库而不是像 Billion Word Benchmark (Chelba et al., 2013) 这样的打乱句子级语料库是至关重要的。
微调很简单,因为 Transformer 中的 self-attention 机制允许 BERT 通过交换适当的输入和输出来对许多下游任务进行建模——无论它们涉及单个文本还是文本对。 对于涉及文本对的应用程序,一个常见的模式是在应用双向交叉注意力之前对文本对进行独立编码,例如 Parikh et al.(2016); Seo 等人(2017 年)。 相反,BERT 使用自注意力机制来统一这两个阶段,因为编码具有自注意力的连接文本对有效地包括两个句子之间的双向交叉注意力。
对于每个任务,我们只需将特定于任务的输入和输出插入 BERT 并端到端地微调所有参数。 在输入端,预训练中的句子 A 和句子 B 类似于(1)释义中的句子对,(2)蕴涵中的假设-前提对,(3)问答中的问题-段落对,以及(4)a 退化文本-? 在文本分类或序列标记中配对。 在输出端,token 表示被输入到输出层用于标记级任务,例如序列标记或问答,而 [CLS] 表示被输入到输出层进行分类,例如蕴含或情感分析。
与预训练相比,微调相对便宜。 从完全相同的预训练模型开始,论文中的所有结果最多可以在单个 Cloud TPU 上复制 1 小时,或在 GPU 上复制几个小时。7 我们在相应的任务特定细节中描述 第 4 节的小节。更多详细信息可在附录 A.5 中找到。
===============================================================
在本节中,我们展示了 11 个 NLP 任务的 BERT 微调结果
通用语言理解评估 (GLUE) 基准(Wang 等人,2018a)是各种自然语言理解任务的集合。 GLUE 数据集的详细描述包含在附录 B.1 中。
为了微调 GLUE,我们如第 3 节所述表示输入序列(对于单个句子或句子对),并使用与第一个输入标记([CLS])对应的最终隐藏向量 C ∈ R H C \in \mathbb{R}^{H} C∈RH 作为聚合表示 . 微调期间引入的唯一新参数是分类层权重 W ∈ R K × H W \in \mathbb{R}^{K×H} W∈RK×H,其中 K 是标签的数量。 我们用 C 和 W 计算标准分类损失,即 log(softmax( C W T CW^{T} CWT))。
我们使用 32 的批量大小并对所有 GLUE 任务的数据进行 3 个时期的微调。 对于每个任务,我们在开发集上选择了最佳的微调学习率(在 5e-5、4e-5、3e-5 和 2e-5 中)。 此外,对于 B E R T L A R G E BERT_{LARGE} BERTLARGE,我们发现微调有时在小数据集上不稳定,因此我们运行了几次随机重启并在开发集上选择了最佳模型。 对于随机重启,我们使用相同的预训练检查点,但执行不同的微调数据混洗和分类器层初始化。