BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

文章下载地址:https://arxiv.org/abs/1810.04805

介绍

语言模型预训练已被证明对改善许多自然语言处理任务是有效的,现有有两种策略可以将预先训练好的语言表示应用到下游任务中:基于特征的策略和微调策略。这两种方法在训练前具有相同的目标函数,它们使用单向语言模型来学习一般语言表示。

  • 基于特征的方法,如ELMo,使用特定于任务的架构,包括预先训练的表示作为附加特征。
  • 微调方法,如生成式预训练Transformer,引入了最小的任务特定参数,并通过简单地微调所有预训练的参数来在下游任务上进行训练。

作者认为,目前的技术限制了预训练表示的能力,特别是对于微调方法。主要的限制是标准语言模型是单向的,这限制了在预训练过程中可以使用的架构的选择。在问题回答中,从两个方向合并上下文是至关重要的。BERT通过使用一个“masked language model”(MLM)预训练目标,减轻了前面提到的单向性约束。掩码语言模型从输入中随机屏蔽一些标记,目的是预测掩码的原始词汇id仅仅通过上下文。除了掩蔽语言模型,还使用了一个“下一个句子预测”任务,联合预训练文本对表示。

  • 演示了双向预训练对语言表示的重要性
  • 展示了预先训练的表示减少了对许多精心设计的任务特定架构的需求。

相关工作

无监督的基于特征的方法

预先训练好的单词嵌入是现代自然语言处理系统的一个组成部分,与从头开始学习的嵌入相比,它提供了显著的改进。为了预先训练单词嵌入向量,使用了从左到右的语言建模目标,以及在左右上下文中区分正确和错误单词的目标。

BERT模型

在BERT框架中有两个步骤:预培训和微调。在预训练过程中,该模型在不同的预训练任务上对未标记的数据进行训练。为了进行微调,首先使用预先训练好的参数初始化BERT模型,并使用从下游任务中获得的标记数据对所有参数进行微调。每个下游任务都有单独的微调模型,即使它们是用相同的预训练参数初始化的。

BERT的一个显著特点是它跨不同任务的统一架构。即预训练好之后即可适用于所有任务,只需要根据最终任务微调参数。BERT的模型架构是一个多层双向Transformer编码器。在本工作中,我们将层数(Transformer blocks)表示为L,隐藏大小表示为H,自注意头数表示为A。

B E R T B A S E ( L = 12 , H = 768 , A = 12 , T o t a l P a r a m e t e r s = 110 M ) BERT_{BASE}(L=12, H=768, A=12, Total Parameters=110M) BERTBASE​(L=12,H=768,A=12,TotalParameters=110M)

B E R T L A R G E ( L = 24 , H = 1024 , A = 16 , T o t a l P a r a m e t e r s = 340 M ) . BERT_{LARGE} (L=24, H=1024,A=16, Total Parameters=340M). BERTLARGE​(L=24,H=1024,A=16,TotalParameters=340M).

为了使BERT处理各种下游任务,我们的输入表示能够明确地在一个标记序列中表示单个句子和一对句子,在整个工作过程中,一个“句子”可以是一个连续文本的任意跨度,而不是一个实际的语言句子。一个“序列”指的是对BERT的输入标记序列,它可以是单个句子或两个句子打包在一起。每个序列的第一个标记总是一个特殊的分类标记([CLS])。与该标记对应的最终隐藏状态被用作分类任务的聚合序列表示。在BERT模型处理完输入序列后,[CLS]标记对应的最终隐藏状态(即经过所有Transformer层之后的状态)被用作整个序列的聚合表示。这意味着[CLS]标记的向量表示捕捉了整个输入序列的全局信息。句子对被打包成一个单一的序列。我们用两种方式来区分这些句子。首先,我们用一个特殊的标记([SEP])将它们分开。其次,我们在每个标记中添加一个学习嵌入,表明它是属于句子a还是句子B。对于一个给定的令牌,它的输入表示是通过将相应的原文、段和位置嵌入相加来构造的。在这里插入图片描述

预训练BERT

我们使用两个无监督的任务对BERT进行预训练。我们将输入嵌入表示为E,将特殊[CLS]标记的最终隐藏向量表示为C,将第i个输入标记的最终隐藏向量表示为Ti
在这里插入图片描述

