摘要:图解,2018 年自然语言处理领域最成功的方向!
2018 年是自然语言处理的转折点,能捕捉潜在意义和关系的方式表达单词和句子的概念性理解正在迅速发展。此外,NLP 社区已经出现了非常强大的组件,你可以在自己的模型和管道中自由下载和使用(它被称为 NLP 的 ImageNet 时刻)。
在这个时刻中,最新里程碑是发布的 BERT,它被描述 NLP 一个新时代的开始。BERT 是一个模型,它打破了前几个模型处理基于语言的任务的记录。该模型的论文发布后不久,团队还开放了该模型的代码,并提供了已经在大量数据集上预先训练过的模型的下载版本。这是一个重大的发展,因为它使任何人都可以构建一个涉及语言处理的机器学习模型,他们成功的将这个强大的工具变成了一个易于使用的组件,从而节省了训练 NLP 模型所需的时间,精力和资源。
BERT 是建立在最近 NLP 社区中涌现的一些聪明的想法之上,包括但不限于半监督序列学习(Andrew Dai 和 Quoc Le)、<u style=”box-sizing: border-box;”>ELMo</u>(由 Matthew Peters 和来自 AI2 的研究人员和 UW CSE),ULMFiT(由 fast.ai 创始人 Jeremy Howard 和 Sebastian Ruder 提供)和 OpenAI 转换器(由 OpenAI 研究人员 Radford,Narasimhan,Salimans 和 Sutskever 提供)和 Transformer(Vaswani 等人)。
需要注意的一些概念才能完全了解 BERT 的内容。因此,让我们首先看一下在查看模型本身所涉及的概念之前可以使用 BERT 的场景。
示例:句子分类
BERT 最擅长的是分类单个文本,这个模型看起来像这样:
为了训练这样的模型,你必须训练分类器,在训练阶段 BERT 模型发生的变化很小。该过程称为微调,并且整个过程是源于半监督序列学习和 ULMFiT。
既然我们在讨论分类器,那么我们就处于机器学习的监督学习领域。这意味着我们需要一个标记的数据集来训练这样的模型。以垃圾邮件分类器示例,标记的数据集将是电子邮件和标签的列表(“垃圾邮件”或“非垃圾邮件”)。
这种用例的其他示例包括:
1、情绪分析
输入:电影 / 产品评论。输出:评论是正面还是负面?
示例数据集:SST
2、事实查证
输入:句子。输出:“索赔”或“不索赔”
更夸张 / 前沿的例子:
输入:是否进行索赔。输出:“真”或“假”
Full Fact 是一个为公众利益建立自动事实检查工具的组织。他们的部分管道其实是一个分类器,它可以读取新闻文章并检测声明(将文本分类为“声明”或“不声明”),以此进行事实验证。
模型架构
现在你已经了解了如何使用 BERT 的用例,接下来让我们仔细看看它是如何工作的。
首先介绍 BERT 的两种型号:
l BERT BASE:与 OpenAI Transformer 的尺寸相当,性价比很高;
l BERT LARGE:一个非常庞大的模型,它的性能最好;
BERT 基本上是训练有素的转换器(Transformer)编码器堆栈。现在是你阅读 The Illustrated Transformer 的好时机,该文章解释了 Transformer 模型 -BERT 的基本概念以及我们接下来要讨论的概念。
两种 BERT 模型都有大量的编码器层(本文称之为 Transformer Blocks),其中 Base 版本为 12 个,Large 版本为 24 个。它们还具有更大的前馈网络(分别为 768 和 1024 个隐藏单元)以及比初始论文中的转换器更多 attention heads(分别为 12 和 16)(初始论文的转换器中有 6 个编码器层,512 个隐藏单元,和 8 个 attention heads)。
模型输入
第一个接口输入提供了一个特殊的接口[CLS],原因将在后面变得明显,CLS 在这里代表分类。
就像转换器的香草编码器一样,BERT 采用一系列字作为输入。每一层都应用自我关注,并通过前馈网络传递其结果,然后将其交给下一个编码器。
在架构方面,到目前为止,这与转换器完全相同。
模型输出
每个位置输出大小为 hidden_size 的矢量(BERT Base 中的 768)。对于我们上面看过的句子分类示例,我们只关注第一个位置的输出(我们将特殊的接口 [CLS] 标记传递到)。
该向量现在可以用作我们选择的分类器的输入,通过使用单层神经网络作为分类器,这样效果就能达到我们想要的。
如果你有更多标签(例如,如果你是使用“垃圾邮件”,“非垃圾邮件”,“社交”和“促销”标记电子邮件),你只需调整分类器网络以获得更多输出神经元即可,然后通过 softmax。
卷积网相似操作
对于那些具有计算机视觉背景的人来说,这个矢量切换应该让人联想到 VGGNet 等网络的卷积部分与网络末端的完全连接的分类部分之间发生的事情。
嵌入(Embedding)的新时代
到目前为止,词嵌入一直是影响 NLP 模型处理语言的主要力量。Word2Vec 和 Glove 等方法已被广泛用于此类任务。让我们回顾一下之前是如何使用它们的。
Word 嵌入是个啥?
对于要由机器学习模型处理的词,它们需要以某种形式的数字表示,这样模型才可以在计算中使用。Word2Vec 让我们可以使用一个向量(一个数字列表)以一种捕获语义相关关系的方式正确表示单词(例如,判断单词是相似的,判断还是在它们之间具有的关系,如“开罗”和“埃及”之间的关系)以及句法或基于语法的关系(例如“was”和“is”之间的关系)。
该领域的研究者很快意识到,使用经过大量文本数据预训练的嵌入技术,而不将模型与经常是小型数据集的模型一起训练,这是一个好主意。因此,你可以下载 Word2Vec 或 GloVe 预训练生成的单词列表及其嵌入。
ELMo:语境问题
如果我们使用 GloVe,那么“stick”这个词将由一个向量表示,无论上下文是什么。但是,许多 NLP 研究人员(Peters 等人,2017 年,McCann 等人,2017 年及 Peters 等人,2018 年在 ELMo 论文中)发现“stick”有多个含义,这取决于它的使用位置。为什么不根据它所使用的上下文给它一个嵌入呢?这样既捕获该上下文中的单词含义以及其他上下文信息。因此,语境化嵌入词诞生了!
语境化词嵌入可以根据它们在句子的上下文中携带的含义给出单词不同的嵌入
ELMo 不是对每个单词使用固定嵌入,而是在为其中的每个单词分配嵌入之前查看整个句子,它使用在特定任务上训练的双向 LSTM 来创建这些嵌入。
ELMo 在 NLP 背景下向预训练迈出了重要一步。ELMo LSTM 将使用我们数据集语言中的大量数据集进行训练,然后我们可以将其用作需要处理语言的其他模型中的组件。
ELMo 的秘密是什么?
ELMo 通过训练来预测单词序列中的下一个单词,这是一项称为获得语言理解语言建模的任务。这很方便,因为我们拥有大量的文本数据,这样的模型可以在不需要标签的情况下学习。
我们可以看到每个展开的 LSTM 步骤的隐藏状态都是从 ELMo 的头部后面突出。在完成预训练之后,这些在嵌入式 proecss 可以派上用场。
ELMo 实际上更进一步,因为双向 LSTM,这意味着它的语言模型不仅具有下一个词的感觉,而且还有前一个词。
ELMo 通过以某种方式将隐藏状态(和初始嵌入)组合在一起来提出情境化嵌入(连接后加权求和)。
ULM-FiT:在 NLP 中使用迁移学习
ULM-FiT 引入了有效利用模型在预训练期间学到的内容的方法,这不仅仅是嵌入,而且是上下文嵌入。ULM-FiT 引入了语言模型和流程,从而有效地微调该语言模型以执行各种任务。
NLP 可能与计算机视觉一样, 有了一种方法来进行转移学习。
The Transformer:超越 LSTMs
Transformer 论文和代码的发布,以及它在机器翻译等任务上取得的成果开始让一些人认为它们是 LSTM 的替代品。事实上 Transformer 比 LSTM 更好地处理长期依赖性。
Transformer 的编码器 - 解码器结构使其非常适合机器翻译。但是你如何将它用于句子分类?你如何使用它来预训练可以针对其他任务进行微调的语言模型(这些任务就是被该领域称为使用预训练模型或组件的监督学习任务)。
OpenAI Transformer:预训练用于语言建模的 Transformer 解码器
事实证明,我们不需要整个 Transformer 来为 NLP 任务采用转移学习和精细可调语言模型,我们可以只使用 Transformer 的解码器。解码器是一个很好的选择,因为它是语言建模(预测下一个单词)的必备选择,它是为掩盖未来的接口而构建的。
该模型堆叠了十二个解码器层。由于在该设置中没有编码器,因此这些解码器层将不具有香草 Transformer 解码器层具有的编码器。然而,它仍然会有自我关注层。
通过这种结构,我们可以继续在同一语言建模任务上训练模型:使用大量(未标记)数据集预测下一个单词。只是使用 7000 本书的文字,让它学习!书籍非常适合这类任务,因为它允许模型学习关联相关信息,即使它们被大量文本分开。例如,当你使用推文或文章进行训练时,你无法获得这些信息。
现在,OpenAI Transformer 已经准备好接受训练,预测由 7,000 本书组成的数据集上的下一个单词。
将学习能力转移到下游任务
既然 OpenAI Transformer 已经过预先训练,并且其层也经过调整以合理地处理语言,我们就可以开始将它用于下游任务。让我们首先看一下句子分类(将电子邮件分类为“垃圾邮件”或“非垃圾邮件”):
OpenAI 论文概述了许多输入转换,以处理不同类型任务的输入。下图显示了模型的结构和输入转换,以执行不同的任务。
BERT:从解码器到编码器
openAI 的 Transformer 为我们提供了基于 Transformer 的可调预训练模型。但是从 LSTM 到 Transformer 的过渡中缺少了一些东西,因为 ELMo 的语言模型是双向的,但 openAI 的 Transformer 只训练向前语言模型。我们能否建立一个基于 Transformer 的模型,其语言模型同时向前和向后?
蒙面语言模型(NLM:Masked Language Model)
“我们将使用 Transformer 编码器”,BERT 说。
“这很疯狂”,Ernie 回答说,“每个人都知道双向调节会让每个词在多层次的背景下间接地审视自己。”
“我们将使用蒙面工具”,BERT 自信地说。
找到正确的任务来训练 Transformer 堆栈的编码器是一个复杂的障碍,BERT 通过采用早期文献中的“蒙面语言模型”概念(称为完成任务)来解决。
除了掩盖 15%的输入之外,BERT 还混合了一些东西,以改善模型后来如何微调。有时它会随机用另一个单词替换一个单词,并要求模型预测该位置的正确单词。
两个句子的任务(Two-sentence Tasks)
如果你回顾一下 OpenAI 的 Transformer 处理不同任务的输入变换,你会注意到一些任务要求模型具有说出两个句子的能力(例如,它们是否只是对方的复述?给出一个维基百科条目作为输入,以及关于该条目作为另一个输入的问题。)。
为了使 BERT 更好地处理多个句子之间的关系,预训练过程包括一个额外的任务:给定两个句子(A 和 B),B 可能是跟随 A 的句子,或不是?
特定任务 - 模型
BERT 论文展示了将 BERT 用于不同任务的多种方法。
BERT 用于特征提取
微调不是使用 BERT 的唯一方法。就像 ELMo 一样,你可以使用预先训练的 BERT 来创建语境化词嵌入。然后,你可以将这些嵌入提供给现有模型 - 该过程论文已经证实可以产生结果,在命名实体识别等任务上应用微调 BERT 并不远。
哪个向量最适合作为上下文嵌入?我认为这取决于任务。我们考察了六种选择(与微调模型相比,得分为 96.4):
BERT 延伸
使用 BERT 的最佳方式是通过 BERT FineTuning 与 Google Colab 托管的 Cloud TPU 笔记本。如果你之前从未使用过云 TPU,那么这也是尝试它们的良好起点,以及 BERT 代码也适用于 TPU,CPU 和 GPU。
下一步是查看 BERT 仓库中的代码:
l 该模型在 modeling.py(class BertModel)中构建,与 vanilla Transformer 编码器完全相同。
l run_classifier.py 是微调过程的一个示例。它还构建了监督模型的分类层,如果要构建自己的分类器,请查看 create_model()该文件中的方法。
l 可以下载几种预先训练的模型,它们跨越了 BERT Base 和 BERT Large,以及英语,中文等语言,以及涵盖 102 种语言的多语言模型,这些语言在维基百科上进行了训练。
l BERT 不会将单词视为标记,相反,它注意者 WordPieces。tokenization.py 是将你的单词转换为适合 BERT 的 wordPieces 的标记器。
l 你还可以查看 BERT 的 PyTorch 实现。该 AllenNLP 库使用此实现允许使用的嵌入 BERT 与任何模型。
本文作者:【方向】阅读原文
本文为云栖社区原创内容,未经允许不得转载。