找回密码
 立即注册
搜索

残缺详解!自然言语处理最新里程碑BERT模型


全文共7055字,估计学习时长14分钟

BERT全称是来自变换器的双向编码器表征量(Bidirectional Encoder Representations from Transformers),它是Google于2018年末开发并发布的一种新型言语模型。与BERT模型相似的预训练言语模型例如问答、命名实体辨认、自然言语推理、文本分类等在许多自然言语处理义务中发挥着重要作用。
BERT是一种基于微调的多层双向变换器编码器。首先引见下该变换器的架构,这一点尤为重要。
什么是变换器(Transformer)?
2017年,谷歌发表了一篇题为《你所需求的是留意力》的论文,该论文提出一种基于留意力的结构,以处理与序列模型相关的成绩,例如机器翻译。传统的神经机器翻译大多运用循环神经网络(RNN)或卷积神经网络(CNN)作为编码-解码的模型库。但是,谷歌这一基于留意力的变换器模型摒弃传统的RNN和CNN公式。该模型高度并行运转,因此在提高翻译功能的同时,其训练速度也非常快。
进一步阐述变换器模型前,我们先对留意力做个引见。
什么是留意力(Attention)?
留意力机制可看作模糊记忆的一种方式。记忆由模型的隐藏形状组成,模型选择从记忆中检索内容。深化了解留意力之前,先简要回顾Seq2Seq模型。传统的机器翻译次要基于Seq2Seq模型。该模型分为编码层和解码层,并由RNN或RNN变体(LSTM、GRU等)组成。编码矢量是从模型的编码部分产生的最终隐藏形状。该向量旨在封装一切输入元素的信息,以协助解码器停止准确的预测。其用于充当模型解码器部分的初始隐藏形状。
Seq2Seq模型的次要瓶颈是需求将源序列的全部内容紧缩为固定大小的矢量。假如文本稍长,则很容易丢失文本的某些信息。为处理这个成绩,留意力应运而生。留意机制经过使解码器回顾源序列隐藏形状,然后将其加权平均值作为附加输入提供给解码器来缓解该成绩。运用留意力,顾名思义,模型在解码阶段选择最合适当前节点的上下文作为输入内容。
留意力与传统的Seq2Seq模型有两个次要区别。
第一,编码器向解码器提供更多数据,并且编码器会向解码器提供一切节点的隐藏形状,而不只仅是编码器的最后节点的隐藏形状。
第二,解码器不直接将一切编码器提供的隐藏形状作为输入,而是采用选择机制来选择与当前地位最婚配的隐藏形状。为此,它尝试经过计算每个隐藏形状的得分值并对得分停止softmax计算来确定哪个隐藏形状与当前节点相关性最高,这使得隐藏形状的更高相关性具有更大的分数值,不太相关的隐藏形状具有较小的分数值。然后它将每个隐藏形状与其softmax得分相乘,从而放大分数高的隐藏形状,淹没分数低的隐藏形状。该评分练习在解码器侧的每个迭代工夫完成。
如今,将留意机制用可视化予以表现,研讨留意流程如何停止:
1.留意解码器RNN接收令牌的嵌入和初始解码器隐藏形状。
2.RNN处理其输入,产生一个输入和一个新的隐藏形状向量(h4),并丢弃输入。
3.留意步骤:运用编码器隐藏形状和h4向量来计算该迭代工夫的语境向量(C4)。
4.将h4和C4连成一个向量。
5.将这个向量传递给前馈神经网络(一个与模型共同训练的网络)。
6.前馈神经网络的输入即该迭代工夫的输入字。
7.反复下一个迭代工夫的步骤



回到变换器


变换器模型运用编码器-解码器(encoder-decoder)架构。在谷歌发表的论文中,编码层和解码层都由6个编码器堆叠而成。每个编码器和解码器的外部结构如下:



编码器由两层组成,一个自留意层和一个前馈神经网络。自我关注不只要助于当前节点关注当前单词,还能助其获取上下文的语义。解码器还包含编码器提到的双层网络,但在两层中间还有一个留意层,以协助当前节点获得需求留意的关键内容。
以下是变换器架构的详细结构:



接上去逐一分析其组成部分。
自留意(Self-Attention)
自留意是变换器将其他相关单词的“了解”转换为所处理的单词的一种方式。
首先,自留意计算三个新的向量。在论文中,向量的维度是512维。将这三个向量分别称为Query,Key和Value。这三个向量经过字嵌入向量与随机初始化矩阵(论文中的维数为(64,512))相乘而产生的,并在反向传播过程中不断更新。



