谷歌的BERT模型被认为是NLP新时代的开始,NLP终于找到了像计算机视觉一样转移学习的方法。在这篇文章中,BERT和ELMo模型被生动而容易地说明。

2018年已经成为自然语言处理机器学习模式的转折点。我们对如何以最能抓住潜在意义和关系的方式准确表达单词和句子的理解正在迅速发展。

此外,NLP社区开发了一些非常强大的组件,您可以免费下载并在自己的模型和管道中使用。

ULM-FiT和饼干怪兽没关系,但是我想不出别的...

最新的里程碑是BERT的发布,它被描述为NLP新时代的开始。BERT是一个NLP模型,它在几个语言处理任务中打破了记录。在描述模型的论文发表后不久,该团队还公开了模型的源代码,并提供了在大量数据集上预先训练的下载版本。

这是一个很大的进步,因为任何需要构建语言处理模型的人,都可以将这个强大的预训练模型作为现成的组件,从而节省从头开始训练模型所需的时间、精力、知识和资源。

图示的两个步骤展示了BERT的工作原理。您可以在步骤1中下载预先训练好的模型,然后在步骤2中对其进行微调。

BERT是基于最近在NLP领域出现的许多智能方法,包括但不限于半监督序列学习、ElMo、乌尔姆菲特提出)、OpenAI变压器和变压器。

为了正确理解BERT是什么,我们需要理解一些概念。我们先来看看如何使用BERT,再来看看模型本身涉及的概念。

例子:句子分类

使用BERT最直接的方法是用它来对单个文本进行分类。这个模型是这样的:

训练这样一个模型,需要训练分类器,在训练阶段BERT模型的变化很小。这个训练过程叫做微调,有半监督序列学习和ULMFiT的根源。

具体来说,因为我们说的是分类器,所以属于机器学习的监督学习范畴。这意味着我们需要一个有标签的数据集来训练模型。例如,对于垃圾邮件分类器,标签数据集是电子邮件及其标签的列表。

模型架构

现在您已经有了一个如何使用BERT的用例示例,让我们了解更多关于它是如何工作的。

本文提供了两种尺寸的BERT模型:

BERT BASE - 大小与OpenAI Transformer相当BERT LARGE - 一个非常庞大的模型,实现了最先进的结果

伯特基本上是一个训练有素的变压器编码器堆栈。变压器模型是BERT的一个基本概念,后面会讲到。

两种BERT型号都有大量的编码器层——原纸——基础版12层,大版24层。它们还具有比初始论文中变压器的默认配置更大的前馈网络和关注头。

模型输入

第一个输入令牌是一个特殊的令牌,其中CLS代表分类。

像transformer的普通编码器一样,BERT以一串单词作为输入。每层应用自关注,并通过前馈网络传输其结果,然后将结果传输给下一个编码器。

在架构方面,到目前为止,这和Transformer一模一样。在输出端,我们开始看到两者的区别。

模型输出

每个位置输出一个大小为隐藏大小的向量。对于上面看到的句子分类例子,我们只关注第一个位置的输出。

这个向量可以作为我们选择的分类器的输入。本文采用单层神经网络作为分类器,取得了良好的分类效果。

如果你的标签比较多,只需要调整分类器网络,使其有更多的输出神经元,然后通过softmax即可。

与卷积网络的相似之处

对于有计算机视觉背景的人来说,这种矢量传输方式很容易让人联想到网络的卷积部分如VGGNet和网络末端完全连通的分类部分之间的事情。

嵌入的新时代

这些新的发展带来了词汇编码方法的新变化。词汇嵌入一直是领先的自然语言处理模型处理语言的主要能力。Word2Vec、手套等方法已广泛应用于此类任务。先来复习怎么用。

词汇嵌入研究综述

对于由机器学习模型处理的单词,它们需要以某种数字形式表示,以便模型可以用于它们的计算。Word2Vec表示我们可以使用一个向量以一种捕捉语义或意义关系以及语法或语法关系的方式来恰当地表示单词。

研究人员很快发现,使用大量文本数据进行预训练嵌入是一个好主意,而不是用小数据集的模型进行训练。所以通过使用Word2Vec或者GloVe进行预训练,可以下载单词列表及其嵌入。下图是单词“stick”的手套嵌入示例

手套嵌入“棒”字

因为这些向量很大,并且有许多数字,所以本文后面用下面的基本图来表示这些向量:

环境很重要

如果我们使用手套,单词“棒”将由这个向量表示,而不考虑上下文。许多研究人员发现有些不对劲。“棒”有许多含义,这取决于它的上下文。那么,为什么不根据它的上下文来嵌入呢——捕捉单词在这个上下文中的意思和其他上下文信息呢?因此,语境化的词嵌入出现了。

语境化的单词嵌入可以根据单词在句子语境中的不同意义给出不同的表征

ELMo没有对每个单词使用固定嵌入,而是在给每个单词分配嵌入之前查看整个句子。它使用双向LSTM为特定任务创建嵌入。

ELMo为NLP的预培训提供了重要的一步。埃尔莫·LSTM在一个大数据集上训练,然后我们可以把它作为我们正在处理的语言的其他模型中的一个组件。

ELMo的秘密是什么?

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

ELMo预培训的一个步骤

我们可以看到,每一个扩展的LSTM台阶的隐藏状态都从ELMo的后脑勺突出来。这些将在预训练后的嵌入过程中有用。

