返回介绍

数学基础

统计学习

深度学习

工具

Scala

八、BERT [2018]

发布于 2023-07-17 23:38:25 字数 53168 浏览 0 评论 0 收藏 0

  1. 语言模型预训练已被证明对改善许多自然语言处理任务是有效的。这些任务包括:

    • sentence-level 的任务,如自然语言推理 natural language inference 和转述paraphrasing ,其目的是通过整体分析来预测句子之间的关系。
    • token-level 的任务,如命名实体识别 named entity recognition: NERSQuAD 问答 question answering: QA ,其中模型需要在 token-level 产生细粒度的输出。

    目前有两种策略将预训练的 language representation 应用于下游任务: feature-basedfine-tuning

    • feature-based方法(如 ELMo)使用 tasks-specific 架构,其中使用预训练的 representation作为额外的特征。
    • fine-tuning方法(如 GPT ),引入了最小的 task-specific 参数,并通过简单地微调 pretrained parameter 从而对下游任务进行训练。

    在之前的工作中,这两种方法在pre-training 期间共享相同的目标函数,其中它们使用单向语言模型来学习通用的 language representation

    即,feature-based方法和fine-tuning方法采用相同的预训练方式,但是在应用到下游任务阶段才有所差异。

    论文 《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》 认为:目前的技术严重限制了 pre-trained representation 的能力,特别是对于微调 fine-tuning 方法。主要的限制是:标准的语言模型是单向的,这就限制了在预训练中可以使用的架构。例如,在 GPT 中,作者使用了一个从左到右的架构,其中在 Transformerself-attention layer 中每个 token 只能关注前面的 token

    • 对于sentence-level 的任务,这样的限制是次优的。
    • 对于 token-level 的任务(如 SQuAD 问答任务),当应用基于微调的方法时,这样的限制可能是毁灭性的。因为在这种情况下,从两个方向融合上下文是至关重要的(因为可能需要关注后面的 token 而不是前面的,从而找到问题的答案)。

    在论文 《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》 中,作者通过从 Transfromer 中提出 Bidirectional Encoder Representation: BERT 来改善基于微调的方法。BERT 通过提出一个新的预训练目标来解决前面提到的单向约束:masked language model: MLM 任务,其灵感来自 Cloze 任务(即,完形填空任务)。 MLM 从输入中随机掩码一些 token ,任务的目标是仅根据上下文来预测被掩码单词的原始 vocabulary id 。与从左到右的语言模型预训练不同的是,MLM 目标允许representation 同时融合左侧和右侧的上下文,这使得我们可以预训练一个深度的双向 Transformer 。除了MLM ,论文还引入了一个 next sentence prediction: NSP 任务来联合预训练 text-pair representation

    论文贡献如下:

    • 作者证明了双向预训练对 language representation 的重要性。与 《Improving language understanding with unsupervised learning》使用单向语言模型进行预训练不同,BERT 使用 MLM 来实现 pre-trained deep bidirectional representation 。这也与 ELMo相反,后者使用独立训练的从左到右和从右到左的语言模型的浅层拼接 shallow concatenation
    • 作者表明,预训练的 representation 消除了许多严重工程化的 task-specific 架构的需要。BERT 是第一个基于微调的 representation model ,它在大量的 sentence-leveltoken-level 任务上取得了SOTA 的性能,超过了许多具有 task-specific 架构的系统。
    • BERT 推动了 11NLP 任务的 state-of-the-art 。作者还报告了BERT 的大量消融实验,表明 BERT 模型的双向特性是唯一最重要的新贡献。
  2. 相关工作:

    • feature-based 方法:几十年来,学习广泛适用的 word representation 一直是一个活跃的研究领域,包括非神经方法和神经方法。预训练的 word embeddin 被认为是现代 NLP 系统的一个组成部分,与从头开始学习的 embedding 相比,有很大的改进。

      这些方法已被推广到更粗的粒度,如 sentence embeddingparagraph embedding 。与传统的 word embedding 一样,这些学到的 representation 通常也被用作下游模型的特征。

      ELMo 沿着不同的维度推广了传统的 word embedding 研究。他们提出从语言模型中提取 context-sensitive 的特征。当将contextual word embedding 与现有的 task-specific 架构相结合时,ELMo 推进了几个主要 NLP benchmarkSOTA ,包括 SQuAD 上的问答、情感分析 sentiment analysis 和命名实体识别 named entity recognition

    • fine-tuning 方法:最近从语言模型中进行迁移学习的一个趋势是,在为下游监督任务微调同一模型之前,在语言模型目标上预训练该模型架构。这些方法的优点是,只需要从头开始学习非常少的参数。至少部分由于这一优势,GPTGLUE benchmark 的许多 sentence-level 任务上取得了当时 SOTA 的结果。

    • 从监督数据 supervised data 迁移学习:虽然无监督预训练的优势在于几乎有不限量的数据可用,但也有工作表明,可以从具有大型数据集的监督任务中有效地迁移学习,如自然语言推理和机器翻译 machine translation 。在 NLP 之外,计算机视觉领域的研究也证明了从大型预训练模型进行迁移学习的重要性,其中一个有效的秘方是:对基于 ImageNet 预训练的模型进行微调。

