BERT简述

本文从词嵌入出发,一步步介绍Bert出现的背景,故文章前一部分的介绍可能与Bert的相关性不强,但是必不可少。

1、词向量

       词向量一直是领先的NLP模型处理语言的主要能力。Word2Vec、Glove等方法已广泛应用于此类任务。让我们先回顾一下如何使用它们。

        对于要由机器学习模型处理的单词,它们需要以某种数字形式表示,以便模型可以在其计算中使用。Word2Vec表明我们可以用一个向量(一个数字列表)以捕捉语义关系(如判断单词的近义、反义关系)、以及语法关系(例如, “had”和“has” 、“was” and “is”有同样的语法关系)的方式恰当地表示单词。

        研究人员很快发现,使用经过大量文本数据进行预训练的编码(embeddings)是一个好主意,而不是与小数据集的模型一起训练。因此,通过使用Word2Vec或GloVe进行预训练,可以下载单词列表及其嵌入。如下图是单词“stick”的GloVe 嵌入示例(嵌入向量大小为200)

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

         关于词向量的发展史,Word2Vec和Glove的区别,请参考我的另一篇博客。

2、词嵌入—ELMo

       如果我们使用GloVe表示,那么不管上下文是什么,“stick”这个词都会由这个向量表示。很多研究人员就发现不对劲了。“stick”“有多种含义,取决于它的上下文是什么。那么,为什么不根据它的上下文给它一个嵌入呢——既要捕捉该上下文中的单词含义,又要捕捉其他上下文信息?因此,语境化的词嵌入(contextualized word-embeddings)就出现了。(这也是我将词向量和词嵌入分开阐述的原因)

BERT简述_第1张图片

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

BERT简述_第2张图片

       ELMo为NLP中的预训练提供了重要的一步。ELMo LSTM在大型数据集上进行训练,然后我们可以将其用作所处理语言的其他模型中的组件使用。

       ELMo通过训练预测单词序列中的下一个单词来获得语言理解能力——这项任务被称为语言建模。(类似于Word2Vec的训练过程)这很方便,因为我们有大量的文本数据,这样的模型可以从这些数据中学习,不需要标签

BERT简述_第3张图片

       我们可以看到每个展开的LSTM步骤的隐藏状态从ELMo的头部后面突出来。这些在预训练结束后的嵌入过程中会派上用场。ELMo实际上更进一步,训练了双向LSTM——这样它的语言模型不仅考虑下一个单词,而且考虑前一个单词。

BERT简述_第4张图片

       ELMo通过将隐藏状态(和初始嵌入)以某种方式组合在一起(连接后加权求和),提出语境化词嵌入。

BERT简述_第5张图片

3、词嵌入—Transformer

       Transformer的论文和代码的发布,以及它在机器翻译等任务上取得的成果,开始使一些业内人士认为Transformers是LSTM的替代品。而且,Transformer在处理长期以来性方便比LSTM更好。

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

       事实证明,我们不需要一个完整的Transformer来采用迁移学习,也不需要为NLP任务采用一个可微调的语言模型。我们只需要Transformer的解码器解码器是一个很好的选择,因为它是语言建模(预测下一个单词)的首选,因为它是为屏蔽未来的token而构建的——在逐字生成翻译时,这是一个有用的特性。

BERT简述_第6张图片

       模型堆叠了12个解码器层。由于在这种设置中没有编码器,这些解码器层将不会有普通transformer解码器层所具有的编码器-解码器注意力子层。但是,它仍具有自注意层。

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

BERT简述_第7张图片

将学习转移到下游任务

       既然transformer已经经过了预训练,并且它的层已经被调优以合理地处理语言,那么我们就可以开始将其用于下游任务。让我们先来看看句子分类(将邮件分为“垃圾邮件”或“非垃圾邮件”):

BERT简述_第8张图片

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

BERT简述_第9张图片

4、词嵌入—BERT

       OpenAI transformer为我们提供了一个基于Transformer的可微调预训练模型。但是在从LSTM到Transformer的转换过程中缺少了一些东西。ELMo的语言模型是双向的,而OpenAI Transformer只训练一个正向语言模型。我们能否建立一个基于transformer的模型,它的语言模型既考虑前向又考虑后向(用技术术语来说,“同时受左右上下文的制约”)?

       当我们有了无监督的训练语料时,后续的事情,就是在这些预料上面构造任务,来让model以完成任务为导向,从而达到训练词嵌入向量的目的。

4.1、词汇填充任务