接上去,计算自留意的分数值,在某个地位编码单词时,它能决议在所输入句子其他部分投入的留意力。该分数值可经过Query和Key向量计算得出。然后用所得结果除以一个常数。本文中,该常数为8,这个值通常是上述矩阵第一维的平方根,即64的平方根8。然后对一切得分停止softmax计算。结果表示每个单词与当前地位单词的相关性。当然,当前词的相关性一定会很大。最后一步是将Value向量与softmax所得结果相乘并求和。结果是当前节点处的自留意值。



这种经过查询和密钥之间的相似度,来确定值的权重分布的方法,被称为缩放的点积留意。
多头留意
本论文中更精辟的部分是添加了另一种自留意机制,称为“多头”留意,它不只仅初始化一组Q,K,V矩阵。相反,初始化多个组,且变换器运用8个组,因此最终结果是8个矩阵。



前馈神经网络不能接受8个矩阵,因此需求一种方法将其减少为1个。为此,首先将8个矩阵衔接在一同得到一个大矩阵,然后将这个组合矩阵与一个随机初始化矩阵相乘得到最后的矩阵。整个流程如下图所示。



变换器的多头留意有三种运用方式:
1.在“编码-解码留意”层中,查询来自先前的解码器层,存储器键和值来自编码器的输入。这使解码器中的每个地位都参与输入序列中的一切地位。并模拟出序列到序列模型中典型的编码-解码留意机制。
2.编码器包含自留意层。在自留意层中,一切键、一切值和查询都来自相反的地位,在这种状况下,它们来自于编码器中前一层的输入。编码器中的每个地位都可以处理编码器前一层中的一切地位。
3.与其相似的是,解码器中的自留意层令解码器中的每个地位参与到解码器中的一切地位,直到并包括该地位。在此需求预防解码器中的向左信息流,以此保持自回归属性。经过掩蔽(设置为-∞)softmax中与非法衔接相对应的一切值来完成缩放点积留意。这将在解码器部分愈加详细地讨论,在此仅讨论掩蔽(Masking)。
地位编码
到目前为止,还没有办法解释变换器模型中输入序列中的单词顺序。为了处理此成绩,变换器在编码器和解码器层的输入端添加了一个额外的矢量地位编码。其维度与嵌入维度相反。此地位编码的值将添加到嵌入层的值中,并作为输入发送到下一层。地位编码选项有很多,包括学习和修复。

残余衔接和层规范化
在编码器和解码器中,在两个子层的周围都采用残余衔接,然后停止层规范化。跳过衔接或残余衔接用于允许梯度直接流过网络,而不经过非线性激活功能。非线性激活函数本质上是非线性的,导致梯度爆炸或消逝(取决于权重)。从概念上说,跳过衔接构成一条“总线”,它在网络中活动,反过来,梯度也可以沿着它向后活动。规范化有助于处理外部协变量偏移的成绩。外部协变量偏移是指在神经网络内发生的协变量偏移,即从(例如)第2层到第3层。这是由于当网络学习且权重被更新时,网络中特定层的输入分布会发生变化。这迫使较高层顺应该漂移,这减慢了学习速度。在对神经网络中的输入停止归一化后,不必担心输入特征的规模差别很大。要了解层规范化,将其与批规范化停止对比非常有用。一小批包含具有相反数量功能的多个示例。小批是矩阵 - 假如每个输入是多维的,则为张量 - 其中一个轴对应批,另一个轴或多个轴对应特征尺寸。批规范化规范批维度中的输入要素。层规范化的关键特性是它可以对要素之间的输入停止标准化。在批规范化中,统计信息在批处理中计算,并且对于批中的每个示例都是相反的。相反,在层规范化中,统计数据是跨每个特征计算的,并且与其他示例有关。



将残余衔接和层规范化放在一同



