论文阅读【4】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

1.概述

1.1 论文相关

这篇是经典论文,是一个自然语言划时代的工作,工作相关就不介绍了,我是为了加深自己的印象,所以重温这篇论文。

1.2 动机

目前的技术限制了预训练表示的能力,特别是对于微调方法。主要的限制是标准语言模型是单向的,这限制了在训练前可以使用的体系结构的选择。而作者改进了基于微调的方法,提出BERT:双向编码器表示。BERT通过使用“掩蔽语言模型”(MLM)的训练前目标,减轻了前面提到的单向性约束。
这篇论文的贡献:

  • 我们描述了双向预训练对语言表征的影响的重要性。与Radford等人(2018)使用单向语言模型进行预训练不同,BERT使用掩蔽语言模型来实现预训练的深度双向表示。
  • 我们展示了预先训练的表示减少了对许多精心设计的任务特定架构的需求。BERT是第一个基于微调的表示模型,它在大型句子级和标记级任务上实现了最先进的性能,性能优于许多特定于任务的架构。

1.3 学习本论文的目的

  • 他是如何进行微调的?
  • 他是如何进行双向编码的?
  • 他是如何进行mask掩码的?
  • 他的输入有哪些?
  • 他的输出有哪些?

2.算法

我将介绍Bert模型的详细实施过程,在我们的框架中有两个步骤:预训练(pre-training)和微调(fine-tuning)。在预训练过程中,该模型在不同的预训练任务上对未标记的数据进行训练。为了进行微调,首先用预先训练好的参数初始化BERT模型,并且所有的参数都使用来自下游任务的标记数据进行了微调,每个下游任务都有单独的微调模型,如下图的问答任务的示例。
论文阅读【4】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding_第1张图片
图1:BERT的整体预训练和微调程序,部分来自输出层,在预训练和微调中使用相同的架构。相同的预训练模型参数用于初始化不同的下游任务的模型。在微调期间,所有参数都会进行微调。[CLS]是添加在每个输入示例前面的一个特殊符号,而[SEP]是一个特殊的分隔符标记(例如,分隔问题/答案)
BERT的一个显著特点是它跨不同任务的统一架构。预训练好的体系结构和最终的下游体系结构之间的差别很小。

3.1 模型结构

BERT的模型架构是一个多层双向transformer编码器,基于Vaswani等人(2017)中描述的原始实现,并公布在tensor2tensor图书馆。因为transformer的使用已经变得很普遍,而且我们的实现几乎与原来的完全相同,我们将省略对模型体系结构的详尽的背景描述。(可以参考Vaswani et al. (2017)的The Annotated Transformer ,搜索另外一个名字Attention is All You Need)。
在这项工作中,我们将层数(即变transformer块)表示为L,隐藏大小为H,self-attention头的数量为A,我们主要报告两种模型尺寸的结果:
B E R T B A S E BERT_{BASE} BERTBASE(L=12,H=768,A=8,Total Parameters=110M)
B E R T L A R G E BERT_{LARGE} BERTLARGE(L=24,H=1024,A=16,Total Parameters=340M)
为了比较,选择BERTBASE具有与OpenAI GPT相同的模型大小。然而,重要的是,BERT transformer使用双向的self-attention,而GPT transformer使用受限的self-attention,其中每个token只能关注其左侧的上下文。

3.2 输入和输出表示

为了使BERT处理各种下游任务,我们的输入表示能够在一个标记序列中明确地表示单个句子和一对句子(e.g.,),在整个工作过程中,一个“句子”可以是一个连续文本的任意跨度,而不是一个实际的语言句子。一个“序列”是指对BERT的输入token序列,它可以是一句话或两个句子打包在一起。
我们使用WordPiece Embeddings(Wu et al.,2016),其中包含30,000个标志性词汇表。每个序列的第一个标记总是是一个特殊的分类标记([CLS])。与该标记对应的最终隐藏状态被用作分类任务的聚合序列表示。句子对被打包成一个单一的序列。我们用两种方式来区分这些句子。首先,我们用一个特殊的标记([SEP])将它们分开。其次,我们在每个标记中添加一个学习Embedding,表明它是属于句子A还是句子B。如图1所示,我们将输入嵌入表示为E,特殊token[CLS]的最终隐藏向量为C∈ R H R^H RH,而第i个输入token的最终隐藏向量为 T i T_i Ti R H R^H RH
对于一个给定的token,它的输入表示是通过对相应的corresponding token,segment, and position embeddings,这种结构的可视化情况如图2所示。
论文阅读【4】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding_第2张图片
图2:BERT的输入表示,输入的Embedding 是token embedding,segmentation embeddings和 position embeddings的总和。
说人话,这段话的意思就是Bert模型的输入是由token embedding,segment embedding,position embedding三个部分组成,一个分词过的文本可以是由一句话或者两句话构成,其中都是用[CLS]开头,用[SEP]分隔和结尾。然后转换成token embedding,segment embedding,position embedding。
token embedding:就是这一段文本中的每个分词在字典中的编号。
segment embedding:使用0和1表示的序列,第一句话用1表示他的位置,第二句话用0表示他的位置。
position embedding:全部用0表示,表示这个序列的位置。
NSP任务(文本相似度任务)与Jernite等人使用的表征学习目标密切相关。然而,在之前的工作中,只有sentence embedding才会被转移到下游任务中,其中,BERT转移所有参数来初始化结束任务模型参数。

3.3 预训练数据

训练前程序在很大程度上遵循现有的语言模型文献。对于训练前的语料库,我们使用BooksCor语料库(800M words)和英语维基百科语料库。对于维基百科,我们只提取文本段落,而忽略列表、表和标题。为了提取长连续的序列,使用文档级语料库,而不是像十亿Word基准(Chelba等人,2013)是至关重要的。

3.4 微调BERT

微调是简单的,因为transformer中的自注意机制允许BERT通过适当的输入和输出,建模许多下游任务,无论它们是涉及单个文本对还是涉及文本对。对于涉及文本对的应用程序,一个常见的模式是在应用双向交叉注意之前独立地对文本对进行编码,如Parikh等人(2016);Seo等人(2017)。BERT反而使用了自我注意机制来统一这两个阶段,有效地编码具有自我注意的连续文本,对包括两个句子之间的双向交叉attention。
对于每个任务,我们只需将特定于任务的输入和输出插入到BERT中,并端到端微调所有参数。在输入时,预训练中的句子A和句子B类似于
(1)释义中的句子对
(2)隐含中的假设-前提对
(3)问题回答中的问题-段落对
(4)文本分类或序列标记中的退化文本-∅对
在输出处,token文本表示被输入到一个针对token级别任务的输出层中,而[CLS]表示法被输入到一个输出层中以进行分类,比如暗示或情绪分析。
与预训练前相比,微调相对便宜点。
本文中的所有结果都可以在单个云TPU上最多1小时内复制,或者在GPU上跑几个小时,从完全相同的预训练模型开始。

你可能感兴趣的:(论文阅读笔记,bert,人工智能,深度学习)