BERT简述_第10张图片

       找到合适的任务来训练Transformer的编码器堆栈不容易,BERT采用了“masked language model”的概念(文献中也成为完形填空任务)来解决这个问题。除了遮盖15%的输入,BERT还混入了一些东西,以改进模型后来的微调方式。有时它会随机地将一个单词替换成另一个单词,并要求模型预测该位置的正确单词。

4.2、两句话任务

       如果你回顾OpenAI transformer处理不同任务时所做的输入转换,你会注意到一些任务需要模型说出关于两个句子的一些信息(例如,它们是否只是同件事情的相互转述?假设一个维基百科条目作为输入,一个关于这个条目的问题作为另一个输入,我们能回答这个问题吗?)

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

BERT简述_第11张图片

4.3、特定任务模型

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

BERT简述_第12张图片

4.4、BERT用于特征提取

       fine-tuning 方法并不是使用BERT的唯一方法。就像ELMo一样,你可以使用经过预训练的BERT来创建语境化的单词嵌入。然后,你可以将这些嵌入提供给现有的模型——论文中证明了,在诸如名称-实体识别之类的任务上,这个过程产生的结果与对BERT进行微调的结果相差不远。

BERT简述_第13张图片

5、BERT总结

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

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

BERT简述_第14张图片

       要正确理解BERT是什么,我们需要了解一些概念。让我们先看看如何使用BERT,然后再看模型本身涉及的概念。最直接的使用BERT的方法就是使用它来对单个文本进行分类。这个模型看起来是这样的:

BERT简述_第15张图片

       要训练一个这样的模型,主要需要训练分类器,在训练阶段对BERT模型的更改非常小。这种训练过程称为微调(Fine-Tuning),并且具有半监督序列学习(Semi-supervised Sequence Learning)和ULMFiT的根源。

       具体来说,由于我们讨论的是分类器,这属于机器学习的监督学习范畴。这意味着我们需要一个标记数据集来训练模型。比如说,对于一个垃圾邮件分类器,标记数据集是一个电子邮件列表及其标签(将每封电子邮件标记为“垃圾邮件”或“非垃圾邮件”)。

BERT简述_第16张图片

       现在,你已经有了一个如何使用BERT的示例用例,接下来让我们进一步了解它是如何工作的。

BERT简述_第17张图片

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

  • BERT BASE - 大小与OpenAI Transformer相当

  • BERT LARGE - 一个非常庞大的模型,实现了最先进的结果

       BERT基本上是一个训练好的Transformer Encoder堆栈。Transformer模型是BERT的一个基本概念,我们将在下文中讨论。

       关于transformer可以参考我的另一篇博客。

BERT简述_第18张图片

       这两种BERT模型都有大量的编码器层(论文中称之为Transformer Blocks)—— Base 版本有12层,Large版本有24层。它们也比初始论文里的Transformer的默认配置(6个编码器层,512个隐藏单元,8个attention heads)有更大的前馈网络(分别为768个和1024个隐藏单元), attention heads(分别为12个和16个)。

       模型输入:

BERT简述_第19张图片

       第一个输入token是一个特殊的[CLS]token,这里的CLS代表分类。就像transformer的普通编码器一样,BERT以一串单词作为输入。每一层应用self-attention,并通过前馈网络传递其结果,然后将结果传递给下一个编码器。

BERT简述_第20张图片

       在架构方面,到目前为止,这与Transformer完全相同(除了大小之外,不过大小是我们可以设置的配置)。在输出端,我们才开始看到两者的区别。

模型输出:

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

BERT简述_第21张图片

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

BERT简述_第22张图片

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

6、BERT中文应用

       介绍三个项目,一个是用bert做文本分类的任务,一个是用bert做命名实体识别的任务、另一个是fine-tune的使用教程。

       文本分类任务:https://github.com/NLPScott/bert-Chinese-classification-task

       命名实体识别任务:https://github.com/macanv/BERT-BiLSTM-CRF-NER

       两行代码运行bert:https://blog.csdn.net/c9Yv2cf9I06K2A9E/article/details/84351397

       fine-tune:https://mp.weixin.qq.com/s?__biz=MzI0ODcxODk5OA==&mid=2247499610&idx=2&sn=fb3de37b789633dfe108b7ac9cfd6915&chksm=e99ecca3dee945b56319d3fb9b998225f326748aa35d8185511992b1196dcc55a000f5929076&mpshare=1&scene=24&srcid=1126IJ0YkMrsdkTIz9vrzDnu#rd

你可能感兴趣的:(自然语言处理)