解码器
回看变换器体系结构图,可以看到解码器部分与编码器部分相似,但底部有一个掩盖的多头留意。Mask表示屏蔽某些值的掩码,以便在更新参数时它们不起作用。变换器模型中有两种掩码—填充掩码和序列掩码。填充掩码用于一切缩放的点积留意,序列掩码仅用于解码器的自留意。
填充掩码处理了输入序列具有可变长度的成绩。详细来说,在较短的序列后填0。但是假如输入序列太长,则会截取左侧的内容,并直接丢弃多余的内容。由于这些填充的地位实践上没有意义,留意机制不应该集中在这些地位,所以需求做一些处理。详细方法是在这些地位的值上加一个非常大的负数(负无量大),这样这些地位的概率在softmax计算之后将接近0!填充掩码实践上是一个张量,每个值都是一个布尔值,false值指想要处理的值。
A序列掩码旨在确保解码器无法查看将来的信息。也就是说,对于序列,在time_step t,解码输入应该仅取决于t之前的输入,而不取决于t之后的输入。这针对于变换器架构,由于没有RNN,可以按顺序输入序列。在此,一同输入一切内容,假如没有掩码,多头留意将思索每个地位的整个解码器输入序列。经过生成上三角矩阵来完成这一点,上三角形的值全为零,并将该矩阵运用于每个序列。
对于解码器的自留意,在此运用缩放的点积留意,并且添加填充掩码和序列掩码作为attn_mask。在其他状况下,attn_mask等于填充掩码。
另一个细节是解码器输入将向右移动一个地位。这样做的一个缘由是不希望模型在训练时期学习如何复制解码器输入,但还是想要了解给定编码器序列和模型曾经看到的特定解码器序列,从而预测下一个单词/字符。假如不移位解码器序列,模型则简单地学习“复制”解码器输入,由于地位 i 的目的字/字符将是解码器输入中的字/字符 i 。因此,经过将解码器输入移位一个地位,模型需求预测仅在解码器序列中看到单词/字符 1, …, i-1 的地位 i 的目的字/字符。这可以防止模型学习复制/粘贴义务。用句子扫尾令牌填充解码器输入的第一个地位,由于右移,该地位将是空的。相似地,将一个句末标记附加到解码器输入序列以标记该序列的结尾,并且它还附加到目的输入语句。
输入层
在完全执行解码器层后,为将得到的矢量映射到来自词汇表的单词,在结尾添加完全衔接层和softmax层。
线性层是一个简单的完全衔接的神经网络,它将解码器堆栈产生的矢量投影到一个更大的矢量中,称为logits矢量。假设模型知道从训练数据集中学到的10,000个独特的英语单词(模型的“输入词汇表”) 这将使logits矢量10,000个细胞变宽 - 每个单元对应于一个独一单词的得分。这就是对于线性层后的模型输入的解释。然后,softmax层将这些分数转换为概率(一切负数,一切加起来都为1.0)。选择具有最高概率的单元,并将与其相关联的单词作为该迭代时长的输入。






回到BERT模型


BERT模型基于变换器架构。它是一种具有双向深度的神经网络模型。BERT模型的关键技术创新是将变换器的双向培训运用于言语建模。这与先前从左到右查看文本序列或从左到右和从右到左组合训练的努力尝试构成对比。BERT模型采用了一种名为掩蔽言语模型(Masked Language Modeling)的新技术(将在后文看到),它允许在从前不能够运用的模型中停止双向训练。在其vanilla form中,变换器包括两个独立的机制——读取文本输入的编码器和产生义务预测的解码器。由于BERT模型的目的是生成言语模型,因此只需求编码器机制。
谷歌最后发布了两个版本,如下图所示。这里L表示变压器的层数,H表示输入的维数,A表示多头留意的数量。在这两个版本中,前馈大小都设置为4层。
BERTBASE: L=12, H=768, A=12, Total Parameters=110M
BERTLARGE: L=24, H=1024, A=16, Total Parameters=340M
运用BERT模型有两个阶段:预训练和微调。在预训练时期,模型在不同的预训练义务上训练未标记的数据。对于微调,首先运用预训练参数初始化BERT模型,并运用来自下游义务的标记数据对一切参数停止微调。每个下游义务都有单独的微调模型,即便它们运用相反的预训练参数停止初始化。BERT模型的一个分明特点是它跨越不同义务的一致架构。预训练架构与最终下游架构之间的差异很小。在微调时期,一切参数都经过微调。



