(一)——Seq2Seq中的Attention
https://zhuanlan.zhihu.com/p/47063917
这一篇先来介绍早期的在Machine Translation(机器翻译)中Attention机制与RNN的结合。
1.1 RNN结构的局限
机器翻译解决的是输入是一串在某种语言中的一句话,输出是目标语言相对应的话的问题,如将德语中的一段话翻译成合适的英语。之前的Neural Machine Translation(一下简称NMT)模型中,通常的配置是encoder-decoder结构,即encoder读取输入的句子将其转换为定长的一个向量,然后decoder再将这个向量翻译成对应的目标语言的文字。通常encoder及decoder均采用RNN结构如LSTM或GRU等(RNN基础知识可参考循环神经网络RNN——深度学习第十章),如下图所示,我们利用encoder RNN将输入语句信息总结到最后一个hidden vector中,并将其作为decoder初始的hidden vector,利用decoder解码成对应的其他语言中的文字。
但是这个结构有些问题,尤其是RNN机制实际中存在长程梯度消失的问题,对于较长的句子,我们很难寄希望于将输入的序列转化为定长的向量而保存所有的有效信息,所以随着所需翻译句子的长度的增加,这种结构的效果会显著下降。
1.2 Attention机制的引入
为了解决这一由长序列到定长向量转化而造成的信息损失的瓶颈,Attention注意力机制被引入了。
- Attention机制跟人类翻译文章时候的思路有些类似,即将注意力关注于我们翻译部分对应的上下文。
- 同样的,Attention模型中,当我们翻译当前词语时,我们会寻找源语句中相对应的几个词语,并结合之前的已经翻译的部分作出相应的翻译
- 如下图所示,当我们翻译“knowledge”时,只需将注意力放在源句中“知识”的部分,当翻译“power”时,只需将注意力集中在"力量“
- 这样,当我们decoder预测目标翻译的时候就可以看到encoder的所有信息,而不仅局限于原来模型中定长的隐藏向量,并且不会丧失长程的信息。
feb4e6b8-2397-11eb-9748-0eb2
以上是直观理解,我们来详细的解释一下数学上对应哪些运算。
这里关键的操作是计算encoder与decoder state之间的关联性的权重,得到Attention分布,从而对于当前输出位置得到比较重要的输入位置的权重,在预测输出时相应的会占较大的比重。
通过Attention机制的引入,我们打破了只能利用encoder最终单一向量结果的限制,从而使模型可以集中在所有对于下一个目标单词重要的输入信息上,使模型效果得到极大的改善。还有一个优点是,我们通过**观察attention 权重矩阵的变化**,可以更好地知道哪部分翻译对应哪部分源文字,有助于更好的理解模型工作机制,如下图所示。
当然,一个自然的疑问是,Attention机制如此有效,那么我们**可不可以去掉模型中的RNN部分,仅仅利用Attention**呢?下一篇会详细解释谷歌在Attention is All you need中提出的self-attention机制及Transformer架构
(二)——Self-Attention与Transformer
https://zhuanlan.zhihu.com/p/47282410
上一篇Attention机制详解(一)——Seq2Seq中的Attention回顾了早期Attention机制与RNN结合在机器翻译中的效果,RNN由于其顺序结构训练速度常常受到限制,既然Attention模型本身可以看到全局的信息, 那么一个自然的疑问是我们能不能去掉RNN结构,仅仅依赖于Attention模型呢,这样我们可以使训练并行化,同时拥有全局信息?
直观理解与模型整体结构
先来看一个翻译的例子“I arrived at the bank after crossing the river” 这里面的bank指的是银行还是河岸呢,这就需要我们联系上下文,当我们看到river之后就应该知道这里bank很大概率指的是河岸。在RNN中我们就需要一步步的顺序处理从bank到river的所有词语,而当它们相距较远时RNN的效果常常较差,且由于其顺序性处理效率也较低。Self-Attention则利用了Attention机制,计算每个单词与其他所有单词之间的关联,在这句话里,当翻译bank一词时,river一词就有较高的Attention score。利用这些Attention score就可以得到一个加权的表示,然后再放到一个前馈神经网络中得到新的表示,这一表示很好的考虑到上下文的信息。如下图所示,encoder读入输入数据,利用层层叠加的Self-Attention机制对每一个词得到新的考虑了上下文信息的表征。Decoder也利用类似的Self-Attention机制,但它不仅仅看之前产生的输出的文字,而且还要attend encoder的输出。以上步骤如下动图所示:
-
在RNN中我们就需要**一步步的顺序处理**从bank到river的所有词语,而当它们相距较远时RNN的效果常常较差,且由于其顺序性处理效率也较低。
-
Self-Attention则利用了Attention机制,计算每个单词与其他所有单词之间的关联,在这句话里,当翻译bank一词时,river一词就有较高的Attention score。
- 利用这些Attention score就可以得到一个加权的表示,然后再放到一个前馈神经网络中得到新的表示,这一表示很好的考虑到上下文的信息。
- 如下图所示,encoder读入输入数据,利用层层叠加的Self-Attention机制对每一个词得到新的考虑了上下文信息的表征。Decoder也利用类似的Self-Attention机制,但它不仅仅看之前产生的输出的文字,而且还要attend encoder的输出。以上步骤如下动图所示:
1234
Transformer模型的整体结构如下图所示
这里面Multi-head Attention其实就是多个Self-Attention结构的结合,每个head学习到在不同表示空间中的特征,如下图所示,两个head学习到的Attention侧重点可能略有不同,这样给了模型更大的容量。
Self-Attention详解
了解了模型大致原理,我们可以详细的看一下究竟Self-Attention结构是怎样的。其基本结构如下
这里可能比较抽象,我们来看一个具体的例子(图片来源于https://jalammar.github.io/illustrated-transformer/,该博客讲解的极其清晰,强烈推荐),假如我们要翻译一个词组Thinking Machines,其中Thinking的输入的embedding vector用 x1 表示,Machines的embedding vector用 x2 表示。
当我们处理Thinking这个词时,我们需要计算句子中所有词与它的Attention Score,这就像将当前词作为搜索的query,去和句子中所有词(包含该词本身)的key去匹配,看看相关度有多高。我们用 q1 代表Thinking对应的query vector, k1 及 k2 分别代表Thinking以及Machines对应的key vector,则计算Thinking的attention score的时候我们需要计算 q1 与 k1,k2 的点乘,同理,我们计算Machines的attention score的时候需要计算q2 与 k1,k2 的点乘。如上图中所示我们分别得到了q1 与 k1,k2 的点乘积,然后我们进行尺度缩放与softmax归一化,如下图所示:
- 当我们处理Thinking这个词时,我们需要计算句子中所有词与它的Attention Score,
- 这就像将当前词作为搜索的query,去和句子中所有词(包含该词本身)的key去匹配,看看相关度有多高。
- 我们用 q1 代表Thinking对应的query vector, k1 及 k2 分别代表Thinking以及Machines对应的key vector,则计算Thinking的attention score的时候我们**需要计算 q1 与 k1,k2 的点乘**
- 然后我们进行尺度缩放与softmax归一化,如下图所示:
- 显然,当前单词与其自身的attention score一般最大,其他单词根据与当前单词重要程度有相应的score。然后我们在用这些attention score与value vector相乘,得到加权的向量。
- 如果将输入的所有向量合并为矩阵形式,则所有query, key, value向量也可以合并为矩阵形式表示
- 其中 WQ,WK,WV 是我们模型训练过程学习到的合适的参数。上述操作即可简化为矩阵形式
- 其中 WQ,WK,WV 是我们模型训练过程学习到的合适的参数。上述操作即可简化为矩阵形式
- 而multihead就是我们可以有不同的Q,K,V表示,最后再将其结果结合起来,如下图所示:
- 这就是基本的Multihead Attention单元,对于encoder来说就是利用这些基本单元叠加,其中key, query, value均来自前一层encoder的输出,即encoder的每个位置都可以注意到之前一层encoder的所有位置【看Transformer模型就知道了】。
- 对于decoder来讲,我们注意到有两个与encoder不同的地方,一个是第一级的Masked Multi-head,另一个是第二级的Multi-Head Attention不仅接受来自前一级的输出,还要接收encoder的输出,下面分别解释一下是什么原理。
- 第一级decoder的key, query, value均来自前一层decoder的输出,但加入了Mask操作,即我们只能attend到前面已经翻译过的输出的词语,因为翻译过程我们当前还并不知道下一个输出词语,这是我们之后才会推测到的。
- 而第二级decoder也被称作encoder-decoder attention layer,即它的query来自于之前一级的decoder层的输出,但**其key和value来自于encoder的输出**,这使得decoder的每一个位置都可以attend到输入序列的每一个位置。
- 总结一下,k和v的来源总是相同的,q在encoder及第一级decoder中与k,v来源相同,在encoder-decoder attention layer中与k,v来源不同。
论文其他细节解读
- 我们再来看看论文其他方面的细节,一个是**position encoding**,这个目的是什么呢?
- 注意由于该模型没有recurrence或convolution操作,所以没有明确的关于单词在源句子中位置的相对或绝对的信息
- 为了更好的让模型学习位置信息,所以添加了position encoding并将其叠加在word embedding上。
- Add & Norm模块
- 其中Add代表了Residual Connection(残差连接),是为了解决多层神经网络训练困难的问题,通过将前一层的信息无差的传递到下一层,可以有效的仅关注差异部分,这一方法之前在图像处理结构如ResNet等中常常用到。
- Norm则代表了Layer Normalization,通过**对层的激活值的归一化,可以加速模型的训练过程,使其更快的收敛**
- 其中Add代表了Residual Connection(残差连接),是为了解决多层神经网络训练困难的问题,通过将前一层的信息无差的传递到下一层,可以有效的仅关注差异部分,这一方法之前在图像处理结构如ResNet等中常常用到。
完全的不依赖于RNN结构仅利用Attention机制的Transformer由于其并行性和对全局信息的有效处理使其获得了较之前方法更好的翻译结果,在这基础上,Attention和Transformer架构逐步被应用在自然语言处理及图像处理等领域,下一篇将会介绍这些方面的应用。
(三)——Attention模型的应用
https://zhuanlan.zhihu.com/p/47613793
自然语言处理
之前已经见过Attention模型对于机器翻译(Attention is All you need)有非常很好的效果,那么在自然语言处理方面Attention模型还有哪些其他应用呢?我们通过总结以下几篇论文来了解以下:
这篇文章主要是结合了Transformer结构与RNN中循环归纳的优点,使得Transformer结构能够适用更多自然语言理解的问题。其改进的结构如下
可以看到,通过引入Transition Function,我们对Attention可以进行多次循环。这一机制被有效的应用到诸如问答,根据主语推测谓语,根据上下填充缺失的单词,数字字符串运算处理,简易程序执行,机器翻译等场景。
(2)BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
这也是最近自然语言处理领域比较火的文章,打破了多项benchmark,主要是利用双向Transformer进行预处理,得到包含有上下文信息的表示,这一表示可进一步用来fine-tune很多种自然语言处理任务。下图是BERT模型(双向Tansformer结构)与OpenAI GPT(单向Transformer结构)与ElMo(双向独立LSTM最终组合的结构)的对比。
BERT的表示进行fine-tuning后,对于GLUE Benchmark(主要包含MNLI,RTE:比较两个句子的语义关系,QQP:判别Quora上两个问题相似度,QNLI:问答,SST-2:情感分析,CoLA:语句合理性判别,STS-B, MRPC:句子相似度判别),SQuAD(问答),NER(命名实体识别)等都有极大的提高。将来,可能BERT pre-train在自然语言处理领域就会像VGG, ResNet, Inception等在图像识别里的作用而成为预处理的标配。
(3)Generating Wikipedia by Summarizing Long Sequences
文章生成:通过处理若干篇源文章,提取有效信息,再用Transformer Decoder合成一篇类似于Wikipedia风格的文章,这个模型以后加以改善可以极大的方便人们获取有效信息。