BERT 原理解析

本文是对 BERT 原始论文(BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding )的解读。

BERT(Bidirectional Encoder Representations from Transformers)是一种预训练模型,旨在通过考虑所有层中的双侧上下文信息来得到深度的双向表示。该表示连接上一层输出层后,仅需微调训练就可以在很多 NLP 任务中取得惊人的效果。在介绍模型之前,我们需要先简单了解 BERT 的提出背景。

背景

基于语言模型的预训练(pre-training)已经被证明可以有效提升各种 NLP 任务的表现。而将预训练得到的表示用于下游任务时有两种策略:基于特征(feature-based)和微调(fine-tuning)。基于特征的策略使用任务特定的架构,将预训练的表示作为额外的特征,其代表为 ELMo;基于微调的策略使用最少的任务特定参数,通过简单的微调预训练参数来训练下游任务,其代表为 OpenAI GPT。

之前的研究的局限性在于,其在预训练时使用的目标函数均基于单向语言模型,没有同时考虑到双向的上下文信息。BERT 模型旨在解决这一局限性,通过提出一种新的预训练目标:masked language model(MLM)。简单来说,MLM 随机地从输入中遮蔽一些词语,然后训练目标是基于被遮蔽词语的双侧上下文来预测该词语在词典中的 id。此外,BERT 模型还引入了一个 next sentence prediction 任务,来预训练文本对的联合表示。

下图给出了 BERT、ELMo 和 OpenAI GPT 三者之间的结构比较。只有 BERT 真正同时使用了左右两侧上下文的信息。

模型

本节将介绍 BERT 模型的实现细节。在 BERT 中,总共包括两个步骤:预训练微调。在预训练中,模型基于无标签数据,在不同的预训练任务上进行训练。在微调中,模型首先基于预训练得到的参数初始化,然后使用来自下游具体任务的标签数据对所有参数进行微调。每个下游任务都拥有独立的微调模型,即便其使用相同的预训练参数初始化。BERT 的特征在于对于不同的任务,其模型结构统一,预训练架构与最终的下游架构仅存在细微差别。下图以智能问答为例,给出了 BERT 的整体架构。

模型结构

BERT 模型的结构是一个多层双向 Transformer encoder,基于原始论文(Attention is all you need)实现。Transformer encoder 的特点是其关注了双侧的上下文,而 Transformer decoder 则仅使用了左侧的上下文(通过 masked 方法)。在本研究中,定义 Transformer 堆叠层数为 ,隐藏向量维数为 ,自我注意力头部数量为 ,全连接网络隐藏层维数为 。本研究包括了两种大小的 BERT 模型:

  • : , 总参数量为 110M
  • : , 总参数量为 340M

其中 BERT base 选择了与 OpenAI GPT 同样的大小,方便两者之间的比较。

输入/输出表示

为了让 BERT 能够处理一系列的下游任务,模型的输入表示需要能够在一个序列中明确地表示单个句子以及句子对(如问题-答案)。注意在本研究中,一个”句子“并不一定是实际的句子,可以是任意范围内的连续文本;一个”序列“表示 BERT 中的输入 token 序列(即词语序列),可以是单个句子,也可以是两个句子打包在一起。

本研究中使用了 WordPiece 嵌入(大小为 30000 的词典)来生成词嵌入向量。每个序列的第一个 token 为一个特殊的分类标志 ,该 token 的最终隐藏状态用来聚合序列,执行分类任务。句子对被打包到单个序列中,通过两种方式进行区分:第一种是两个句子间插入一个特殊标志 ,第二种是对于每个 token,添加一个可以学习的嵌入向量来表示其属于句子 A 还是 B。如图 1 所示,输入嵌入向量标记为 ,特殊标志 的最终隐藏向量标记为 ,第 个输入 token 的最终隐藏向量标记为 .

对于一个给定的 token,其输入表示由三部分相加得到,如下图所示。第一个是词嵌入(基于 WordPiece 生成),第二个是 segment 嵌入(表示该 token 所属的句子),第三个是位置嵌入(表明该 token 在序列中的位置信息)。

预训练 BERT

我们使用两个无监督任务来预训练 BERT,如图 1 左侧所示。

任务一:Masked LM

对于标准的条件语言模型,其只能进行单向训练,否则词语会”看到它们自己“,引起模型训练的混乱。为了同时利用双侧上下文的信息,原文提出了一种方案:将输入序列的部分 token 随机遮挡起来,然后预测这些被遮挡起来的 token。该方法被称为 ”masked LM“ (MLM),其思想来源于著名的 Cloze task。在该任务中,被遮挡的 token 的最终隐藏向量会被转换为一个词典长度的 softmax 向量输出,用于预测词语 id。在原文的试验中,随机遮挡了每个序列中 15% 的 WordPiece 向量。

MLM 任务可以允许模型利用双侧上下文的信息进行预训练,但是其存在着一个问题:预训练和微调存在着不匹配,因为 token 并不会出现在微调训练中。为了减轻这一影响,我们并不总是用 token 来替换被遮挡的词语。如之前所述,训练数据生成器随机选择 15% 的 token 位置用于预测,如果第 个位置的 token 被选中,则其会按照如下策略进行替换:

  1. 80% 的可能使用 token
  2. 10% 的可能使用随机 token
  3. 10% 的可能保持 token 不变

之后,输出 会被用于预测原始的 token,使用交叉熵损失函数。

任务二:Next Sentence Prediction (NSP)