BERT模型预训练过程
BERT模型预训练阶段包括两个无监督预测义务:掩蔽言语模型和下一句预测。
掩蔽言语模型(MLM)——由于BERT模型的双向功能(双向性)及其运用的多层自关注机制的效果,为了训练深度双向表示,一些百分比(论文中为15%)输入令牌的输入被简单地随机掩盖,然后预测那些被屏蔽的令牌。对应于掩模标记的最终隐藏向量被馈送到词汇表上的输入softmax,如在标准学习模型LM中。与从左到右的言语模型预训练不同,MLM目的允许表示交融的左侧和右侧的上下文,这使得可以预先训练深度双向变换器。虽然这允许获得双向预训练模型,但缺陷是预训练和微调之间存在不婚配,由于在微调时期不出现[MASK]标记。为了缓解这种状况,作者并不总是用实践的[MASK]标记交换“蒙面”单词。训练数据生成器随机选择15%的令牌地位停止预测。假如选择了第i个令牌,则将其交换为(1)[MASK]标记80%的工夫(2)随机标记10%的工夫(3)未更改的第i个标记10%工夫。BERT模型损失函数仅思索掩蔽值的预测并忽略非掩蔽字的预测。因此,模型比定向模型收敛得慢,这一特征被其添加的情境感知所抵消。
下一句预测(NSP)。为了训练了解句子关系以及单词之间的语义关系的模型,BERT模型还预先训练二进制化的下一句预测义务,该义务可以从任何文本语料库中随便生成。为A和B选择一些句子,其中50%的数据B是A的下一个句子,剩余的50%的数据B是在语料库中随机选择的,然后学习相关性。添加这种预训练的目的是许多自然言语处理义务(如QA和NLI)需求了解两个句子之间的关系,以便预训练模型可以更好地顺应这些义务。
为了协助模型区分训练中的两个句子,输入在进入模型之前按以下方式处理:
1.在第一个句子的扫尾插入[CLS]标记,并在每个句子的末尾插入[SEP]标记。
2.在每个标记中添加表示句子A或句子B的句子嵌入。句子嵌入在概念上相似于词汇量为2的标记嵌入。
3.向每个标记添加地位嵌入以指示其在序列中的地位。地位嵌入的概念和完成已在变换器论文中给出。
要预测第二个句子能否的确与第一个句子衔接,需执行以下步骤:
1.整个输入序列经过变换器模型。
2.运用简单的分类层(权重和偏向的学习矩阵)将[CLS]标记的输入转换为2×1型的矢量。
3.运用softmax计算IsNextSequence的概率。
在训练BERT模型时,MLM和NSP是被同时训练的,目的是最小化两种策略的组合损失函数。
标记化—BERT模型不会将单词视作标记。相反,它会看WordPieces。这意味着一个单词可以分解为多个子单词。这种标记化在处理词汇单词时是有益的,它可以协助更好地表示复杂的单词。
BERT模型的输入
BERT的输入可以是单词序列中的单个句子或句子对(例如,[成绩,答案])。对于给定的单词,其输入表示可以由三部分嵌入求和组成。嵌入的可视化表示如下所示:



标记嵌入表示单词向量。第一个字是CLS标志,可用于后续分类义务。对于非分类义务,可以忽略CLS标志。段嵌入用于区分两个句子,由于预训练不只是言语模型,而且还是具有两个句子作为输入的分类义务。地位嵌入编码字顺序。
用于下游自然言语处理义务的BERT模型微调
对于每个下游自然言语处理义务,只需将特定于义务的输入和输入插入BERT模型,并对端到端的一切参数停止微调。在输入处,来自预训练的句子A和句子B可类比于释义中的句子对,蕴涵中的假设前提对,成绩回答中的成绩通道对等。在输入处,标记表示被馈送到用于标记级别义务的输入层,例如序列标记或成绩回答,并且[CLS]表示被馈送到输入层以停止分类,例如蕴涵或心情分析。与预训练相比,微调相对便宜。



BERT模型可用于各种言语义务,而只需在核心模型中添加一个小层:
1.经过在[CLS]标记的变换器输入上添加分类层,相似于下一句分类,停止情感分析等分类义务。
2.在成绩回答义务(例如SQUAD v1.1)中,软件会收到有关文本序列的成绩,并且需求在序列中标记答案。运用BERT模型,可以经过学习标记答案末尾和结束的两个额外向量来训练Q&A模型。
3.在命名实体辨认(NER)中,软件接收文本序列,并且需求标记文本中出现的各种类型的实体(人员,组织,日期等)。运用BERT模型,可以经过将每个标记的输入向量馈送到预测NER标签的分类层来训练NER模型。
BERT模型用于特征提取
微调法不是运用BERT模型的独一方法。可以运用预先训练的BERT模型创建语境化词嵌入。然后,可以将这些嵌入提供给现有的模型——该过程本文展现了产生结果,在命名实体辨认等义务上微调BERT模型并不远。



哪个向量最合适作为上下文嵌入呢?这要视义务而定。本文共调查了六种可选方法(与得分为96.4的微调模型相比):






留言 点赞 关注
我们一同分享AI学习与发展的干货
编译组:胡昕彤、董宇阳
相关链接:
https://towardsdatascience.com/breaking-bert-down-430461f60efb
如需转载,请后台留言,遵守转载规范

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

大神点评3

猛兽 2019-10-3 21:15:14 显示全部楼层
小白一个 顶一下
回复

使用道具 举报

鈊在 2019-10-4 18:38:31 来自手机 显示全部楼层
为毛老子总也抢不到沙发?!!
回复

使用道具 举报

小辉会回家 2019-10-5 17:58:38 显示全部楼层
老哥,这波稳
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies