0.导语

自google在2018年10月底公布BERT在11项nlp任务中的卓越表现后,BERT(Bidirectional Encoder Representation from Transformers)就成为NLP领域大火,在本文中,我们将研究BERT模型,理解它的工作原理。

我最近在编写AI基础系列,这个是NLP(自然语言处理)的非常重要的部分。(黄海广)

目前已经发布:

AI 基础:Python开发环境设置和小技巧

AI 基础:Python 简易入门

AI 基础:Numpy 简易入门

AI 基础:Pandas 简易入门

AI 基础:Scipy(科学计算库) 简易入门

AI基础:数据可视化简易入门(matplotlib和seaborn)

AI基础:特征工程-类别特征

AI基础:特征工程-数字特征处理

AI基础:特征工程-文本特征处理

AI基础:词嵌入基础和Word2Vec

AI基础:图解Transformer

后续持续更新

作者:jinjiajia95

出处:https://blog.csdn.net/weixin_40746796/article/details/89951967

原作者:Jay Alammar

原链接:https://jalammar.github.io/illustrated-bert/

正文开始

前言

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

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

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的方法。

示例:句子分类
使用BERT最简单的方法就是做一个文本分类模型,这样的模型结构如下图所示:

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

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

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

情感分析

输入:电影/产品评论。输出:评论是正面还是负面?
示例数据集:SST
事实查证
输入:句子。输出:“索赔”或“不索赔”
更雄心勃勃/未来主义的例子:
输入:句子。输出:“真”或“假”

模型架构

现在您已经了解了如何使用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即可。

Parallels with Convolutional Nets(BERT VS卷积神经网络)
对于那些具有计算机视觉背景的人来说,这个矢量切换应该让人联想到VGGNet等网络的卷积部分与网络末端的完全连接的分类部分之间发生的事情。你可以这样理解,实质上这样理解也很方便。

词嵌入的新时代〜

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

Word Embedding Recap

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

这样的做法,我们可以使用大量的文本数据来预训练一个词嵌入模型,而这个词嵌入模型可以广泛用于其他NLP的任务,这是个好主意,这使得一些初创公司或者计算资源不足的公司,也能通过下载已经开源的词嵌入模型来完成NLP的任务。

ELMo:语境问题

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

这和中文的同音字其实也类似,用这个举一个例子吧, ‘长’ 这个字,在 ‘长度’ 这个词中表示度量,在 ‘长高’ 这个词中表示增加。那么为什么我们不通过”长’周围是度或者是高来判断它的读音或者它的语义呢?嗖嘎,这个问题就派生出语境化的词嵌入模型。

EMLo改变Word2vec类的将单词固定为指定长度的向量的处理方式,它是在为每个单词分配词向量之前先查看整个句子,然后使用bi-LSTM来训练它对应的词向量。

ELMo为解决NLP的语境问题作出了重要的贡献,它的LSTM可以使用与我们任务相关的大量文本数据来进行训练,然后将训练好的模型用作其他NLP任务的词向量的基准。
ELMo的秘密是什么?

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

上图介绍了ELMo预训练的过程的步骤的一部分:我们需要完成一个这样的任务:输入“Lets stick to”,预测下一个最可能出现的单词,如果在训练阶段使用大量的数据集进行训练,那么在预测阶段我们可能准确的预测出我们期待的下一个单词。比如输入“机器”,在‘’学习‘和‘买菜’中它最有可能的输出会是‘学习’而不是‘买菜’。

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

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

