2018年是自然理的折点,能捕捉潜在意和关系的方式表达单词和句子的概念性理解正在迅速展。此外,NLP社区已出现了非常大的件,你可以在自己的模型和管道中自由下和使用(它被称NLPImageNet时刻

faad6b01b25433da58823f104fb1268518dd1247

个时刻中最新里程碑是发布BERT,它被描述NLP一个新代的开始。BERT是一个模型,它打破了前几个模型理基于言的任记录模型的布后不久,团队还开放了模型的代,并提供了已在大量数据集上训练过的模型的下版本。这是一个重大的发展,因为它使任何人都可以构建一个涉及语言处理的机器学习模型,他们成功的将这个强大的工具变成了一个易于使用的组件,从而节省了训练NLP模型所需的时间,精力和资源

c8f2c40913d90579c22f512d868e43944ec9187f

两种不同的BERT。你可以下1预训练的模型(它是在未注的数据上训练),在2中是针对特殊场景行微

BERT是建立在最近NLP社区中涌现的一些聪明的想法之上,包括但不限于半监督序列学习Andrew DaiQuoc LeELMo(由Matthew Peters和来自AI2研究人员和UW CSEULMFiT(由fast.ai创始人Jeremy HowardSebastian Ruder提供OpenAI转换器(由OpenAI研究人员RadfordNarasimhanSalimansSutskever提供和TransformerVaswani等人

需要注意的一些概念才能完全了解BERT的内容。因此,让我们首先看一下在查看模型本身所涉及的概念之前可以使用BERT的场景。

示例:句子分

BERT最擅长的是分类单个文本,这个模型看起来像这样:

136788c31e39781229092840086204d035a01271

为了训练这样的模型,你必须训练分类器,在训练阶段BERT模型发生的变化很小。该过程称为微调,并且整个过程是源于半监督序列学习和ULMFiT。

既然我们在讨论分类器,那么我们就处于机器学习的监督学习领域。这意味着我们需要一个标记的数据集来训练这样的模型。以垃圾邮件分类器示例,标记的数据集将是电子邮件和标签的列表(“垃圾邮件”或“非垃圾邮件”)。

530e4ea80071f08a89e6cd9b081bc9a9aae7ea62

这种用例的其他示例包括:

1、情分析

输入:电影/产品评论。输出:评论是正面还是负面

示例数据集:SST

2、事实查证

输入:句子。输出:不索

更夸张/前沿的例子:

输入:是否进行索赔。输出:

Full Fact是一个公众利益建立自实检查工具的组织。他的部分管道其实是一个分器,它可以取新文章并检测声明(将文本分类为声明不声明),以此行事实验证

模型架构

现在你已经了解了如何使用BERT的用例,接下来让我们仔细看看它是如何工作的。

bd984b7110a803d75779f6942bafd14e341358c5

首先介绍BERT的两种型号:

l   BERT BASEOpenAI Transformer的尺寸相当,性价比很高;

l   BERT LARGE一个非常大的模型,它的性能最好;

BERT基本上是训练有素的转换器(Transformer)编码器堆栈。现在是你阅读The Illustrated Transformer的好时机,该文章解释了Transformer模型-BERT的基本概念以及我们接下来要讨论的概念。

6ca64b7b987698706c3ed950970529dda8dce263

两种BERT模型都有大量的编码器层(本文称之为Transformer Blocks),其中Base版本为12个,Large版本为24个。它们还具有更大的前馈网络(分别为768和1024个隐藏单元)以及比初始论文中的转换器更多attention heads(分别为12和16)(初始论文的转换器中有6个编码器层,512个隐藏单元,和8个attention heads)。

模型

fdbe2396db736095cd117f2248491e61da9aca42

第一个接口输入提供了一个特殊的接口[CLS],原因将在后面变得明显,CLS在这里代表分类。

就像转换器的香草编码器一样,BERT采用一系列字作为输入。每一层都应用自我关注,并通过前馈网络传递其结果,然后将其交给下一个编码器。

e5cc98c291b8530c617aa72e1cbf1c43d0b81082

在架构方面,到目前为止,这与转换器完全相同。

模型

每个位置输出大小为hidden_size的矢量(BERT Base中的768)。对于我们上面看过的句子分类示例,我们只关注第一个位置的输出(我们将特殊的接口[CLS]标记传递到)。

faa7dfaa1a2037fbdd8a6a1962e5e29e54665f50

该向量现在可以用作我们选择的分类器的输入,通使用单层器,这样效果就能达到我们想要的。

23f46aff3c7e1669210bf440d8b27ae80b91a310

如果你有更多标签(例如,如果你是使用“垃圾邮件”,“非垃圾邮件”,“社交”和“促销”标记电子邮件),你只需调整分类器网络以获得更多输出神经元即可,然后通过softmax。

网相似操作

对于那些具有计算机视觉背景的人来说,这个矢量切换应该让人联想到VGGNet等网络的卷积部分与网络末端的完全连接的分类部分之间发生的事情。

fcf2824a3df1563bcb67f5d014e9471ac26c8d2a

嵌入(Embedding)的新

到目前为止,词嵌入一直是影响NLP模型处理语言的主要力量。Word2Vec和Glove等方法已被广泛用于此类任务。让我们回顾一下之前是如何使用它们的。

Word嵌入是个啥?

对于要由机器学习模型处理的词,它们需要以某种形式的数字表示,这样模型才可以在计算中使用。Word2Vec让我们可以使用一个向量(一个数字列表)以一种捕获语义相关关系的方式正确表示单词(例如,判断单词是相似的,判断还是在它们之间具有的关系,如“开罗”和“埃及”之间的关系)以及句法或基于语法的关系(例如“was”和“is”之间的关系)。

该领域的研究者很快意识到,使用经过大量文本数据预训练的嵌入技术,而不将模型与经常是小型数据集的模型一起训练,这是一个好主意。因此,你可以下载Word2Vec或GloVe预训练生成的单词列表及其嵌入。

a98a67451dd51a62946c719b76926311fb27ccd7

GloVe词嵌入中“stick”-200个浮点数的向量。 

ELMo问题

如果我们使用GloVe,那么“stick”这个词将由一个向量表示,无论上下文是什么。但是,许多NLP研究人员Peters等人,2017McCann等人,2017Peters等人,2018年在ELMo论文中发现“stick”有多个含义,这取决于它的使用位置。为什么不根据它所使用的上下文给它一个嵌入呢?这样既捕获该上下文中的单词含义以及其他上下文信息。因此,语境化嵌入词诞生了!

993979c46588f781b7bb587689ab223ad57daf65

语境化词嵌入可以根据它们在句子的上下文中携带的含义给出单词不同的嵌入

ELMo不是对每个单词使用固定嵌入,而是在为其中的每个单词分配嵌入之前查看整个句子,它使用在特定任务上训练的双向LSTM来创建这些嵌入。

5f7909f4ba7f1bb66cb27c35092f99d76a59325d

ELMo在NLP背景下向预训练迈出了重要一步。ELMo LSTM将使用我们数据集语言中的大量数据集进行训练,然后我们可以将其用作需要处理语言的其他模型中的组件。

ELMo的秘密是什么?

ELMo通过训练来预测单词序列中的下一个单词,这是一项称为获得语言理解语言建模的任务。这很方便,因为我们拥有大量的文本数据,这样的模型可以在不需要标签的情况下学习。

327fc8ef06454641904d1debf95d4b4968c2ff43

ELMo预训练过程中的一个过程:给定输入,预测下一个最可能的单词。在hang单词出现之后,它将为诸“out”单词赋予比camera更高的概率。

我们可以看到每个展开的LSTM步骤的隐藏状态都是从ELMo的头部后面突出。在完成预训练之后,这些在嵌入式proecss可以派上用场。

ELMo实际上更进一步,因为双向LSTM,这意味着它的语言模型不仅具有下一个词的感觉,而且还有前一个词。

f418ded20e6c3538e1e5339c9c082bae87c5aeae

ELMo以某种方式将藏状(和初始嵌入)合在一起来提出情境化嵌入(接后加求和)。

3b15fb77f213fe7c24180ff6984b02f2b5c65e50

ULM-FiT:在NLP中使用迁移

ULM-FiT引入了有效利用模型在预训练期间学到的内容的方法,这不仅仅是嵌入,而且是上下文嵌入。ULM-FiT引入了语言模型和流程,从而有效地微调该语言模型以执行各种任务。

NLP可能与计算机视觉一样,有了一种方法来进行转移学习。

The Transformer:超越LSTMs

Transformer论文和代码的发布,以及它在机器翻译等任务上取得的成果开始让一些人认为它们是LSTM的替代品。事实上Transformer比LSTM更好地处理长期依赖性。

Transformer的编码器-解码器结构使其非常适合机器翻译。但是你如何将它用于句子分类?你如何使用它来预训练可以针对其他任务进行微调的语言模型(这些任务就是被该领域称为使用预训练模型或组件的监督学习任务)。

OpenAI Transformer预训练用于言建模的Transformer

事实证明,我们不需要整个Transformer来为NLP任务采用转移学习和精细可调语言模型,我们可以只使用Transformer的解码器。解码器是一个很好的选择,因为它是语言建模(预测下一个单词)的必备选择,它是为掩盖未来的接口而构建的。

ff2cf8bba2537fe936dfffbf3851c6076f11206f

OpenAI TransformerTransformer的解器堆栈组

该模型堆叠了十二个解码器层。由于在该设置中没有编码器,因此这些解码器层将不具有香草Transformer解码器层具有的编码器。然而,它仍然会有自我关注层。

通过这种结构,我们可以继续在同一语言建模任务上训练模型:使用大量(未标记)数据集预测下一个单词。只是使用7000本书的文字,让它学习!书籍非常适合这类任务,因为它允许模型学习关联相关信息,即使它们被大量文本分开。例如,当你使用推文或文章进行训练时,你无法获得这些信息。

608aa1f721550e46d70bf02632a86da1541f20aa

现在,OpenAI Transformer好接受训练,预测7,000书组成的数据集上的下一个单词

将学习能力转移到下游任

既然OpenAI Transformer已经过预先训练,并且其层也经过调整以合理地处理语言,我们就可以开始将它用于下游任务。让我们首先看一下句子分类(将电子邮件分类为“垃圾邮件”或“非垃圾邮件”):

233fe956974bd220a85d4f41eb2309881cef0271

如何使用训练OpenAI Transformer进行句子分类

OpenAI论文概述了许多输入转换,以处理不同类型任务的输入。下图显示了模型的结构和输入转换,以执行不同的任务。

eca6ac4240c49690d7e012c6d4a14c34874462ea

BERT:从解器到编码

openAI的Transformer为我们提供了基于Transformer的可调预训练模型。但是从LSTM到Transformer的过渡中缺少了一些东西,因为ELMo的语言模型是双向的,但openAI的Transformer只训练向前语言模型。我们能否建立一个基于Transformer的模型,其语言模型同时向前和向后?

蒙面言模型(NLM:Masked Language Model)

我们将使用Transformer编码器”,BERT说。

这很疯狂”,Ernie回答说,“每个人都知道双向调节会让每个词在多层次的背景下间接地审视自己。”

我们将使用蒙面工具”,BERT自信地说。

18e98c1f620a89a947e8188c6fab520041e36387

BERT言建模任掩盖了入中15%的单词,并要求模型预测缺失的单词

找到正确的任务来训练Transformer堆栈的编码器是一个复杂的障碍,BERT通过采用早期文献中的“蒙面语言模型”概念(称为完成任务)来解决。

除了掩盖15%的输入之外,BERT还混合了一些东西,以改善模型后来如何微调。有时它会随机用另一个单词替换一个单词,并要求模型预测该位置的正确单词。

两个句子的任务(Two-sentence Tasks)

如果你回顾一下OpenAI的Transformer处理不同任务的输入变换,你会注意到一些任务要求模型具有说出两个句子的能力(例如,它们是否只是对方的复述?给出一个维基百科条目作为输入,以及关于该条目作为另一个输入的问题。)。

为了使BERT更好地处理多个句子之间的关系,预训练过程包括一个额外的任务:给定两个句子(A和B),B可能是跟随A的句子,或不是?

8b9efe3e03f5e60367b4119638a784e412a4c6d7

由于BERT实际上使用WordPieces接口而不是单词,因此标记化在此形中化了因此有些单词被分解为较小的

 

特定任-模型

BERT论文展示了将BERT用于不同任务的多种方法。

8ad75723698d811e804aca36826b3cb72069013e

BERT用于特征提取

微调不是使用BERT的唯一方法。就像ELMo一样,你可以使用预先训练的BERT来创建语境化词嵌入。然后,你可以将这些嵌入提供给现有模型-该过程论文已经证实可以产生结果,在命名实体识别等任务上应用微调BERT并不远。

c00894929b2f7d7db1a41b8c9dd881dc70f6384a

哪个向量最适合作上下文嵌入?我认为这取决于任。我们考察了六种选择(与微模型相比,得分96.4):

792c50ae51f2603d524a3d9a227c029861069882

BERT延伸

使用BERT的最佳方式是通过BERT FineTuningGoogle Colab托管的Cloud TPU笔记本。如果你之前从未使用过云TPU,那么这也是尝试它们的良好起点,以及BERT代码也适用于TPU,CPU和GPU。

下一步是查看BERT仓库中的代码:

l   该模型在modeling.pyclass BertModel)中构建,与vanilla Transformer编码器完全相同

l   run_classifier.py是微调过程的一个示例。它还构建了监督模型的分类层,如果要构建自己的分类器,请查看create_model()该文件中的方法。

l   可以下载几种预先训练的模型,它们跨越了BERT Base和BERT Large,以及英语,中文等语言,以及涵盖102种语言的多语言模型,这些语言在维基百科上进行了训练。

l   BERT不会将单词视为标记,相反,它注意者WordPiecestokenization.py是将你的单词转换为适合BERTwordPieces标记器。


l   你还可以查看BERTPyTorch实现。该AllenNLP库使用此实现允许使用的嵌入BERT与任何模型。


文章原标题《The Illustrated BERT, ELMo, and co. (How NLP Cracked Transfer Learning)

作者:Jay Alammar 译者:虎说八道,审校:。