ELMo实际上走得更远,训练双向LSTM,因此它的语言模型不仅考虑下一个单词,还考虑前一个单词。

ELMo通过某种方式结合隐藏状态提出了语境化的单词嵌入。

乌尔姆-费特:自然语言处理中的迁移学习

ULM-FiT引入了一些方法来有效地利用模型在预训练中学习到的知识——不仅是嵌入,还有上下文化嵌入。ULM-FiT提出了一个语言模型和一个过程来为各种任务有效地优化语言模型。

NLP终于找到了像计算机视觉一样转移学习的方法。

变形金刚:超越LSTM

《变形金刚》的论文和代码的发布,以及在机器翻译等任务上的成就,让业内一些人认为《变形金刚》是LSTM的替代品。而且,变形金刚比LSTM更擅长处理长期的性便利。

变压器的编解码结构,非常适合机器翻译。但是怎么用它来给句子分类呢?如何使用它来预训练可以针对其他任务进行微调的语言模型。

OpenAI变压器:用于语言建模的预训练变压器解码器

事实证明,我们不需要一个完整的Transformer来采用迁移学习,也不需要一个针对NLP任务的微调语言模型。我们需要的只是变形金刚的解码器。解码器是一个很好的选择,因为它是语言建模的首选,因为它是为了屏蔽未来的令牌而构建的——这是逐字生成翻译时的一个有用功能。

OpenAI变压器由变压器的解码器堆栈组成

该模型堆叠了12个解码器层。由于此设置中没有编码器,这些解码器层将不会有普通转换器解码器层的编码器-解码器关注子层。但是,它还是有自我关注层的。

通过这种结构,我们可以继续在同一语言建模任务上训练模型:使用大量数据集来预测下一个单词。但是,我们可以把7000本书的课文扔给它,让它学习!书籍非常适合这样的任务,因为它们允许模型学习相关的信息,即使被大量的文本隔开——如果你用Twitter或者文章进行训练,你是得不到这些信息的。

OpenAI Transformer用7000本书组成的数据集进行训练,预测下一个单词。

将学习转移到下游任务

现在OpenAI transformer已经过预训练,并且它的层已经被调整为合理地处理语言,我们可以开始将它用于下游任务。让我们来看看句子分类:

如何使用预先训练好的OpenAI转换器进行句子切分

OpenAI论文概述了一些用于处理不同类型任务输入的输入转换。下图描述了模型的结构和执行不同任务的输入转换。

这不是很聪明吗?

伯特:从解码器到编码器

OpenAI Transformer为我们提供了一个基于Transformer的微调预训练模型。但是在从LSTM到变形金刚的转变过程中,有些东西是缺失的。ELMo的语言模型是双向的,而OpenAI Transformer只训练一个正向的语言模型。能否建立一个基于transformer的模型,其语言模型同时考虑了前向和后向?

BERT聪明的语言建模任务涵盖了输入中15%的单词,并要求模型预测丢失的单词。

找一个合适的任务来训练Transformer的编码器栈并不容易。BERT采用了“掩蔽语言模型”的概念来解决这个问题。

除了覆盖15%的输入,BERT还添加了一些东西来改进模型的后期微调。有时它会随机地用一个单词替换另一个单词,并要求模型在那个位置预测正确的单词。

两句话任务

如果你回顾一下OpenAI transformer在处理不同任务时所做的输入转换,你会注意到有些任务需要模型说出两句话的一些信息

为了让BERT更好的处理多个句子之间的关系,在预训练过程中增加了一个额外的任务:给定两个句子,B可能是A后的句子,也可能是A前的句子?

BERT预训练的第二个任务是两句话的分类任务。

特定任务的模型

BERT的论文展示了许多在不同任务中使用BERT的方法。

伯特用于特征提取

微调方法不是使用BERT的唯一方法。就像ELMo一样,你可以使用预先训练好的BERT来创建上下文化的单词嵌入。然后,您可以将这些嵌入提供给现有的模型——本文已经证明,这个过程的结果与在名称-实体识别等任务中微调BERT的结果相差不远。

哪个向量最适合语境化嵌入?我觉得要看任务。本文检查了六个选项:

结论

尝试BERT的最好方法是使用Google Colab上托管的云TPUs笔记本的BERT FineTuning。如果您以前从未使用过云TPU,尝试使用它们也是一个很好的起点。伯特码也适用于TPU,CPU,GPU。

下一步是查看BERT回购中的代码:

该模型是在modeling.py(BertModel类)中构建的,与原始Transformer编码器完全相同。run_classifier.py是fine-tuning过程的一个示例。它还构建了监督模型的分类层。如果要构建自己的分类器,请查看文件中的create_model 方法。有几个预训练模型可供下载。包括BERT Base和BERT Large,以及英语,中文等语言的单语言模型,以及涵盖102种语言的多语言模型,这些语言在维基百科上训练。BERT不是将单词看作token。相反,它关注的是词块。tokennization.py 是将单词转换成适合BERT的WordPieces的工具。

BERT也有PyTorch实现。AllenNLP库使用这个实现来允许BERT嵌入到任何模型中。

原文:

https://jalammar.github.io/illustrated-bert/

1.《elmo 图解2018年领先的两大NLP模型:BERT和ELMo》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《elmo 图解2018年领先的两大NLP模型:BERT和ELMo》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/junshi/1796592.html