前言:
从20世纪70年代的统计语言模型,到2003年的神经网络语言模型,再到2018年刷新各种NLP任务记录的BERT,再到今年6月份的XLNet再次刷新各种记录,带你一起领略其中奥妙。
目录
- 1、N-gram语言模型
- 2、神经网络语言模型(NNLM)
- 3、One-hot
- 4、Word2vec
- 5、ELMo
- 6、Open AI GPT
- 7、BERT
- 8、XLNet
- 9、Attention机制
- 10、transfermer
正文
1、N-gram语言模型
-
统计语言模型
对于一段文本序列:
它的概率可以表示为:
即将序列的联合概率转化为一系列条件概率的乘积。问题变成了如何去预测这些给定words下的条件概率:
-
统计语言模型简化版本——N-gram模型
常见的如bigram模型(N=2)和trigram模型(N=3),很少会考虑N>3。
-
(1)符号表示:
word序列:w1, w2, w3, … , wn
链式规则:P(w1, w2,w3, … , wn)=P(w1)P(w2|w1)P(w3|w1,w2)…P(wn|w1,w2,…,wn-1) -
(2)N-gram:
(2.1)对于1-gram,其假设是
P(wn|w1,w2,…,wn-1)≈P(wn|wn-1)P(w1, w2, w3, … , wn) =P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1) ≈P(w1)P(w2|w1)P(w3|w2)P(w4|w3)…P(wn|wn-1)
(2.2)对于2-gram,其假设是
P(wn|w1,w2,…,wn-1)≈P(wn|wn-1,wn-2)P(w1, w2, w3, … , wn) =P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1) ≈P(w1)P(w2|w1)P(w3|w1w2)P(w4|w2w3)…P(wn|wn-2wn-1)
(2.3)对于3-gram,其假设是
P(wn|w1,w2,…,wn-1)≈P(wn|wn-1,wn-2,wn-3)P(w1, w2, w3, … , wn) =P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1) ≈P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|wn-3wn-2wn-1)
2、神经网络语言模型(NNLM)
Begio(贝西奥)等人在2003年提出
网络结构:
整个模型可以概括为如下公式:
3、one-hot编码
-
什么是One-hot编码
one-hot编码,又称独热编码、一位有效编码。其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。 -
举例说明
有三句话:
我喜欢北京
爸爸喜欢深圳
妈妈喜欢上海
先对三句话分词,获取词典,然后进行索引编号:
我:1;喜欢:2;北京:3;爸爸:4;深圳:5;妈妈:6;上海:7然后得到每个特征词的向量如下:
我 ->(1,0,0,0,0,0,0)
喜欢 -> (0,1,0,0,0,0,0)
北京 -> (0,0,1,0,0,0,0)
爸爸 -> (0,0,0,1,0,0,0)
妈妈 -> (0,0,0,0,1,0,0)
深圳 -> (0,0,0,0,0,1,0)
上海 -> (0,0,0,0,0,0,1)
然后我们有单个词的one-hot表示可以得到语料库中三句话的特征向量:
我喜欢北京 –> (1,1,1,0,0,0,0)
爸爸喜欢深圳 –> (0,1,0,1,0,1,0)
妈妈喜欢上海 –> (0,1,0,0,1,0,1) -
one-hot编码在文本表示的优缺点
-
优点:
1、解决了分类器不好处理离散数据的问题;
2、在一定程度上也起到了扩充特征的作用; -
缺点:
1、它基于词袋模型,不考虑词与词之间的顺序;
2、它假设词与词相互独立(在大多数情况下,词与词是相互影响的);
3、它得到的特征是离散稀疏的(在词典过大的情况下,表现尤为突出);
-
4、Word2Vec
-
Continuous Bag of Words Model(CBOW)
给定上下文预测目标词的概率分布,例如,给定{我,喜欢, (),苹果}预测中心词是“吃”的概率,模型的结构如下:
-
Skip-Gram Model
skip-gram模型是给定目标词预测上下文的概率值,模型的结构如下:
- Skip-Gram细节
- Skip-Gram细节
5、ELMo
ELMo: Embeddings from Language Models
已知tokens = (t1,t2,…,tN)
ELMo是Bidirectional language models。具体可以表示为:
给定前k-1个token序列计算第k个token出现的概率:
同理,后向的计算方法:
biLM训练过程中的目标就是最大化:
这里的
Θ
x
Θ_x
Θx代表token embedding,
Θ
s
Θ_s
Θs代表softmax layer的参数。
ELMo对于每个
t
k
t_k
tk, 通过一个L层的biLM计算出2L+1个表示:
6、Open AI GPT
利用了Transformer网络代替了LSTM作为语言模型来更好的捕获长距离语言结构。然后在进行具体任务有监督微调时使用了语言模型作为附属任务训练目标。
仍然使用的是标准的语言模型目标函数,即通过前k个词预测当前词,但是在语言模型网络上他们使用了google团队在《Attention is all your need》论文中提出的Transformer解码器作为语言模型。Transformer模型主要是利用自注意力(self-attention)机制的模型。
7、BERT
BERT是使用Transformer的编码器来作为语言模型,在语言模型预训练的时候,提出了两个新的目标任务(即遮挡语言模型MLM和预测下一个句子的任务)
在语言模型上,BERT使用的是Transformer编码器,并且设计了一个小一点的Base结构和一个更大的Large网络结构。
ELMo、OpenAI GPT、BERT对比
-
(1)语言模型结构:
BERT使用的是Transformer编码器,由于self-attention机制,所以模型上下层直接全部互相连接的。
而OpenAI GPT使用的是Transformer解码器,它是一个需要从左到右的受限制的Transformer。
而ELMo使用的是双向LSTM,虽然是双向的,但是也只是在两个单向的LSTM的最高层进行简单的拼接。
所以只有BERT是真正在模型所有层中是双向的。
-
(2)模型的输入
BERT使用了WordPiece embedding作为词向量,并加入了位置向量和句子切分向量。并在每一个文本输入前加入了一个CLS向量,后面会有这个向量作为具体的分类向量。
-
(3)语言模型预训练
BERT不在使用标准的从左到右预测下一个词作为目标任务,而是提出了两个新的任务。
第一个任务他们称为MLM,即在输入的词序列中,随机的挡上15%的词,然后任务就是去预测挡上的这些词,可以看到相比传统的语言模型预测目标函数,MLM可以从任何方向去预测这些挡上的词,而不仅仅是单向的。但是这样做会带来两个缺点:1)预训练用[MASK]提出挡住的词后,在微调阶段是没有[MASK]这个词的,所以会出现不匹配;2)预测15%的词而不是预测整个句子,使得预训练的收敛更慢。但是对于第二点,作者们觉得虽然是慢了,但是效果提升比较明显可以弥补。
对于第一点他们采用了下面的技巧来缓解,即不是总是用[MASK]去替换挡住的词,在10%的时间用一个随机词去替换,10%的时间就用这个词本身。而对于传统语言模型,并没有对句子之间的关系进行考虑。为了让模型能够学习到句子之间的关系,作者们提出了第二个目标任务就是预测下一个句子。其实就是一个二元分类问题,50%的时间,输入一个句子和下一个句子的拼接,分类标签是正例,而另50%是输入一个句子和非下一个随机句子的拼接,标签为负例。最后整个预训练的目标函数就是这两个任务的取和求似然。
-
(4)微调
在微调阶段,不同任务的模型如下图,只是在输入层和输出层有所区别,然后整个模型所有参数进行微调。
ELMo、OpenAI GPT、BERT优缺点
-
1、ELMo机制(contextual word embedding)
word2vec中,是不含上下文的,而ELMo改进了word2vec的这个缺点.ELMo的具体结构如图所示:
采用多层双向的LSTM,最后word embedding结果,采用各层word embedding结果的加权平均。
虽然ELMo机制包含了上下文信息,但是,ELMo训练的word embedding并不适用于特定的任务。因为ELMo中训练的word embedding是基于一个普适语料库,并不一定 与 “特定任务中的 context”相吻合。
-
2、OpenAI GPT
OpenAI GPT在ELMo的基础上 改进了一些,使得OpenAI GPT能够 适用于 特定任务,具体改进点有:
1)将ELMo中的LSTM改为了用transformer(使用的是没有encoder的transformer),使得OpenAI GPT能够训练更深的model;
2)OpenAI GPT将根据语料库训练出的word embedding,又根据特定任务进行了微调。
OpenAI GPT使用的还是“语言模型”的那套思路,transformer中的self-attention只能使用word前边的一系列word,而不能用word后边的word。 -
3、Bert
-
BERT相比OpenAI GPT的几个优势:
1)弥补了OpenAI GPT中self-attention只能利用前向word的缺陷;
2)弥补了 Pretraining 和 fine tuning的不匹配;pretraining时利用的是 语言模型,输入只有一个sentence,但是fine tuning时,根据task的不同,输入可能是多个sentence; -
BERT存在的一些问题:
1)基于DAE预训练模型虽然可以很好地建模双向语境信息,但由于需要 mask 一部分输入,从而忽略了被 mask 位置之间的依赖关系
2)出现预训练和微调效果的差异(pretrain-finetune discrepancy)。
-
8、XLNet
XLNet是一种基于 a novel generalized permutation language modeling objective的无监督表示学习方法。此外,采用Transformer-XL作为主干模型,在长文本表示的语言任务中表现出了卓越的性能。
首先,XLNet 不使用传统 AR 模型中固定的前向或后向因式分解顺序,而是最大化所有可能因式分解顺序的期望对数似然。由于对因式分解顺序的排列操作,每个位置的语境都包含来自左侧和右侧的 token。因此,每个位置都能学习来自所有位置的语境信息,即捕捉双向语境。
其次,作为一个泛化 AR 语言模型,XLNet 不依赖残缺数据。因此,XLNet 不会有 BERT 的预训练-微调差异。同时,自回归目标提供一种自然的方式,来利用乘法法则对预测 token 的联合概率执行因式分解(factorize),这消除了 BERT 中的独立性假设。
除了提出一个新的预训练目标,XLNet 还改进了预训练的架构设计。
简单地使用 Transformer(-XL) 架构进行基于排列的(permutation-based)语言建模是不成功的,因为因式分解顺序是任意的、训练目标是模糊的。因此,研究人员提出,对 Transformer(-XL) 网络的参数化方式进行修改,移除模糊性。
-
目标:排列语言建模(Permutation Language Modeling)
为了提供一个完整的概览图,研究者展示了一个在给定相同输入序列 x(但因式分解顺序不同)时预测 token x_3 的示例,如下图所示:
-
模型架构:对目标感知表征的双流自注意力
下图 2 的 a、b 分别展示了这两种表征的学习。其中内容表征与 Transformer 的隐藏状态类似,它将同时编码输入本身的内容及上下文信息。Query 表征仅能获取上下文信息及当前的位置,它并不能获取当前位置的内容。具体来说,他们借鉴了 Transformer-XL 中的两项重要技术——相对位置编码范式和分割循环机制。现在,结合双流注意力和 Transformer-XL 的改进,上面图 2© 展示了最终的排列语言建模架构。
图 2:(a)内容流注意力,与标准自注意力相同;(b)Query 流注意力,没有获取内容 x z t x_{z_t} xzt 的信息;(c)利用双流注意力的排列语言建模概览图。
原论文:
9、attention机制
-
Encoder-Decoder框架
Encoder顾名思义就是对输入句子X进行编码,将输入句子通过非线性变换转化为中间语义表示C:
对于解码器Decoder来说,其任务是根据句子 X X X的中间语义表示 C C C和之前已经生成的历史信息 y 1 , y 2 … . y i − 1 y_1,y_2….y_{i-1} y1,y2….yi−1来生成i时刻要生成的单词 y i y_i yi
-
引入AM模型的Encoder-Decoder框架
-
举例
输入的是英文句子:Tom chase Jerry
生成中文单词:“汤姆”,“追逐”,“杰瑞”
引入AM模型的话,应该在翻译“杰瑞”的时候,体现出英文单词对于翻译当前中文单词不同的影响程度,比如给出类似下面一个概率分布值:
(Tom,0.3) (Chase,0.2) (Jerry,0.5)
每个英文单词的概率代表了翻译当前单词“杰瑞”时,注意力分配模型分配给不同英文单词的注意力大小。每个Ci的计算过程:
-
Ci计算公式:
-
例子说明:
假设Ci中那个i就是上面的“汤姆”,那么Tx就是3,代表输入句子的长度,h1=f(“Tom”),h2=f(“Chase”),h3=f(“Jerry”),对应的注意力模型权值分别是0.6,0.2,0.2,所以g函数就是个加权求和函数。如果形象表示的话,翻译中文单词“汤姆”的时候,数学公式对应的中间语义表示Ci的形成过程类似下图:
-
a如何计算?
Encoder采用RNN模型,Decoder也采用RNN模型,这是比较常见的一种模型配置,则图1的图转换为下图:
用下图可以较为便捷地说明注意力分配概率分布值的通用计算过程:
计算生成Yi时的输入句子单词“Tom”、“Chase”、“Jerry”对Yi来说的注意力分配概率分布,那么可以用i时刻的隐层节点状态Hi去一一和输入句子中每个单词对应的RNN隐层节点状态hj进行对比,即通过函数F(hj,Hi)来获得目标单词Yi和每个输入单词对应的对齐可能性,这个F函数在不同论文里可能会采取不同的方法,然后函数F的输出经过Softmax进行归一化就得到了符合概率分布取值区间的注意力分配概率分布数值。论文“A Neural Attention Model for Sentence Summarization”中,Rush用AM模型来做生成式摘要给出的一个AM的一个非常直观的例子。
NLP中常用attention的计算方法:
Attention函数的本质可以被描述为一个查询(query)到一系列(键key-值value)对的映射,如下图。
在计算attention时主要分为三步,第一步是将query和每个key进行相似度计算得到权重,常用的相似度函数有点积,拼接,感知机等;然后第二步一般是使用一个softmax函数对这些权重进行归一化;最后将权重和相应的键值value进行加权求和得到最后的attention。目前在NLP研究中,key和value常常都是同一个,即key=value。
-
多头attention(Multi-head attention):
放缩点积attention(scaled dot-Product attention)
多头attention(Multi-head attention)结构如下图:
-
Self-attention
self-attention显然是attention机制的一种。上面所讲的attention是输入对输出的权重,例如在将“I am a student”翻译成中文“我是一个学生”中,是“I am a student ”对“学生”的权重。self-attention则是自己对自己的权重,例如I am a student分别对am的权重、对student的权重。之所以这样做,是为了充分考虑句子之间不同词语之间的语义及语法联系。 -
Self-attention权值怎么计算?
10、Transformer
Transformer的主体结构图:
-
模型分为编码器和解码器两个部分。
编码器由6个相同的层堆叠在一起,每一层又有两个支层。第一个支层是一个多头的自注意机制,第二个支层是一个简单的全连接前馈网络。在两个支层外面都添加了一个residual的连接,然后进行了layer nomalization的操作。模型所有的支层以及embedding层的输出维度都是dmodeldmodel。
解码器也是堆叠了六个相同的层。不过每层除了编码器中那两个支层,解码器还加入了第三个支层,如图中所示同样也用了residual以及layer normalization。具体的细节后面再讲。 -
输入层
编码器和解码器的输入就是利用学习好的embeddings将tokens(一般应该是词或者字符)转化为d维向量。对解码器来说,利用线性变换以及softmax函数将解码的输出转化为一个预测下一个token的概率。 -
位置向量
由于模型没有任何循环或者卷积,为了使用序列的顺序信息,需要将tokens的相对以及绝对位置信息注入到模型中去。论文在输入embeddings的基础上加了一个“位置编码”。位置编码和embeddings由同样的维度都是dmodeldmodel所以两者可以直接相加。有很多位置编码的选择,既有学习到的也有固定不变的。
使用位置编码表示序列的顺序:
- 残差(The Residuals)
我们之前提到过一个细节,每个编码模块的子层(自注意力层和前馈网络层)中间都有残差(residual)连接,然后紧跟着一个层标准化步骤。
展开:
整体看Transformer的编、解码模块(以两层为例),它长这样:
参考
https://www.jianshu.com/p/e91f061d6d91
https://blog.csdn.net/qq_36330643/article/details/80143960
https://cloud.tencent.com/developer/article/1449495
https://baijiahao.baidu.com/s?id=1636855977017438795&wfr=spider&for=pc
https://blog.csdn.net/u014765410/article/details/90294889
https://arxiv.org/pdf/1906.08237.pdf