8.1 模型

8.1.1 模型架构

  1. BERT 的模型架构是一个多层的、双向的 Transformer encoder ,基于 《Attention is allyou need》描述的原始实现。由于最近 Transformer 的使用已经变得无处不在,而且我们的实现实际上与原版相同,因此我们将省略对模型架构的详细描述,请读者参考 《Attention is allyou need》 以及 《The Annotated Transformer》 等优秀出版物。

    在这项工作中,我们将层数(即 Transformer block)记做L$ L $ 、 hidden size 记做H$ H $ 、self-attention head 数记做A$ A $ 。 在所有情况下,我们将 feed-forward/filter size 设为4H$ 4H $ ,即,H=768$ H=768 $ 时设为的3072$ 3072 $ 、H=1024$ H=1024 $ 时设为 4096 。我们主要报告两种模型尺寸的结果:

    • BERT_BASEL=12$ L=12 $ ,H=768$ H=768 $ ,A=12$ A=12 $ ,总的参数规模 110M
    • BERT_LARGEL=24$ L=24 $ ,H=1024$ H=1024 $ ,A=16$ A=16 $ ,总的参数规模 340M

    前馈神经网络是一个双层的全连接网络,输入维度为H$ H $ 、中间层的维度为4H$ 4H $ 、输出层的维度为H$ H $ 。

    BERT_BASE 被选择为具有与 GPT 相同的模型大小,以便于比较。然而,关键的是,BERT Transformer 使用的是双向自注意力,而GPT Transformer 使用的是受约束的自注意力(每个token 只能关注其左侧的上下文)。我们注意到,在文献中,双向 Transformer 通常被称为 Transformer encoder ,而只关注左侧上下文的 Transformer 被称为 Transformer decoder (因为它可以用于文本生成)。

    BERTGPTELMo 之间的比较如下图所示。