很多重要的下游任务,如智能问答(QA)和自然语言推理(NLI),都是基于理解两个句子之间的联系,而标准的语言模型并不能直接捕捉这一联系。BERT 提出了一种二元 next sentence prediction 任务进行预训练,能够在任意单语言语料库上实现。具体来说,当选择每个训练样本的句子对 A 和 B 时,B 有 50% 的概率是 A 的真实的后一句(标签为 );有 50% 的概率是语料库中的随机一句(标签为 )。如图 1 所示, 用来预测是否为下一个句子。虽然这种方法很简单,但是在 QA 和 NLI 上均取得了不错的效果。

预训练数据

预训练语料库采用了 BooksCorpus (800M 词语)以及 English Wikipedia(2500M 词语)。需要注意的是作者使用了文档层面的语料库而非打乱的句子层面的语料库,因为预训练需要提取序列之间的关系。

微调 BERT

得益于 Transformer 的自我注意力机制,BERT 的微调过程比较直接。对于每个任务,只需要将任务对应的输入及输出拖入 BERT结构,然后端对端微调所有参数即可。举例来说,对于输入,预训练中的句子对 A 和 B 对应于:

  1. 文本复述任务(paraphrasing)中的句子对
  2. 文本蕴涵(entailment)任务中的 hypothesis-premise 对
  3. 智能问答任务中的 question-passage 对
  4. 文本分类或序列标注任务中的 text-∅ 对(即单个句子)

而对于输出,token 的表示被注入到一个输出层中,用于 token-level 的任务,如序列标注或智能问答。而 表示则被注入到输出层中,用于分类任务,如文本蕴涵、情感分析等。下图给出了不同下游任务下 BERT 微调结构的不同,其中 a 和 b 对应序列层面的任务,c 和 d 对应词语层面的任务。

与预训练相比,微调部分的算力要求相对较低,如果你有一块 TPU,最多一个小时就可以复现原文中的所有结果(基于预训练模型)。

实验 & 消融研究

文章的第 4-5 节描述了 BERT 模型在各下游任务上的表现以及针对模型本身的消融实验,这里仅作简单的介绍。

原文中展示了 BERT 微调结构在 11 个 NLP 任务上的表现,包括 GLUE (包括 9 个任务)、SQuAD v1.1、SQuAD v2.0 以及 SWAG,结果都十分的牛批。下表给出了 GLUE 的测试结果。

在消融实验中,原文主要进行了三个实验:第一个实验是预训练任务的影响,结果如下表所示。可以看到同时执行 BERT 所提出的两项预训练任务的表现要优于其他模型。

第二个实验是模型大小的影响。结果如下表所示。作者指出当针对下游任务时模型仅需要微调时(即仅使用很小一部分随机初始化的参数),模型越大取得的结果越好,即便下游任务的数据量很小。而基于特征的方法可能存在模型大小的上界,即增加到一定程度后效果并不会变好。

第三个实验探索 BERT 在基于特征的方法中的应用,结果如下表所示。可以看到 BERT 对于微调方法和基于特征的方法均可以取得较好效果。

PS:以上就是对 BERT 原论文的主要内容的解读。值得一提的是,网上大多数的总结是基于 v1 版本的,而原作者在 2019 年上传了一个 v2 版本,对文章的整体结构进行了调整。

本文分享自微信公众号 - 口仆(roito33),作者:口仆

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • CS229 课程笔记之七:正则化和模型选择

    我们希望可以自动选择一个权衡方差与偏差最好的模型。为了更加具体,本节所讨论的模型集合为「有限集」

    口仆
  • 自然语言处理中的预训练模型(上)

    本文是最近比较火的一篇关于预训练模型的综述 「Pre-trained Models for Natural Language Processing: A Sur...

    口仆
  • 自然语言处理中的预训练模型(下)

    PTM 通常是基于大规模文本语料训练通用的语言表示,而缺乏领域特定的知识。通过外部知识库引入领域知识被证明可以提升模型结果。这些外部知识包括:语言知识、语义知识...

    口仆
  • BERT - 用于语言理解的深度双向预训练转换器

    最近被 Google 的 BERT (Bidirectional Encoder Representations from Transfoemers)模型给刷屏...

    caoqi95
  • 【Pre-Training】BERT:一切过往,皆为序章

    今天我们学习的是谷歌的同学 2018 年的论文《BERT: Pre-training of Deep Bidirectional Transformers fo...

    yuquanle
  • NLP历史突破!谷歌BERT模型狂破11项纪录,全面超越人类!

    谷歌AI团队新发布的BERT模型,在机器阅读理解顶级水平测试SQuAD1.1中表现出惊人的成绩:全部两个衡量指标上全面超越人类!并且还在11种不同NLP测试中创...

    新智元
  • BERT and it's family

    预训练语言模型的缩写大多是芝麻街的人物。这显然是起名艺术大师们的有意为之。他们甚至都可以抛弃用首字母缩写的原则去硬凑出芝麻街人名

    mathor
  • 从BERT、XLNet到MPNet,细看NLP预训练模型发展变迁史

    来自 | 知乎 地址 | https://zhuanlan.zhihu.com/p/146325984

    朴素人工智能
  • NLP-BERT 谷歌自然语言处理模型:BERT-基于pytorch

    从现在的大趋势来看,使用某种模型预训练一个语言模型看起来是一种比较靠谱的方法。从之前AI2的 ELMo,到 OpenAI的fine-tune transfor...

    机器学习AI算法工程
  • NLP-BERT 谷歌自然语言处理模型:BERT-基于pytorch

    Author-作者 Junseong Kim, Scatter Lab License-协议 This project following Apache 2...

    用户2188327

扫码关注云+社区

领取腾讯云代金券