赞
踩
自然语言处理(Natural Language Processing,NLP)是人工智能、计算机科学、信息工程的交叉领域,涉及统计学、语言学等知识。语言是人类思维的证明,故自然语言处理是人工智能技术的最高境界,因而被誉为“人工智能皇冠上的明珠”。而谷歌BERT和百度ERNIE都取得过该领域的SOTA(State-Of-The-Art),因此本文着重讨论BERT和ERNIE的发展历程以及在NLP领域所做的贡献,旨在对NLP框架的思路进行梳理进而构建知识体系。
在ASR(语音识别)中,用音频频谱序列向量所构成的matrix作为前端输入喂给NN进行处理,nice;在CV(计算机视觉)中,用图片的像素构成的matrix展平成vector后组成的vector序列喂给NN进行处理,nice;那在NLP中呢?将每一个词用一个向量表示出来,想法是挺简单的,然而真有这么简单吗?
语言作为人类在进化了几百万年所产生的一种高层的抽象的思维信息表达的工具,其具有高度抽象的特征,文本是符号数据,两个词只要字面不同,就难以刻画它们之间的联系,即使是“麦克风”和“话筒”这样的同义词,从字面上也难以看出这两者意思相同(语义鸿沟现象),可能并不是简单地一加一那么简单就能表示出来,而判断两个词是否相似时,还需要更多的背景知识才能做出回答。因此,如何有效地表示出文本语言是决定神经网络能否发挥出强大拟合计算能力的关键前提。
1.1 为什么不采用One-Hot?
自然语言是一套用来表达含义的复杂系统,词是系统中表义的基本单元。One-Hot的大致思路为:假设词典中词的数量为n,假设一个词的索引为i,为了得到该词的One-Hot向量表示,我们创建一个全0的⻓为n的向量,并将其第i位设成1。这样一来,每个词就表示成了一个⻓度为n的向量,可以直接被神经网络使用。虽然One-Hot词向量构造起来很容易,但通常并不是一个好选择。一个主要的原因是,One-Hot词向量无法准确表达不同词之间的相似度,如我们常常使用的余弦相似度。
举个栗子,我们用0、1、2、3代表四个词,每个词都用一个全长为4的4维向量,则表达如下图。假如0代表“话筒”,1代表“麦克风”,那两者相似度应该非常高,而此时我们发现0和1对应的两个向量正交,从而无法很好的度量二者的相似度。
1.2 词的分布式表示:Word2vec
为解决以上问题,谷歌团队提出Word2vec(2013),它将每个词表示成⼀个定长向量,并使得这些向量能较好地表达不同词之间的相似和类⽐关系。这种把词映射为实数域向量的技术也叫词嵌入(Word Embedding),关于嵌入维度数量的经验法则:Embedding Dimensions = Number of Categories ** 0.25,一般取200d~500d。以下就是词嵌入的基本步骤:
学习每个单词的嵌入向量
用于 〈x,y〉 衡量相似性:〈x,y〉>〈z,y〉
建立概率模型
最大化似然函数优化
Word2vec⼯具包含两个模型:跳字模型(Skip-Gram)和连续词袋模型(CBOW)。跳字模型假设基于某个词来生成它在文本序列周围的词。举个栗子:假设文本序列是“the” “man” “loves” “his” “son”。以“loves”作为中心词,设背景窗口大小为2。跳字模型所关心的是,给定中心词“loves”,生成与它距离不超过2个词的背景词“the” “man” “his” “son”的条件概率,即:
连续词袋模型与跳字模型类似。不同之处在于:连续词袋模型假设基于某中心词在文本序列前后的背景词来生成该中心词。在同样的文本序“the” “man” “loves” “his” “son” 里,以“ loves”作为中心词,且背景窗口大小为2时,连续词袋模型关心的是,给定背景词 “the” “man” “his” “son”生成中心词“loves”的条件概率,也就是:
1.3 ELMo:BiLSTM语言模型
2013年的Word2vec包括2014年的GloVe(全局表示模型)中每个词仍然是对应一个vector,对于多义词无能为力。2018年,ELMo问世(结构如下图),预训练好的模型不再只是向量对应关系,而是一个训练好的模型。使用时,将一句话或一段话输入模型,模型会根据上线文来推断每个词对应的词向量。ELMo相较于之前的表示模型有两大好处:
好处一:对于多义词可以结合前后语境对多义词进行理解;
好处二:ELMo能够学到词汇用法的复杂性,比如语法、语义。
要想进一步理解此模型我们先复习一下长短期记忆网络。长短期记忆网络(Long short-term memory, LSTM)是一种特殊的RNN(循环神经网络),主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说,就是相比普通的RNN,LSTM能够在更长的序列中有更好的表现。如下图,LSTM通过“三门”结构中的“忘记门”可以捕捉到时间序列中时间步跨度较大的依赖关系,也可以应对RNN的梯度衰减,但是如同RNN一样是单向语言模型。
而ELMo即为双层双向LSTM结构,左端前向双层LSTM代表正向编码器,输入的是从左到右顺序除预测词外的上文Context-Before;右端的逆向双层LSTM代表反方向编码器,输入的是从右到左逆序的句子下文Context-After;每个编码器的深度都是两层LSTM叠加(需要注意的是,作者在词嵌入阶段使用的不是Word2vec而是CNN-Big-LSTM生成的Word Embedding)。此时,我们拥有了在NLP中处理多义词的能力。
在上一部分中,我们对NLP的核心问题(Representation)做了简要概述,了解到在做自然语言处理任务时需要将文本中的信息尽可能“清晰”地输入到模型中进行训练从而得到我们想要的模型,本部分就NLP中的模型做进一步介绍,同时为BERT和ERNIE模型结构做理论铺垫。
2.1 Seq2seq
Seq2Seq,全称 Sequence to Sequence 模型,大致意思是将一个序列信号,通过编码和解码生成一个新的序列信号,通常用于机器翻译、语音识别、自动对话等任务。在Seq2Seq 模型提出之前,深度神经网络在图像分类等问题上取得了非常好的效果。在深度学习擅长的问题中,输入和输出通常都可以表示为固定长度的向量,如果长度稍有变化,会使用补零等操作。然而像前面提到的几个问题,其序列长度事先并不知道。因此如何突破先前深度神经网络的局限,使其适应于更多的场景,成了 2013 年以来的研究热点,Seq2Seq 模型也应运而生。
Seq2seq模型所使用的具体方法名为Encoder-Decoder(2014)结构:Encoder(编码器)是读取输入序列的RNN(没有输出);Decoder(解码器)使用另一个RNN来生成输出,将上一时间步骤中的隐含状态用作解码器的初始隐藏状态。Encoder负责将输入序列压缩成指定长度的向量,获取语义向量最简单的方式就是直接将最后一个输入的隐状态作为语义向量C,而Decoder则负责根据语义向量生成指定的序列。局限性:1.定长语义向量无法表示整个序列信息;2.信息稀释问题(RNN结构缺陷)
2.2 Attention Is all you need
Attention的思想理解起来比较容易,就是在Decoding阶段对Input中的信息赋予不同权重。在NLP中就是针对sequence的每个Time Step Input,在cv中就是针对每个Pixel。针对Seq2seq翻译来说,RNN-Based Model如下图:
而比较基础的加入Attention与RNN结合的model如下图,第一张图为翻译到“机器”时的情景,其中是对应的权重,算出所有权重后会进行Softmax和加权,得到、;第二张图是翻译到“学习”时的情景,以此类推。Encoding和Decoding阶段仍然是基于RNN结构,但是Decoding阶使用Attention的输出结果、作为RNN输入。
相比于普通RNN的Encoder-Decoder模型,Attention模型最大的区别就在于它不在要求编码器将所有输入信息都编码进一个固定长度的向量之中。相反,此时编码器需要将输入编码成一个向量的序列,而在解码的时候,每一步都会选择性的从向量序列中挑选一个子集进行进一步处理。这样,在产生每一个输出的时候,都能够做到充分利用输入序列携带的信息。而且这种方法在翻译任务中取得了非常不错的成果。如果把attention剥离出来去看的话,其实是以下的机制:输入是query(Q), key(K), value(V),输出是Attention Value。模型通过Q和K的匹配计算出权重,再结合V得到输出。如下图:
而随后提出的Self-Attention(2017)区别于Attention的三个输入,Q(Query)、K(Key)、V(Value)三个矩阵均来自同一输入,且去除RNN结构。这样讲过于抽象,在此继续举栗子:我们要翻译一个词组Thinking Machines,其中Thinking的输入的embedding vector用 表示,Machines的embedding vector用 表示。如下图:
当我们处理Thinking这个词时,我们需要计算句子中所有词与它的Attention Score,这就像将当前词作为搜索的query,去和句子中所有词(包含该词本身)的key去匹配,看看相关度有多高。我们用 代表Thinking对应的Query Vector, 及 分别代表Thinking以及Machines对应的Key Vector,则计算Thinking的Attention Score的时候我们需要计算 与 的点乘,同理,我们计算Machines的Attention Score的时候需要计算 与 的点乘。如上图中所示我们分别得到了 与 的点乘积,然后我们进行尺度缩放与Softmax归一化,如下图所示:显然,当前单词与其自身的Attention Score一般最大,其他单词根据与当前单词重要程度有相应的Score。然后我们在用这些Attention Score与Value Vector相乘,得到加权的向量。
如果将输入的所有向量合并为矩阵形式,则所有Query、Key、Value向量也可以合并为矩阵形式表示。其中 是我们模型训练过程学习到的合适的参数。上述操作即可简化为矩阵形式,如下图:
2.3 Transformer
Transformer结构也由Encoder和Decoder组成。Encoder由N=6个相同的Layer组成,Layer指下图左侧的单元。每个Layer由两个Sub-layer组成,分别是Multi-head self-attention和Fully connected feed-forward network。其中每个sub-layer都加了Residual connection和Normalisation,因此可以将Sub-layer的输出表示为:
Decoder较Encoder多出一个Attention的Sub-layer,这里先明确一下Decoder的输入输出和解码过程:
输入:Encoder的输出 & 对应i-1位置Decoder的输出
输出:对应i位置的输出词的概率分布
解码:编码可以并行计算,但解码要像RNN一样逐一解出,因为要用上一个位置的输入当作Attention的Query
需要特别指出的是在数据预处理阶段,Transformer抛弃了RNN,而RNN最大的优点就是在时间序列上对数据的抽象,因此作者提出两种Positional Encoding的方法(用不同频率余弦函数直接计算或者直接通过训练学习出一份),将Encoding后的数据与Embedding数据求和,从而在模型输入中加入了相对位置信息。
3.1 BERT概况
BERT全称是Bidirectional Encoder Representation from Transformers,即双向Transformer的Encoder。BERT是截至2018.10的最新SOTA模型,通过预训练和精调横扫11项NLP任务。模型主要创新点都在Pre-Train,即用了Masked LM和Next Sentence Prediction两种方法分别捕捉词语和句子级别Representation。模型结构如下图最左:
对比OpenAI GPT(Generative pre-trained transformer),BERT是双向的Transformer block连接,效果会更好一些;对比ELMo,虽然都是“双向”, 但特征提取器不同,很多研究已经证明了 Transformer 提取特征的能力是要远强于 LSTM 的;此外,ELMOo采取双向拼接这种融合特征的能力可能比BERT一体化的融合特征方式弱。
接下来观察一下BERT模型的多层词嵌入向量结构,如下图,BERT词嵌入向量有三层,分别是:
Token Embeddings:词向量,第一个单词是CLS标志,可用于分类任务
Segment Embeddings:用来区别两种句子,因为预训练不光做LM还要做以两个句子为输入的分类任务
Position Embeddings:位置标记,和Transformer不同,不是三角函数而是学习出来的
如图中例子,Bert 的输入 Input 是两个句子:"my dog is cute","he likes playing"。首先会在第一句开头加上特殊Token [CLS] 用于标记句子开始,用 [SEP] 标记句子结束;然后对每个 Token 进行 3 个 Embedding:词的 Embedding(Token Embeddings),位置Embedding(Position Embeddings)以及句子Embedding(Segment Embeddings);最终将三个 Embedding 求和的方式输入到下一层。
3.2 BERT创新
Pre-training Task 1:Masked LM
在训练过程中作者随机mask 15%的token,而不是把像CBOW一样把每个词都预测一遍。最终的损失函数只计算被mask掉的那个token;
如果一直用标记[MASK]代替会影响模型,所以随机mask的时候10%的单词会被替代成其他单词,10%的单词不替换,剩下80%才被替换为[MASK];
因为序列长度太大(512)会影响训练速度,所以90%的steps都用seq_len=128训练,余下的10%步数训练512长度的输入。
Pre-training Task 2:Next Sentence Prediction
因为涉及到QA和NLI之类的任务,第二个预训练任务目的是让模型理解两个句子之间的联系。
训练的输入是句子A和B,B有一半的几率是A的下一句,输入这两个句子,模型预测B是不是A的下一句。预训练的时候可以达到97-98%的准确度。
Fine-tunning
对于sequence-level的分类任务,BERT直接取第一个[CLS]token的Final-Hidden-State,加一层权重后Softmax预测Label Proba。
其他预测任务需要根据具体任务类型进行一些调整,如下图:
3.3 BERT总结
BERT优点:
由于使用的是Transformer,也就是相对RNN更加高效、能捕捉更长距离的依赖
对比起之前的预训练模型,它捕捉到的是真正意义上的bidirectional context信息
BERT缺点:
[MASK]标记在实际预测中不会出现,训练时用过多[MASK]影响模型表现
每个batch只有15%的token被预测,所以BERT收敛得比left-to-right模型要慢
4.1 ERNIE 1.0
无论是稍早提出的 CoVe、ELMo、GPT, 还是能力更强的 BERT 模型,其建模对象主要聚焦在原始语言信号上,较少利用语义知识单元建模。百度提出基于知识增强ERNIE模型通过建模海量数据中的实体概念等先验语义知识,学习真实世界的语义关系。例如,对于哈 [mask] 滨,黑 [mask]江这些词,BERT 模型通过字的搭配,很容易推测出掩码的字信息,但没有显式地对语义概念单元 (哈尔滨、黑龙江) 以及其对应的语义关系进行建模。ERNIE模型通过对词、实体等语义单元的掩码,使得模型学习完整概念的语义表示。
ERNIE通过改变Masking策略的方式,将BERT中的随机Masking改为实体或短语级别(Entity or Phrase)的Masking(引入聚合知识),使得模型能够从中学习到更多句法语义知识,在许多中文任务上取得SOTA。
Basic-Level Masking:这就是BERT中采用的token粒度的随机Masking,只能学习到基本的语义信息,对于深层语义信息比较难建模;
Phrase-Level Masking:短语是几个字词组成的概念单元。英文中可通过词法分析获取短语边界,中文中可以使用分词工具获取Word/Phrase信息。然后,随机Masked掉一些Phrase;
Entity-Level Masking:通过命名实体识别(Named Entity Recognition)将实体识别出来,并随机Masked掉一些Entity。
4.2 ERNIE 2.0
ERNIE 2.0与1.0及BERT框架都基于Pre-train/Fine-tuning架构,不同之处在于:它并不是在少量预训练任务上完成的,而是通过不断引入新的预训练任务,帮助模型持续高效地学习语义信息,即持续预训练(Continual Pre-Training)。此外,ERNIE框架支持引入各种自定义预训练任务,这些任务共享相同的编码网络并通过多任务学习实现训练。当我们给出新的任务时,ERNIE 2.0框架可以根据先前预训练的权重增量地学习新的知识,即迁移学习(Transfer Learning)。
在Transformer Encoder上,ERNIE 2.0模型同样采用多层Transformer作为Encoder。Transformer通过Self-Attention能够捕获每个Token在文本序列中的上下文信息,并生成上下文语境表征嵌入。在Task Embedding上,模型中的Task Embedding是用以适用不同特性的任务。模型结构如下图所示。N个任务分别记为0~N,每个任务id都有其特定的Token Embedding、Position Embedding和Task Embedding作为模型的输入。在微调阶段,可以选用任意一个任务id来进行模型的初始化。其起始位置是预定义的分隔符[CLS];对于输入为多段的任务,不同段之间用预定义的[SEP]分隔。具体的三种task为:
word-aware task用于教模型捕捉词汇信息(lexical information);
structure-aware task教模型捕捉句法信息(syntactic information);
semantic-aware task 任务顾名思义负责捕捉语义信息(Semantic information)。
4.3 ERNIE总结
ERNIE 2.0使用single-task和single-model在GLUE英文任务上和BERT、XLNet同台较量,可以看到很多任务都优胜于BERT,且中文NLP任务上,ERNIE 2.0相比1.0版本取得长足进步。ERNIE的优势总结如下:
ERNIE 直接对先验语义知识单元进行建模,增强了模型语义表示能力。
引入可持续学习,该框架能够以持续地在多任务上增量学习。
构建3大类的预训练任务以学习语言的各方面特征,并基于这些任务训练了表达能力更强的ERNIE 2.0模型。
参考资料:
1.Deep Learning Based Text Classification:A Comprehensive Review
2.Attention Is All You Need
3.BERT:Pre-training of Deep Bidirectional Transformers for Language Understanding
4.ERNIE:Enhanced Representation through Knowledge Integration
5.ERNIE 2.0:A Continual Pre-Traing Framework for Language Understanding
6.A Structured Self-Attentive Sentence Embedding
7.https://zhuanlan.zhihu.com/p/46652512
8.https://zhuanlan.zhihu.com/p/46833276
9.https://zhuanlan.zhihu.com/p/49271699
10.http://d2l.ai/chapter_natural-language-processing-pretraining/index.html
11.https://zhuanlan.zhihu.com/p/51679783
12.https://zhuanlan.zhihu.com/p/69290203
13.https://zhuanlan.zhihu.com/p/74491982
14.https://www.cnblogs.com/cx2016/p/13022612.html
15.https://zhuanlan.zhihu.com/p/149490072
16.https://zhuanlan.zhihu.com/p/139595546
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。