ELMo通过下图的方式将hidden states(的初始的嵌入)组合咋子一起来提炼出具有语境意义的词嵌入方式(全连接后加权求和)

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

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

  1. 该模型在modeling.py  (BertModel类)中构建,与vanilla Transformer编码器完全相同。

    (https://github.com/google-research/bert/blob/master/modeling.py)

  2. run_classifier.py是微调过程的一个示例。

    它还构建了监督模型的分类层。

    (https://github.com/google-research/bert/blob/master/run_classifier.py)

    如果要构建自己的分类器,请查看该文件中的create_model()方法。

  3. 可以下载几种预先训练的模型。

    涵盖102种语言的多语言模型,这些语言都是在维基百科的数据基础上训练而成的。

    BERT不会将单词视为tokens。

    相反,它注重WordPieces。

    tokenization.py是将你的单词转换为适合BERT的wordPieces的tokensizer。

    (https://github.com/google-research/bert/blob/master/tokenization.py)

您还可以查看BERT的PyTorch实现。

(https://github.com/huggingface/pytorch-pretrained-BERT)

AllenNLP库使用此实现允许将BERT嵌入与任何模型一起使用。

(https://github.com/allenai/allennlp)

(https://github.com/allenai/allennlp/pull/2067)

备注:公众号菜单包含了整理了一本AI小抄非常适合在通勤路上用学习

往期精彩回顾
那些年做的学术公益-你不是一个人在战斗适合初学者入门人工智能的路线及资料下载机器学习在线手册深度学习在线手册备注:加入本站微信群或者qq群,请回复“加群”加入知识星球(4500+用户,ID:92416895),请回复“知识星球”

喜欢文章,点个在看

AI基础:一文看懂BERT相关推荐

  1. 无计算机基础一文看懂炉石脚本(炉石兄弟)配置多开使用流程-修订版

    为了更多人能够减少重复劳动的无意义游戏时间,把更多时间用在享受生活上,我为大家写一个炉石兄弟的使用流程. 本文将尽量为没有基础或经验的小白提供一个完整的炉石传说挂机方案,能多开,win&mac ...

  2. ​【Python基础】一文看懂 Pandas 中的透视表

    作者:来源于读者投稿 出品:Python数据之道 一文看懂 Pandas 中的透视表 透视表在一种功能很强大的图表,用户可以从中读取到很多的信息.利用excel可以生成简单的透视表.本文中讲解的是如何 ...

  3. 极智AI | 一文看懂昇腾达芬奇架构计算单元

        本文详细解释了昇腾达芬奇架构中计算单元的架构与计算原理. 文章目录 1.达芬奇架构概览 2.矩阵计算单元 2.1 矩阵相乘 2.2 矩阵计算单元的计算方式 2.3 向量计算单元的计算方式 2. ...

  4. 一文看懂“语音识别ASR” | AI产品经理需要了解的AI技术概念

    原标题:一文看懂"语音识别ASR" | AI产品经理需要了解的AI技术概念 温馨提示:文末有[重大福利]:优惠券(金额很大) for 三节课<产品经理P2(进阶)系列课程&g ...

  5. 一文看懂“声纹识别VPR” | AI产品经理需要了解的AI技术概念_团员分享_@cony

    前言:声纹识别是AI领域中一个看似很小.但其实有机会在近期落地,且比较有意思的细分方向:本文作者是"AI产品经理大本营"团员@cony  ,她总结了AI产品经理"最必要& ...

  6. 一文看懂 AI 训练集、验证集、测试集(附:分割方法+交叉验证)

    2019-12-20 20:01:00 数据在人工智能技术里是非常重要的!本篇文章将详细给大家介绍3种数据集:训练集.验证集.测试集. 同时还会介绍如何更合理的讲数据划分为3种数据集.最后给大家介绍一 ...

  7. 一文看懂计算机视觉-CV(基本原理+2大挑战+8大任务+4个应用)

    2020-03-06 20:00:00 计算机视觉(Computer Vision)是人工智能领域的一个重要分支.它的目的是:看懂图片里的内容. 本文将介绍计算机视觉的基本概念.实现原理.8 个任务和 ...

  8. 一文看懂深度学习——人工智能系列学习笔记

    深度学习有很好的表现,引领了第三次人工智能的浪潮.目前大部分表现优异的应用都用到了深度学习,大红大紫的 AlphaGo 就使用到了深度学习. 本文将详细的给大家介绍深度学习的基本概念.优缺点和主流的几 ...

  9. 一文看懂智慧城市,解码25万亿大市场的机遇与格局

    一文看懂智慧城市,解码25万亿大市场的机遇与格局 原创京东科技2020-09-16 20:13:55 撰文 / Jarvis 编辑 / 郭佳 今年初,随着国家发展改革委员会首度圈定"新基建& ...

最新文章

  1. react学习笔记(序)
  2. 使用jsp实现word、excel格式报表打印-JSP教程,Jsp/Servlet
  3. sklearn中cross_validation包无法使用
  4. android 使用Photoshop获取图片某一点的颜色
  5. 2-算法 矩阵 数组类
  6. Java设计模式学习总结(7)——结构型模式之适配器模式
  7. Python基础函数学习笔记(一)
  8. Synergy——使用一套键鼠控制两台电脑(Ubuntu 和 Windows)
  9. 【CNN回归预测】基于matlab鲸鱼算法优化CNN回归预测【含Matlab源码 1453期】
  10. TF、keras两种padding方式:vaild和same
  11. breakpoint断点调试
  12. ESP32开发环境的搭建和 ESP-IDF支持以下调试方法
  13. python字符串类型判断(python中datatype()测试字符串类型)
  14. mysql如何加索引的时候不锁表
  15. 根据银行卡获取发卡行信息
  16. SpringBoot2.6.x集成swagger: Failed to start bean ‘documentationPluginsBootstrapper问题解决
  17. 开启虫洞的频率_仅用几段音频、扬声器和灯就能打开“虫洞”,这是真的?内附视频...
  18. 安装与配置NC产品(NC65)
  19. POI 不支持函数XIRR
  20. PHP实现显示图书目录,图书目录怎么做

热门文章

  1. js:自动亮起100盏灯
  2. POJ 1449 amp; ZOJ 1036 Enigma(简单枚举)
  3. 因封杀Adobe 美司法部对苹果展开反垄断调查
  4. 基于matlab 求多边费马点,POJ2420(求多边形费马点) | 学步园
  5. 一文攻破结构体-C语言
  6. 生物反应器:生物过程工程的动物细胞培养控制 Bioreactors : animal cell culture control for bioprocess engineering 英文原版
  7. 单细胞数据库PanglaoDB使用指南
  8. WB实验关键点!附详细实验检查清单
  9. mysql随机显示记录_MySQL随机读取表中记录
  10. python实现图的数据存储_Neo4j推出基于Python的嵌入式图数据存储