任务1:掩蔽

标准的条件语言模型只能从左到右或从右到左进行训练,因为双向条件反射将允许每个词间接地“看到自己”,并且该模型可以简单地在多层上下文中简单地预测目标词。为了训练一个深度双向表示,我们简单地随机屏蔽一些百分比的输入标记,然后预测这些掩蔽标记。我们将这个过程称为“masked LM”(MLM),在这种情况下,与掩码标记对应的最终隐藏向量被输入到一个输出的softmax中,就像在标准LM中一样。在我们所有的实验中,我们随机屏蔽了每个序列中15%的标记。与去噪自动编码器相比,我们只预测被掩蔽的单词,而不是重建整个输入。

虽然这允许我们获得一个双向的预训练模型,但缺点是预训练和微调之间模型不一致,因为[MASK]掩码在微调最终任务期间不会出现。为了缓解这种情况,我们并不总是用实际的[MASK]替换将被掩码的单词。训练数据生成器随机选择15%的位置进行预测。如果已经选择了第i个单词进行替换,我们有80%的概率用[MASK]替换,10%的概率用随机单词替换(有概率随机到这个单词本身)或不变。然后,利用Ti来预测具有交叉熵损失的原始标记。

任务2:下一个句子预测(NSP)

许多重要的下游任务,如问答(QA)和自然语言推理(NLI),都是基于对两个句子之间关系的理解,这不是由语言建模直接捕获的。该任务可以从任何单语语料库中简单地生成。具体来说,当为每个训练前的示例选择句子A和B时,50%的时间B是A后面的实际下一个句子(标记为IsNext),50%的时间它是语料库中的一个随机句子(标记为NotNext)。

微调BERT

微调很简单,因为Transformer中的自注意机制允许BERT通过交换适当的输入和输出来建模许多下游任务——无论是涉及单个文本还是文本对。对于涉及文本对的应用程序,一个常见的模式是在应用双向交叉注意之前独立地对文本对进行编码。BERT使用自注意机制来统一这两个阶段,因为编码一个具有自我注意的连接文本对有效地包含了两个句子之间的双向交叉注意。

对于每个任务,我们只需将特定于任务的输入和输出插入BERT,并端到端(指的是一个系统或模型从输入直接映射到输出的过程,不需要人为地设计中间步骤或特征工程)调整所有参数。在输入时,预训练中的句子A和句子B类似于(1)句子对,(2)隐含中的假设-前提对(其中一句作为前提(premise)提出一个陈述,另一句作为假设(hypothesis)提出一个相关的陈述。目标是确定假设句与前提句之间的逻辑关系),(3)问题回答中的问题-答案,(4)文本分类或序列标记中的退化文本-∅对(意思是在做分类任务时,只需要对一句话进行分类,不需要多个句子,因此第二句是空)。在输出时,令牌表示被输入输出层用于标记级任务,如序列标记或问题回答,[CLS]表示被输入输出层进行分类,如隐含或情绪分析。

  1. Token-level tasks(令牌级任务):
    • 对于需要在每个令牌(token)级别上进行预测的任务,如序列标注(sequence tagging)或问答(question answering),BERT模型的输出是每个输入令牌的表示。
    • 这些令牌表示被送入一个输出层,通常是一个全连接层(fully connected layer),用于生成每个令牌的预测。例如,在命名实体识别(NER)任务中,每个单词的表示会被用来预测它是否属于某个特定的实体类别。
  2. Classification tasks(分类任务):
    • 对于分类任务,如自然语言推理(entailment)或情感分析(sentiment analysis),BERT模型使用特殊分类标记[CLS]的最终隐藏状态作为整个输入序列的聚合表示。
    • 这个[CLS]表示被送入另一个输出层,通常也是一个全连接层,后面可能接一个softmax层,用于对不同的类别进行分类。
  3. 输出层的设计:
    • 输出层的设计取决于具体任务的需求。对于令牌级任务,输出层可能需要为序列中的每个位置生成一个预测,因此输出层的输出维度会与输入序列的长度相匹配。
    • 对于分类任务,输出层通常只有一个输出,即整个序列的分类结果。

更多推荐