8.1.2 Input Representation

  1. 我们的 input representation 能够在一个token 序列中明确地表示单个文本句子或一对文本句子(如,[Question, Answer] )。对于一个给定的token ,它的 input representation 是由相应的token embeddingsegment emebddingposition embedding 相加而成的。下图给出了我们的 input representation 的直观表示。

    具体而言:

    • 我们使用具有 30ktokenvocabularyWordPiece embedding《Google’s neural machine translation system: Bridging the gap between human and machine translation》)。我们用 ## 指示被拆分的 word piece

    • 我们使用学到的 positional embedding ,最大可以支持长度为 512token 的序列。

    • 每个序列的第一个 token 总是特殊的 classification embedding ,即 [CLS]。与这个 token 相对应的 final hidden state (即 Transformer 的输出)被用作分类任务的 aggregate sequence representation。对于非分类任务,这个向量被忽略。

    • sentence pair 被打包成一个单一的序列。我们以两种方式区分这些句子。

      • 首先,我们用一个特殊的 token(即,[SEP])将这两个句子分开。(注意,每个句子的结尾都有一个 [SEP]

      • 其次,我们在第一句的每个 token 上添加一个学到的 segment A Embedding ,在第二句的每个 token 上添加一个学到的 segment B Embedding

        假设 segment 编号为 12,那么segment A embedding 就是 segment=1 对应的 embeddingsegment B embedding 就是 segment=2 对应的 embedding

      对于单个句子的输入,我们只使用 segment A Embedding 。注意,segment A 也称作 sentence A,因为这里一个句子就是一个 segment

      进一步地,我们是否可以对句子内部的子句、或者短语也作为更细粒度的 segment 来提供 embedding

8.1.3 预训练任务

  1. ELMoGPT 不同,我们没有使用传统的从左到右、或从右到左的语言模型来预训练 BERT 。相反,我们使用两个新颖的无监督预训练任务对 BERT 进行预训练。

a. Task1: Maksed LM

  1. 直观而言,我们有理由相信:深度双向模型严格来说比 left-to-right 的模型、或浅层拼接了 left-to-right and right-to-left 的模型更强大。不幸的是,标准的 conditional language model 只能从左到右或从右到左进行训练,因为双向条件会让每个词在multi-layered context 中间接地 "看到自己" 。

    为了训练深度双向 representation ,我们采取了一种直接的方法,即随机掩码一定比例的 input token ,然后只预测那些被掩码的 token。我们把这个过程称为 "masked LM"(MLM),尽管它在文献中经常被称为 Cloze task 。在这种情况下,对应于 mask tokenfinal hidden vector 被馈入 output softmax (输出空间为整个 vocabulary),就像在标准语言模型中一样。在我们所有的实验中,对于每个序列我们随机掩码 15%WordPiece token

    与降噪自编码器不同的是,我们只预测被掩码的单词,而不是重建整个输入。

    被掩码的 token 填充以 [MASK]

  2. 尽管这确实允许我们获得一个双向的预训练模型,但这种方法有两个缺点:

    • 首先,我们在预训练和微调之间产生了不匹配 mismatch,因为在微调过程中从来没有看到 [MASK] 这个 token

      为了缓解这一问题,我们并不总是用实际的 [MASK] token 来替换被掩码的 token。相反,训练数据生成器随机选择 15%token (例如,在句子 "my dog is hairy" 中它选择了hairy ),然后它将执行以下程序:

      • 80% 的情况下用 [MASK] token 替换该词,例如,"my dog is hairy" --> "my dog is [MASK]"
      • 10% 的情况下用一个随机的词来替换这个词,例如,"my dog is hairy" --> "my dog is apple"
      • 10% 的情况下保持该词不变,例如,"my dog is hairy" --> "my dog is hairy"。这样做的目的是为了使 representation 偏向于实际观察到的单词。

      Transformer encoder 不知道哪些单词会被要求预测、哪些单词已经被随机词所取代,所以它被迫保持每个 input tokendistributional contextual representation 。此外,由于随机替换只发生在所有 token1.5%(即 15%10%),这似乎并不损害模型的语言理解能力。

      似乎论文并没有实验来验证这一点。

    • 其次,每个 batch 中只有 15%token 被预测,这表明可能需要更多的 pre-training step 来使模型收敛。在实验部分,我们证明了 MLM 的收敛速度确实比left-to-right 的模型(预测每个 token )稍慢,但是 MLM 模型的经验改进 empirical improvement 远远超过了增加的训练成本。

b. Task2: Next Sentence Prediction

  1. 许多重要的下游任务,如 Question Answering: QANatural Language Inference: NLI ,都是基于对两个文本句子之间关系的理解,而语言建模并没有直接捕获到这一点。为了训练一个能够理解句子关系的模型,我们预训练了一个二元化的 next sentence prediction task ,该任务可以从任何单语种的语料库中简单地生成。

    具体而言,在为每个预训练样本选择句子 A 和句子 B 时:

    • 50% 的情况下句子 B 是紧随句子 A 的实际的下一句。
    • 50% 的情况下句子 B 是语料库中的一个随机句子。

    例如:

    ​x
    Input = [CLS] the man went to [MASK] store [SEP] he bought a gallon [MASK] milk [SEP]
    Label = IsNext
    
    
    Input = [CLS] the man [MASK] to the store [SEP] penguin [MASK] are flight ##less birds [SEP]
    Label = NotNext

    我们完全随机地选择 NotNext 句子,最终的预训练模型在这个任务中达到了 97% ~ 98% 的准确率。尽管该任务很简单,但我们在实验中证明,针对这个任务的预训练对 QANLI 都非常有利。

    实际上后续的论文表明:NSP 预训练任务是没什么作用甚至是有害的。

8.1.4 预训练程序

  1. 预训练程序主要遵循现有的关于语言模型预训练的文献。对于预训练语料库,我们使用 BooksCorpus800M 单词)和 English Wikipedia2500M 单词)的组合。对于 Wikipedia ,我们只提取文本段落,忽略了 listtable 、和 header 。至关重要的是,我们使用document-level 语料库而不是混洗过的 sentence-level 语料库(如 Billion Word Benchmark )从而提取长的连续文本序列。

    为了生成每个训练输入序列,我们从语料库中采样两个区间 span 的文本,我们称之为 "句子",尽管它们通常比单个句长得多(但也可能更短)。

    • 第一个句子接受 Segment A Embedding ,第二个句子接受 Segment B Embedding
    • 50% 的情况下句子 B 是紧随句子 A 之后的实际的下一句,50% 的情况下句子 B 是一个随机的句子。这是用于 next sentence prediction 任务。
    • 这两个句子被采样,使得合并后的长度小于等于 512token

    语言模型的 masking 是在 WordPiece tokenization 之后进行的,其中使用 15% 的均匀的掩码率 masking rate ,并没有对部分 word piece 给予特殊考虑。

  2. 我们用 batch size = 256 来训练一百万个 step ,每个 mini-batch256 * 512 = 128000token (这里是近似值,精确值为 131072 ),因此相当于在 0.33B 单词的语料库上训练 40epoch

    • 我们使用 Adam 优化器,学习率为104$ 10^{-4} $ ,β1=0.9,β2=0.999$ \beta_1=0.9, \beta_2=0.999 $ ,L2 权重衰减为 0.01 。学习率在前 10000 步进行 warmup ,学习率线性衰减。
    • 我们在所有 layer 上使用 0.1dropout rate
    • 遵循 GPT ,我们使用 gelu 激活函数不是标准的 relu
    • training lossmean masked LM likelihoodmean next sentence prediction likelihood 之和。
  3. BERT_BASE 的训练在 Pod configuration4 Cloud TPUs 上进行(共 16TPU 芯片)。BERT_LARGE 的训练在 16 Cloud TPUs 上进行(共 64TPU芯片)。BERT_BASEBERT_LARGE 的预训练都需要 4 天的时间来完成。

8.1.5 微调程序

  1. 对于 sequence-level 分类任务,BERT 的微调是直接的。为了获得输入序列的固定维度的、被池化的 representation ,我们采用输入的第一个 tokenfinal hidden state ,这对应于特殊的[CLS] 对应的 word embedding 。我们把这个向量表示为cRH$ \mathbf{\vec c}\in \mathbb R^H $ 。在微调过程中,唯一新增的参数是分类层WRK×H$ \mathbf W\in \mathbb R^{K\times H} $ ,其中K$ K $ 是类别标签的数量。标签概率pRK$ \mathbf{\vec p}\in \mathbb R^K $ 是用标准的 softmax 计算的,即p=softmax(cW)$ \mathbf{\vec p} = \text{softmax}\left(\mathbf{\vec c}\mathbf W^\top\right) $ 。BERTW$ \mathbf W $ 的所有参数都是联合微调的,以使ground-truth 标签的对数概率最大化。

    对于 span-leveltoken-level 的预测任务,上述过程必须以 task-specific 的方式稍作修改。细节在实验部分给出。

  2. 对于微调,模型的大部分超参数与预训练时相同,除了 batch sizelearning rate 和训练 epoch 的数量。 dropout rate 始终保持在 0.1。最佳的超参数值是 task-specific的,但我们发现以下数值范围在所有任务中都能很好地发挥作用:Batch size16 、32Learning rate (Adam)5e-5、3e-5、2e-5epoch 数量为3、4

    微调采用更小的 batch size、更小的学习率、更少的 epoch

    我们还观察到:大数据集(例如,100k+ 带标记的训练样本)对超参数选择的敏感性远低于小数据集。

    微调通常是非常快的,所以简单地对上述超参数进行暴力搜索并选择在验证集上表现最好的模型是合理的。

8.1.6 BERT 和 GPT 的对比

  1. BERT 最具可比性的、现有的预训练方法是OpenAI GPT,它在一个大型文本语料库上训练了一个 left-to-rightTransformer 语言模型。事实上,BERT 中的许多设计决定都是有意选择的,以尽可能地接近 GPT,从而使这两种方法能够得到最低限度的比较。我们工作的核心论点是:我们提出的两个新颖的预训练任务占了经验改进的大部分,但我们确实注意到 BERTGPT的训练方式还有几个不同之处:

    • GPT 是在 BooksCorpus800M 单词)上训练的,而 BERT 是在 BooksCorpusWikipedia2500M 单词)上训练的。

      通常而言,更大的预训练语料库会带来更好的微调效果。

    • GPT 使用句子分隔符sentence separator[SEP])和 classifier token[CLS]),它们仅在微调期间引入;而 BERT 在预训练期间学习 [SEP][CLS]segment A/B embedding

    • GPT 被训练了 1Mstepbatch size32000 个单词;BERT 被训练了 1Mstepbatch size128000 个词。

    • GPT 在所有微调实验中使用相同的学习率 5e-5BERT 选择了 task-specific 的、用于微调的学习率,这个学习率在验证集上表现最好。

    为了隔绝 isolate 这些差异的影响,我们在实验部分进行了大量消融实验,证明大部分的改进实际上来自新颖的预训练任务。

8.2 实验

8.2.1 GLUE 数据集

  1. General Language Understanding Evaluation: GLUE基准是各种自然语言理解 natural language understanding 任务的集合。大多数 GLUE 数据集已经存在多年,但 GLUE的目的是:

    • 首先,对这些数据集进行规范的 Train/Dev/Test 的拆分。
    • 其次,建立一个 evaluation server 从而缓解评估不一致和测试集过拟合的问题。GLUE 并未提供测试集的标签,用户必须将他们的预测上传到 GLUE server 进行评估,并对提交的次数有所限制。
  2. GLUE benchmark 包括以下数据集:

    • Multi-Genre Natural Language Inference: MNLI:是一个大规模、众包式的蕴含分类 entailment classification任务。给定一对句子,任务的目标是:预测第二个句子相对于第一个句子是蕴含关系entailment 、矛盾关系contradiction 还是中性关系 neutral

    • Quora Question Pairs: QQP:是一个二元分类任务,任务的目标是确定在 Quora 上提出的两个问题是否在语义上等价 semantically equivalent

    • Question Natural Language Inference: QNLI:是 Stanford Question Answering Dataset 的一个版本,它被转换为一个二元分类任务。正样本是 sentence 确实包含正确答案的 (question, sentence) pair ,负样本是 sentence 中不包含答案的 (question, sentence) pair

    • Stanford Sentiment Treebank: SST-2 :是一个二元单句分类任务,由从电影评论中提取的句子组成,并具有人类对这些评论的情感的注释 annotation

    • Corpus of Linguistic Acceptability: CoLA:是一个二元单句分类任务,任务的目标是预测一个英语句子是否在语言上 "acceptable "。

    • Semantic Textual Similarity Benchmark: STS-B:是一个从新闻 headlines 和其他来源抽取的 sentence pair 的集合。它们被标记为 1 ~ 5 分,表示这两个句子在语义上的相似程度。

    • Microsoft Research Paraphrase Corpus: MRPC:从在线新闻来源中自动提取的 sentence pair 组成,并由人类注释该 sentence pair 是否具有语义上的等价性。

    • Recognizing Textual Entailment: RTE:是一个类似于 MNLI 的二元蕴含任务,但训练数据少得多。

    • Winograd NLI: WNLI:是一个小型自然语言推理 natural language inference 数据集,源于 《The winograd schema challenge》GLUE的网页指出:这个数据集的构建存在问题,而且每一个提交给 GLUE 的训练好的系统的表现都比一个简单的 baseline 更差。这个简单的 baseline 直接预测 majority class,并达到 65.1 的准确率。因此,出于对 OpenAI GPT 的公平比较,我们排除了这个数据集。对于我们的 GLUE submission ,我们总是预测 majority class

      即,对于每一个测试样本,预测它的类别为训练集中出现概率最高的那个类别(即 majority class )。

  3. 为了在 GLUE上进行微调,我们根据前文所述来表示输入序列或 sequence pair ,并使用对应于第一个输入 token[CLS])的final hidden vectorcRH$ \mathbf{\vec c}\in \mathbb R^H $ 作为 aggregate representation 。这在下图 (a)(b) 中得到了直观的证明。在微调过程中引入的唯一新参数是一个分类层WRK×H$ \mathbf W\in \mathbb R^{K\times H} $ ,其中K$ K $ 是类别标签的数量。我们用c$ \mathbf{\vec c} $ 和W$ \mathbf W $ 计算一个标准的分类损失,即log(softmax(cW))$ \log\left(\text{softmax}\left(\mathbf{\vec c}\mathbf W^\top \right)\right) $ 。

    因为 GLUE 数据集都是文本分类任务。

    • 对于所有的 GLUE 任务,我们使用 batch size = 32 以及 3epoch

    • 对于每个任务,我们用 5e-5、4e-5、3e-5、2e-5的学习率进行微调,并选择在验证集上表现最好的一个。

    • 此外,对于 BERT_LARGE ,我们发现微调在小数据集上有时是不稳定的(也就是说,一些 runs 会产生退化degenerate 的结果),所以我们运行了几个随机重启 random restart ,并选择了在验证集上表现最好的模型。

      通过随机重启,我们使用相同的 pre-trained checkpoint ,但在微调期间进行不同的数据混洗和 classifier layer 初始化 。

    • 我们注意到,GLUE 数据集不包括测试集的标签,我们只为每个 BERT_BASEBERT_LARGE 做一次 evaluation server submission

    从图 (a) 中看到,在微调期间只有一个 [SEP] 符号,这与预训练阶段不一致。在预训练阶段每个句子的末尾都添加一个 [SEP] 。这种不一致是否影响效果?可以通过实验来评估。

  4. 实验结果如下表所示:

    • BERT_BASEBERT_LARGE 在所有任务上的表现都大大超过了现有的系统,分别比 SOTA 的系统获得了 4.4%6.7% 的平均精确度提升。请注意,BERT_BASEOpenAI GPTattention masking 之外的模型架构方面几乎是相同的。

    • 对于最大和最广泛报道的GLUE 任务 MNLIBERT (这里是 BERT_LARGE )相比 SOTA 获得了 4.7% 的绝对提升。

    • GLUE 的官方排行榜上,BERT_LARGE 获得了80.4分;相比之下,排在榜首的系统(即 OpenAI GPT)截至本文撰写之日获得了 72.8 分。

      下图中的 Average 稍有差异,因为这里我们排除了有问题的 WNLI 数据集。

    • 值得注意的是,BERT_LARGE 在所有任务中都显著优于 BERT_BASE,即使是那些训练数据非常少的任务。BERT 模型大小的影响将在下面的实验中进行更深入的探讨。

8.2.2 SQuAD v1.1

  1. Standford Question Answering Dataset: SQuAD 是一个由 10 万个众包的 (question, answer) pair 组成的集合。给定一个问题和来自维基百科中包含答案的段落,任务的目标是预测该段落中的答案文本的区间 answer text span 。例如:

    
    
    xxxxxxxxxx
    Input Question: Where do water droplets collide with ice crystals to form precipitation? Input Paragraph: ... Precipitation forms as smaller droplets coalesce via collision with other rain drops or ice crystals within a cloud. ... Output Answer: within a cloud

    这种类型的区间预测任务 span prediction taskGLUE 的序列分类任务截然不同,但我们能够以一种直接的方式使 BERTSQuAD上运行。

    就像 GLUE 一样,我们将输入的问题和段落表示为一个 single packed sequence ,其中 question 使用 segment A embedding ,段落使用 segment B embedding 。在微调过程中学习到的唯一的新参数是一个 start vectorsRH$ \mathbf{\vec s}\in \mathbb R^H $ 和一个 end vectoreRH$ \mathbf{\vec e}\in \mathbb R^H $ 。令第i$ i $ 个 input tokenBERT 中的的 final hidden vector 表示为tiRH$ \mathbf{\vec t}_i\in \mathbb R^H $ 。如 Figure 3(c) 所示。然后,单词i$ i $ 是 answer span 的起点start 的概率被计算为ti$ \mathbf{\vec t}_i $ 和s$ \mathbf{\vec s} $ 的内积,然后在当前段落中所有单词之上取 softmax

    (1)pi=exp(tis)jexp(tjs)

    其中j$ j $ 取值为从段落开始到段落结束。

    同样的公式用于 answer span 的终点end ,最大得分的 span 被用作预测。训练目标是正确的起点位置和终点位置的对数可能性。

    这里假设起点和终点之间是相互独立的。实际上这种假设通常不成立,终点和起点之间存在关联,如终点的位置大于等于起点。

  2. 我们用 5e-5 的学习率和 batch size = 32 训练了 3epoch 。在推理时,由于终点预测并没有考虑以起点为条件,我们增加了终点必须在起点之后的约束条件,但没有使用其他启发式方法。tokenized labeled span 被调整回原始的 untokenized input 以进行评估。

    因为经过了 tonenization 之后,原始的单词被拆分为 word piece,这将影响 span 的位置。

  3. 结果如下表所示。SQuAD采用了高度严格的测试程序,提交者必须手动联系 SQuAD 的组织者,在一个隐藏的测试集上运行他们的系统,所以我们只提交了我们最好的系统进行测试。下表中显示的结果是我们第一次也是唯一一次向 SQuAD 提交的测试结果。

    我们注意到:SQuAD 排行榜上的榜首结果没有最新的公开的系统描述,而且在训练他们的系统时允许使用任何公共数据。因此,我们在提交的系统中使用了非常适度的数据增强:在 SQuADTriviaQA 上联合训练。

    我们表现最好的系统相比排行榜上榜首的系统高出 +1.5 F1 (以 ensembling 系统的方式 )和 +1.7 F1 (以 single 系统的方式)。事实上,我们的单一 BERT 模型在F1 得分方面优于 top ensemble system 。如果我们只对 SQuAD 进行微调(不包括TriviaQA),我们会损失0.1-0.4 F1 ,但仍然以很大的优势胜过所有现有系统。

    BERT ensemble 使用了 7 个模型,它们分别使用不同的预训练 checkpointfine-tuning seed

8.2.3 Named Entity Recognition

  1. 为了评估 token tagging 任务的性能,我们在 CoNLL 2003 命名实体识别(NER)数据集上对 BERT 进行了微调。这个数据集由 20 万个训练单词组成,这些单词被标注为人物 Person 、组织Organization、位置Location、杂项Miscellaneous 、或其他Other(非命名实体)。

    • 为了进行微调,我们将每个tokeni$ i $ 的 final hidden representationtiRH$ \mathbf{\vec t}_i\in \mathbb R^H $ 馈入分类层。预测不以周围的预测为条件(即,non-autoregressiveno CRF )。

    • 为了与 WordPiece tokenization兼容,我们将每个 CoNLL-tokenized input word 馈入我们的 WordPiece tokenizer ,并使用与第一个 sub-token 对应的 hidden state 作为分类器的输入。例如:

      
      
      xxxxxxxxxx
      Jim Hen ##son was a puppet ##eer I-PER I-PER X O O O X

      其中 X 没有预测。Figure 3(d)中也给出了一个直观的表示。在NER 中使用了 cased WordPiece model(即,保留字母的大小写) ,而在所有其他任务中则使用了 uncased model (即,所有字母转化为小写)。

    结果如下表所示。BERT_LARGECoNLL-2003 NER Test 中优于现有的 SOTACross-View Training with multi-task learning)达到 +0.2 的改进。

    如果在 BERTfinal hidden representation 之上再接入自回归或 CRF,预期将得到更好的效果。

8.2.4 SWAG

  1. Situations With Adversarial Generations: SWAG 数据集包含11.3 万个 sentence-pair completion 的样本,评估了 grounded commonsense inference

    给定视频字幕数据集中的一个句子,任务是在四个选项中决定最合理的延续concatenation。例如:

    
    
    xxxxxxxxxx
    A girl is going across a set of monkey bars. She (i) jumps up across the monkey bars. (ii) struggles onto the bars to grab her head. (iii) gets to the end and stands on a wooden plank. (iv) jumps up and does a back flip.

    BERT 应用于 SWAG 数据集类似于 GLUE 。对于每个样本,我们构建四个输入序列,每个序列都包含给定句子(句子 A )和一个可能的延续(句子B )的拼接。我们引入的唯一 task-specific 参数是一个向量vRH$ \mathbf{\vec v}\in \mathbb R^H $ ,它与 final aggregate representationciRH$ \mathbf{\vec c}_i\in \mathbb R^H $ 的内积表示每个选项i$ i $ 的得分。我们计算在四个选项上的 softmax

    (2)pi=exp(vci)j=14exp(vcj)

    我们用 2e-5 的学习率和 batch size = 16 对模型进行了 3epoch 的微调。结果如下表所示。BERT_LARGE 比作者的 baseline (即,ESIM+ELMo系统)要提高 27.1%

8.2.5 消融研究

  1. 尽管我们已经展示了极其强大的经验结果,但迄今为止所提出的结果并没有将 BERT 框架的每个方面 aspect 的具体贡献分离出来。这里我们对 BERT 的一些方面进行了消融实验,以便更好地了解其相对重要性。

