天然语言处理(NLP): 13 The Illustrated BERT, ELMo, and co.

原文:The Illustrated BERT, ELMo, and co. (How NLP Cracked Transfer Learning)
做者:Jay Alammar
原文链接: http://jalammar.github.io/illustrated-bert/
修改:1121025745@qq.com
BERT论文地址:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding https://arxiv.org/abs/1810.04805html

本章节主要概要git

  • 词潜入历史发展(word2vec,glove->elmo->…bert)
  • BERT架构以及源码分析
  • 联系方式,你的问题?
    文章最后提供NLP技术交流群 ,欢迎加入咱们。

前言

2018年可谓是天然语言处理(NLP)的元年,在咱们如何以最能捕捉潜在语义关系的方式 来辅助计算机对的句子概念性的理解 这方面取得了极大的发展进步。此外, NLP领域的一些开源社区已经发布了不少强大的组件,咱们能够在本身的模型训练过程当中免费的下载使用。(能够说今年是NLP的ImageNet时刻,由于这和几年前计算机视觉的发展很类似)github

在这里插入图片描述

上图中,最新发布的BERT是一个NLP任务的里程碑式模型,它的发布势必会带来一个NLP的新时代。BERT是一个算法模型,它的出现打破了大量的天然语言处理任务的记录。在BERT的论文发布不久后,Google的研发团队还开放了该模型的代码,并提供了一些在大量数据集上预训练好的算法模型下载方式。Goole开源这个模型,并提供预训练好的模型,这使得全部人均可以经过它来构建一个涉及NLP的算法模型,节约了大量训练语言模型所需的时间,精力,知识和资源。web

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iUP2CPMM-1590398538798)(https://uploader.shimo.im/f/6xxJC31NvvYDCGFQ.png!thumbnail)]

BERT集成了最近一段时间内NLP领域中的一些顶尖的思想,包括但不限于 Semi-supervised Sequence Learning (by Andrew Dai and Quoc Le), ELMo (by Matthew Peters and researchers from AI2 and UW CSE), ULMFiT (by fast.ai founder Jeremy Howard and Sebastian Ruder), and the OpenAI transformer (by OpenAI researchers Radford, Narasimhan, Salimans, and Sutskever), and the Transformer (Vaswani et al).。算法

你须要注意一些事情才能恰当的理解BERT的内容,不过,在介绍模型涉及的概念以前可使用BERT的方法。json

示例:BERT句子分类模型结构

使用BERT最简单的方法就是作一个文本分类模型,这样的模型结构以下图所示:网络

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JKjIxMIx-1590398538800)(https://uploader.shimo.im/f/ikhB38OpiFrNRVgy.png!thumbnail)]

为了训练一个这样的模型,(主要是训练一个分类器),在训练阶段BERT模型发生的变化很小。该训练过程称为微调,而且源于 Semi-supervised Sequence Learning 和 ULMFiT.。架构

为了更方便理解,咱们下面举一个分类器的例子。分类器是属于监督学习领域的,这意味着你须要一些标记的数据来训练这些模型。对于垃圾邮件分类器的示例,标记的数据集由邮件的内容和邮件的类别2部分组成(类别分为“垃圾邮件”或“非垃圾邮件”)。app

spam: 垃圾邮件框架

Not spam:非垃圾邮件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-79SFuPQK-1590398538803)(https://uploader.shimo.im/f/9WwBKrbjuBUQEpFS.png!thumbnail)]

模型架构

如今您已经了解了如何使用BERT的示例,让咱们仔细了解一下他的工做原理。

在这里插入图片描述
BERT的论文中介绍了2种版本:

  • BERT BASE - 与OpenAI Transformer的尺寸至关,以便比较性能
  • BERT LARGE - 一个很是庞大的模型,它完成了本文介绍的最早进的结果。

BERT的基础集成单元是Transformer的Encoder。关于Transformer的介绍能够阅读做者以前的文章:The Illustrated Transformer,该文章解释了Transformer模型 - BERT的基本概念以及咱们接下来要讨论的概念。
在这里插入图片描述

2个BERT的模型都有一个很大的编码器层数,(论文里面将此称为Transformer Blocks) - 基础版本就有12层,进阶版本有24层。同时它也有很大的前馈神经网络( 768和1024个隐藏层神经元),还有不少attention heads(12-16个)。这超过了Transformer论文中的参考配置参数(6个编码器层,512个隐藏层单元,和8个注意头)

模型输入

输入的第一个字符为[CLS],在这里字符[CLS]表达的意思很简单 - Classification (分类)。

BERT与Transformer 的编码方式同样。将固定长度的字符串做为输入,数据由下而上传递计算,每一层都用到了self attention,并经过前馈神经网络传递其结果,将其交给下一个编码器。
在这里插入图片描述

这样的架构,彷佛是沿用了Transformer 的架构(除了层数,不过这是咱们能够设置的参数)。那么BERT与Transformer 不一样之处在哪里呢?可能在模型的输出上,咱们能够发现一些端倪。

模型输出

每一个位置返回的输出都是一个隐藏层大小的向量(基本版本BERT为768)。以文本分类为例,咱们重点关注第一个位置上的输出(第一个位置是分类标识[CLS]) 。以下图
在这里插入图片描述

该向量如今能够用做咱们选择的分类器的输入,在论文中指出使用单层神经网络做为分类器就能够取得很好的效果。原理以下:
在这里插入图片描述

例子中只有垃圾邮件和非垃圾邮件,若是你有更多的label,你只须要增长输出神经元的个数便可,另外把最后的激活函数换成softmax便可。

BERT VS卷积神经网络

对于那些具备计算机视觉背景的人来讲,这个矢量切换应该让人联想到VGGNet等网络的卷积部分与网络末端的彻底链接的分类部分之间发生的事情。你能够这样理解,实质上这样理解也很方便。

在这里插入图片描述

词嵌入历史发展

BERT的开源随之而来的是一种词嵌入的更新。到目前为止,词嵌入已经成为NLP模型处理天然语言的主要组成部分。诸如Word2vec和Glove 等方法已经普遍的用于处理这些问题,在咱们使用新的词嵌入以前,咱们有必要回顾一下其发展。

Word Embedding Recap

为了让机器能够学习到文本的特征属性,咱们须要一些将文本数值化的表示的方式。Word2vec算法经过使用一组固定维度的向量来表示单词,计算其方式能够捕获到单词的语义及单词与单词之间的关系。使用Word2vec的向量化表示方式能够用于判断单词是否类似,对立,或者说判断“男人‘与’女人”的关系就如同“国王”与“王后”。(这些话是否是听腻了〜 emmm水文必备)。另外还能捕获到一些语法的关系,这个在英语中很实用。例如“had”与“has”的关系如同“was”与“is”的关系。

这样的作法,咱们可使用大量的文本数据来预训练一个词嵌入模型,而这个词嵌入模型能够普遍用于其余NLP的任务,这是个好主意,这使得一些初创公司或者计算资源不足的公司,也能经过下载已经开源的词嵌入模型来完成NLP的任务。
在这里插入图片描述

word2vec

https://code.google.com/archive/p/word2vec/

A simple way to investigate the learned representations is to find the closest words for a user-specified word. The distance tool serves that purpose. For example, if you enter ‘france’, distance will display the most similar words and their distances to ‘france’, which should look like:

图片

glove

https://nlp.stanford.edu/projects/glove/

The Euclidean distance (or cosine similarity) between two word vectors provides an effective method for measuring the linguistic or semantic similarity of the corresponding words. Sometimes, the nearest neighbors according to this metric reveal rare but relevant words that lie outside an average human’s vocabulary. For example, here are the closest words to the target word frog:

  1. frog
  2. frogs
  3. toad
  4. litoria
  5. leptodactylidae
  6. rana
  7. lizard
  8. eleutherodactylus

图片

The underlying concept that distinguishes man** from **woman, i.e. sex or gender, may be equivalently specified by various other word pairs, such as king and queen or brother and sister. To state this observation mathematically, we might expect that the vector differences man - woman, king - queen, and brother - sister might all be roughly equal. This property and other interesting patterns can be observed in the above set of visualizations.

图片

ELMo

图片

https://www.mihaileric.com/posts/deep-contextualized-word-representations-elmo/

https://baike.baidu.com/item/%E8%8A%9D%E9%BA%BB%E8%A1%97/5424288?fr=aladdin

ELMo 前沿

《Deep Contextualized Word Representations》这篇论文来自华盛顿大学的工做,最后是发表在今年的NAACL会议上,并得到了最佳论文。其实这个工做的前身来自同一团队在ACL2017发表的《Semi-supervised sequence tagging with bidirectional language models》 [4],只是在这篇论文里,他们把模型更加通用化了。首先咱们来看看他们工做的动机,他们认为一个预训练的词表示应该可以包含丰富的句法和语义信息,而且可以对多义词进行建模。而传统的词向量(例如word2vec)是上下文无关的。例以下面"apple"的例子,这两个"apple"根据上下文意思是不一样的,可是在word2vec中,只有apple一个词向量,没法对一词多义进行建模。

图片

ELMo 详细解读

上面介绍的词嵌入方式有一个很明显的问题,由于使用预训练好的词向量模型,那么不管上下文的语境关系如何,每一个单词都只有一个惟一的且已经固定保存的向量化形式“。Wait a minute “ - 出自(Peters et. al., 2017, McCann et. al., 2017, and yet again Peters et. al., 2018 in the ELMo paper )

“ Wait a minute ”这是一个欧美平常梗,示例:
我:兄弟,你认真学习深度,没准能拿80W年薪啊。
你:Wait a minute,这么好,你为啥不作。

这和中文的同音字其实也相似,用这个举一个例子吧, ‘长’ 这个字,在 ‘长度’ 这个词中表示度量,在 ‘长高’ 这个词中表示增长。那么为何咱们不经过”长’周围是度或者是高来判断它的读音或者它的语义呢?嗖嘎,这个问题就派生出语境化的词嵌入模型。
在这里插入图片描述
EMLo改变Word2vec类的将单词固定为指定长度的向量的处理方式,它是在为每一个单词分配词向量以前先查看整个句子而后使用bi-LSTM来训练它对应的词向量。

在这里插入图片描述

ELMo为解决NLP的语境问题做出了重要的贡献,它的LSTM可使用与咱们任务相关的大量文本数据来进行训练,而后将训练好的模型用做其余NLP任务的词向量的基准。

ELMo的秘密是什么?

ELMo会训练一个模型,这个模型接受一个句子或者单词的输入,输出最有可能出如今后面的一个单词。想一想输入法,对啦,就是这样的道理。这个在NLP中咱们也称做Language Modeling。这样的模型很容易实现,由于咱们拥有大量的文本数据且咱们能够在不须要标签的状况下去学习。

在这里插入图片描述

上图介绍了ELMo预训练的过程的步骤的一部分:

咱们须要完成一个这样的任务:输入“Lets stick to”,预测下一个最可能出现的单词,若是在训练阶段使用大量的数据集进行训练,那么在预测阶段咱们可能准确的预测出咱们期待的下一个单词。好比输入“机器”,在‘’学习‘和‘买菜’中它最有可能的输出会是‘学习’而不是‘买菜’。

从上图能够发现,每一个展开的LSTM都在最后一步完成预测。

对了真正的ELMo会更进一步,它不只能判断下一个词,还能预测前一个词。(Bi-Lstm)

在这里插入图片描述
ELMo经过下图的方式将hidden states(的初始的嵌入)组合咋子一块儿来提炼出具备语境意义的词嵌入方式(全链接后加权求和)

在这里插入图片描述

ELMo的几位做者都是NLP圈内的知名人士

更多ELMo的模型图片
在这里插入图片描述
在这里插入图片描述

图片来源(https://www.mihaileric.com/posts/deep-contextualized-word-representations-elmo/

ElMO不足之处

ELMo 有什么值得改进的缺点呢?

一个很是明显的缺点在特征抽取器选择方面,ELMO 使用了 LSTM 而不是新贵 Transformer,Transformer 是谷歌在 17 年作机器翻译任务的“Attention is all you need”的论文中提出的,引发了至关大的反响,不少研究已经证实了 Transformer 提取特征的能力是要远强于 LSTM 的。若是 ELMO 采起 Transformer 做为特征提取器,那么估计 BERT 的反响远不如如今的这种火爆场面。

ULM-FiT:NLP领域应用迁移学习

ULM-FiT机制让模型的预训练参数获得更好的利用。所利用的参数不只限于embeddings,也不只限于语境embedding,ULM-FiT引入了Language Model和一个有效微调该Language Model来执行各类NLP任务的流程。这使得NLP任务也能像计算机视觉同样方便的使用迁移学习。

The Transformer:超越LSTM的结构

Transformer论文和代码的发布,以及其在机器翻译等任务上取得的优异成果,让一些研究人员认为它是LSTM的替代品,事实上倒是Transformer比LSTM更好的处理long-term dependancies(长程依赖)问题Transformer Encoding和Decoding的结构很是适合机器翻译,可是怎么利用他来作文本分类的任务呢?实际上你只用使用它来预训练能够针对其余任务微调的语言模型便可。

OpenAI Transformer:用于语言模型的Transformer解码器预训练

事实证实,咱们并不须要一个完整的transformer结构来使用迁移学习和一个很好的语言模型来处理NLP任务。咱们只须要Transformer的解码器就好了。The decoder is a good choice because it’s a natural choice for language modeling (predicting the next word) since it’s built to mask future tokens – a valuable feature when it’s generating a translation word by word.

在这里插入图片描述
该模型堆叠了十二个Decoder层。 因为在该设置中没有Encoder,所以这些Decoder将不具备Transformer Decoder层具备的Encoder - Decoder attention层。 然而,取而代之的是一个self attention层(masked so it doesn’t peak at future tokens)。

经过这种结构调整,咱们能够继续在类似的语言模型任务上训练模型:使用大量的未标记数据集训练,来预测下一个单词。举个列子:你那7000本书喂给你的模型,(书籍是极好的训练样本~比博客和推文好不少。)训练框架以下:

在这里插入图片描述

Transfer Learning to Downstream Tasks

经过OpenAI的transformer的预训练和一些微调后,咱们就能够将训练好的模型,用于其余下游NLP任务啦。(好比训练一个语言模型,而后拿他的hidden state来作分类。),下面就介绍一下这个骚操做。(仍是如上面例子:分为垃圾邮件和非垃圾邮件)

在这里插入图片描述
OpenAI论文概述了许多Transformer使用迁移学习来处理不一样类型NLP任务的例子。以下图例子所示:

在这里插入图片描述

BERT: From Decoders to Encoders

OpenAI transformer为咱们提供了基于Transformer的精密的预训练模型。可是从LSTM到Transformer的过渡中,咱们发现少了些东西。ELMo的语言模型是双向的,可是OpenAI的transformer是前向训练的语言模型。咱们可否让咱们的Transformer模型也具备Bi-Lstm的特性呢?

R-BERT:“Hold my beer”

Masked Language Model

BERT说:“我要用 transformer 的 encoders”

Ernie不屑道:“呵呵,你不能像Bi-Lstm同样考虑文章”

BERT自信回答道:“咱们会用masks”

解释一下Mask:

语言模型会根据前面单词来预测下一个单词,可是self-attention的注意力只会放在本身身上,那么这样100%预测到本身,毫无心义,因此用Mask,把须要预测的词给挡住。

以下图:

在这里插入图片描述

Two-sentence Tasks

咱们回顾一下OpenAI transformer处理不一样任务的输入转换,你会发如今某些任务上咱们须要2个句子做为输入,并作一些更为智能的判断,好比是否类似,好比 给出一个维基百科的内容做为输入,同时在放入一条针对该条目的问题,那么咱们的算法模型可以处理这个问题吗?

为了使BERT更好的处理2个句子之间的关系,预训练的过程还有一个额外的任务:给定2个句子(A和B),A与B是否类似?(0或者1)

在这里插入图片描述

特殊NLP任务

BERT的论文为咱们介绍了几种BERT能够处理的NLP任务:

  1. 短文本类似
  2. 文本分类
  3. QA机器人
  4. 语义标注

在这里插入图片描述

BERT用作特征提取

微调方法并非使用BERT的惟一方法,就像ELMo同样,你可使用预选训练好的BERT来建立语境化词嵌入。而后你能够将这些嵌入提供给现有的模型。

在这里插入图片描述

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

在这里插入图片描述

BERT源码分析

使用BERT的最佳方式是经过 BERT FineTuning with Cloud TPUs (https://colab.research.google.com/github/tensorflow/tpu/blob/master/tools/colab/bert_finetuning_with_cloud_tpus.ipynb) 谷歌云上托管的笔记。若是你未使用过谷歌云TPU能够试试看,这是个不错的尝试。另外BERT也适用于TPU,CPU和GPU

**tensorflow版本 **BERT代码

  • 该模型在modeling.py(BertModel类)中构建,与vanilla Transformer编码器彻底相同。
  • run_classifier.py是微调过程的一个示例。它还构建了监督模型的分类层。若是要构建本身的分类器,请查看该文件中的create_model()方法。
  • 能够下载几种预先训练的模型。涵盖102种语言的多语言模型,这些语言都是在维基百科的数据基础上训练而成的。
  • BERT不会将单词视为tokens。相反,它注重WordPieces。 tokenization.py是将你的单词转换为适合BERT的wordPieces的tokensizer。

**pytorch 版本 **BERT **代码 **

咱们重点关注下面的文件便可

  • modeling

https://github.com/huggingface/transformers/blob/master/src/transformers/modeling_bert.py

HuggingFace提供的一个基于PyTorch实现的BERT 模型

  • BertEmbedding: wordpiece embedding + position embedding + token type embedding
  • BertSelfAttnetion: query, key, value
  • BertSelfOutput:
  • BertIntermediate
  • BertOutput
  • BertForSequenceClassification
  • configuration

https://github.com/huggingface/transformers/blob/master/src/transformers/configuration_bert.py

  • tokenization

https://github.com/huggingface/transformers/blob/master/src/transformers/tokenization_bert.py

  • DataProcessor

https://github.com/huggingface/transformers/blob/master/src/transformers/data/processors/glue.py

  • rule_gule.py 是一个文本分类实现的案例
  • optimization.py 提供了AdamW 梯度更新算法

BERT是Transformer的一部分. Transformer本质是filter size为1的CNN. BERT比较适合几百个单词的状况,文章太长不太行。从github 上下载transformers 实现bert 预训练模型处理和文本分类的案例。

咱们在使用bert 的预训练的模型时,首先要下载,下载完成咱们修改为下面文件名称便可使用了

  • pytorch_model.bin : 预训练的模型
  • vocab.txt :词典文件
  • config.json: bert 配置文件,主要bert 的定义的参数

英文预训练模型:

https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-uncased-pytorch_model.bin

https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-uncased-vocab.txt

https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-uncased-config.json

中文预训练模型:

https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-chinese-pytorch_model.bin

https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-chinese-vocab.txt

https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-chinese-config.json

GLUE benchmark

BERT的不少任务基于GLUE benchmark

https://gluebenchmark.com/tasks/

https://openreview.net/pdf?id=rJ4km2R5t7

最近NVIDIA开源了他们53分钟训练BERT的代码

https://github.com/NVIDIA/DeepLearningExamples/tree/master/PyTorch/LanguageModeling/BERT

留言板

若是感受有用,留个赞吧~~

QQ:1121025745

更多学习内容能够关注 博客 https://blog.csdn.net/shenfuli ,并加入咱们NLP技术交流群学习。

20200117151004647.jpeg
# 参考文献

[1] BERT全文翻译成中文

https://zhuanlan.zhihu.com/p/59775981

[2] 图解 BERT 模型:从零开始构建 BERT

https://flashgene.com/archives/20062.html

[3] NLP必读:十分钟读懂谷歌BERT模型

https://zhuanlan.zhihu.com/p/51413773

[4] BERT Explained: State of the art language model for NLP

https://towardsdatascience.com/bert-explained-state-of-the-art-language-model-for-nlp-f8b21a9b6270

[5] The Illustrated Transformer

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

[6]Self Attention 和 Transformer 模型实现理解

https://blog.csdn.net/shenfuli/article/details/105399880

[7]The Annotated Transformer

http://nlp.seas.harvard.edu/2018/04/03/attention.html

[8]HuggingFace-Transformers系列的介绍以及在下游任务中的使用

https://dxzmpk.github.io/