a. 预训练任务的效果

  1. 我们的核心主张claim 之一是 BERT 的深度双向性deep bidirectionality ,这是由 masked LM pre-training 实现的并且是BERT与以前的工作相比最重要的一个改进。为了证明这一主张,我们评估了两个新模型,它们使用了与 BERT_BASE 完全相同的预训练数据、微调方案、以及 Transformer超参数。

    • No NSP:该模型使用 MLM 任务预训练,但是没有 NSP 任务。

    • LTR & No NSP:该模型使用 Left-to-Right: LTR 的语言模型来训练,而不是使用MLM 来训练 。在这种情况下,我们预测每一个input word ,不应用任何 masking 。在微调时也应用了 left-only 约束,因为我们发现:用 left-only-context 进行预训练然后用 bidirectional context 进行微调总是更糟糕。此外,这个模型没有使用 NSP 任务进行预训练。

      这与OpenAI GPT有直接的可比性,但使用了我们更大的训练数据集、我们的input representation 、以及我们的微调方案。

      BERT 在预训练期间学习 [SEP][CLS]segment A/B embedding,而 GPT 仅在微调期间学习这些 input representation

  2. 结果如下表所示。

    • 我们首先检查了NSP任务带来的影响。可以看到:去掉NSPQNLIMNLISQuAD的性能有很大的伤害。这些结果表明,我们的预训练方法对于获得前面介绍的强大的经验结果至关重要。

      后续的 XLNetRoBERTa 都表明:NSP 任务不重要。而且 RoBERTa 的作者认为:BERT 得出 NSP 任务重要的原因是,BERT 的输入是两个句子的拼接,因此如果此时没有 NSP 任务则效果较差。在 RoBERTa 中,由于没有 NSP 任务,因此预训练样本就是一个完整的、来自单个文件的文档块。

    • 接下来,我们通过比较 "No NSP "和 "LTR & No NSP "来评估训练 bidirectional representation 的影响。LTR 模型在所有任务上的表现都比MLM模型更差,在 MRPCSQuAD上的下降幅度非常大。

      • 对于SQuAD,直观而言,LTR 模型在span 预测和 token 预测方面的表现非常差,因为 token-level hidden state 没有右侧的上下文。
      • 对于 MRPC 而言,不清楚这种糟糕的表现是由于数据量小还是由于任务的性质,但是我们发现这种糟糕的表现在多次随机重启的full 超参数扫描中是一致的。
    • 为了加强 LTR 系统,我们尝试在它上面添加一个随机初始化的 BiLSTM 进行微调。这确实大大改善了 SQuAD 的结果,但结果仍然比预训练的双向模型差得多。它还损害了其它所有四个 GLUE 任务的性能。

    • 我们认识到:也可以像 ELMo 那样,单独训练LTRRTL模型,并将每个 token 表示为两个模型的拼接。然而:

      • 首先,这种方法比单一的双向模型要贵两倍。
      • 其次,这种方法对像 QA 这样的任务来说是不直观的,因为 RTL 模型不能以答案作为条件来回答问题(即,条件概率P(questionanswer)$ P(\text{question}\mid \text{answer}) $ 。
      • 最后,这种方法严格来说不如深度双向模型 deep bidirectional model 强大,因为深度双向模型可以选择使用 left contextright context

b. Model Size 的效果

  1. 这里我们探讨了模型大小对微调任务准确性的影响。我们训练了一些具有不同层数、隐单元、以及注意力头的 BERT 模型。除此之外,我们还使用了与前面所述相同的超参数和训练程序。

    选定的 GLUE 任务的结果如下表所示。在这个表中,我们报告了 5 次随机重启微调的平均验证准确率。可以看到:

    • 更大的模型在所有四个数据集上都导致了一致的准确性提高,即使是只有 3600 个标记的训练样本的 MRPC

    • 同样令人惊讶的是,我们能够在相对于现有文献已经相当大的模型之上实现如此显著的改进。例如:

      • 《Attention is all you need》探索的最大的 Transformer(L=6,H=1024,A=16),编码器的参数为100M
      • 而我们在文献中发现的最大的Transformer(L=64,H=512,A=2),参数为 235M《Character-level language modeling with deeper self-attention》)。
      • 相比之下,BERT_BASE 包含 110M 参数,BERT_LARGE 包含 340M 参数。

      多年以来人们都知道,增加模型规模将导致大型任务(如机器翻译、语言建模)的持续改进,这可以通过下表所示的 held-out 训练数据的 LM perplexity 来证明。然而,我们认为这是第一项工作,证明了扩展到极端的 model size 也会导致在非常小型的任务上有很大的改进,只要模型已经被充分地预训练过。

      即,增加模型规模不仅对大型任务有效,对小型任务也有效(模型需要被预训练)。

c. 训练步数的效果

  1. 下图展示了从一个已经预训练了k$ k $ 个 stepcheckpoint 进行微调后的 MNLI 验证准确性。这使我们能够回答以下问题。

    • 问题:BERT 是否真的需要如此大量的预训练(128,000 words/batch * 1,000,000 steps)来实现高的微调准确率?

      答案:是的。BERT_BASE 预训练一百万步时,与五十万步相比,在 MNLI 上实现了接近 1.0% 的微调准确率提升。

    • 问题:MLM 预训练的收敛速度是否比 LTR 预训练慢,因为每个 batch 中只有 15% (而不是 100% )的单词被预测?

      答案:是的,MLM模型的收敛速度比LTR 稍慢。然而,就绝对准确率而言,MLM 模型几乎从一开始就超过了 LTR 模型。

d. Feature-based Approach with BERT

  1. 迄今为止,所有的 BERT 结果都采用了微调方法,即在预训练的模型中加入一个简单的分类层,并在下游任务中联合微调所有的参数。然而,feature-based 的方法,即从预训练的模型中抽取固定的特征,具有一定的优势:

    • 首先,并不是所有的 NLP 任务都可以很容易地用 Transformer 编码器架构来表示,因此需要增加一个 task-specific 的模型架构。
    • 其次,如果能够一次性地预先计算好训练数据的 expensive representation ,然后在这个 representation 的基础上用不太昂贵的模型进行许多实验,这有很大的计算优势。

    这里我们通过在 CoNLL-2003 NER 任务上生成类似于 ELMopre-trained contextual representation 来评估 BERTfeature-based 的方法中的表现如何。为了做到这一点,我们使用与本文在 Named Entity Recognition 章节中相同的 input representation ,但是使用 BERT 的一个或多个层的激活值而没有微调任何参数。这些 contextual embedding 被用作一个双层 BiLSTM 的输入,这个双层 BiLSTM 具有 768 维并且是随机初始化的,并且这个双层 BiLSTM 位于最终的分类层之前。

    结果如下表所示。表现最好的方法是将预训练的 Transformer 的最后四个隐层的 token representation 拼接起来,这比微调整个模型仅相差 0.3 F1 。这表明:BERT 对微调方法和 feature-based 方法都是有效的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文