Introduction

传统的RNN基于简单的输入输出的上下文位置输出表示
对并行计算的支持不好,Transformer完全基于注意力机制,缓解了这个问题

BackGround

在原先的卷积和循环神经网络里,操作的数目取决于上下文所处的位置,这就使得对于距离比较遥远的输入输出之间的关系难以捕捉,在transformer里使用多头注意力(Multi-Attention)解决了这个问题

Model Architecture

概述:比较有竞争力的就是Encoder-Decoder框架
Encoder编码出序列结构,然后Decoder根据这个序列和上一个状态的输出,做出目前状态的输出
image.png

Encoder-Decoder

Encoder

encoder就是用的一个多头注意力和一个简单的FeedForward,中间使用residual connection(残差网络?)

Decoder

Decoder增加了一个多头注意力层
但是对应的也做出了一些修改

We also modify the self-attention sub-layer in the decoder stack to prevent positions from attending to subsequent positions. This masking, combined with fact that the output embeddings are offset by one position, ensures that the predictions for position i can depend only on the known outputs at positions less than i.

  • query和key有些部分是填充的,这些需要用mask屏蔽,一个简单的方法就是赋予一个很小很小的值或者直接变为0值。
  • 对于decoder的来说,我们是不能看到未来的信息的,所以对于decoder的输入,我们只能计算它和它之前输入的信息的相似度。

作者:文哥的学习日记

链接:https://www.jianshu.com/p/b1030350aadb

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Attention

QKV

计算自注意力的第一步就是从每个编码器的输入向量(每个单词的词向量)中生成三个向量。也就是说对于每个单词,我们创造一个查询向量、一个键向量和一个值向量。这三个向量是通过词嵌入与三个权重矩阵后相乘创建的。可以发现这些新向量在维度上比词嵌入向量更低。他们的维度是64,而词嵌入和编码器的输入/输出向量的维度是512. 但实际上不强求维度更小,这只是一种基于架构上的选择,它可以使多头注意力(multiheaded Attention)的大部分计算保持不变。X1与WQ权重矩阵相乘得到q1, 就是与这个单词相关的查询向量。最终使得输入序列的每个单词的创建一个查询向量、一个键向量和一个值向量。

2.2 ScaledDot-ProductAttention(缩放点积注意力)

  像大部分NLP应用一样,我们首先将每个输入单词通过词嵌入算法转换为词向量。每个单词都被嵌入为512维的向量,我们用一些简单的方框来表示这些向量。词嵌入过程只发生在最底层的编码器中。所有的编码器都有一个相同的特点,即它们接收一个向量列表,列表中的每个向量大小为512维。在底层(最开始)编码器中它就是词向量,但是在其他编码器中,它就是下一层编码器的输出(也是一个向量列表)。向量列表大小是我们可以设置的超参数——一般是我们训练集中最长句子的长度。将输入序列进行词嵌入之后,每个单词都会流经编码器中的两个子层。

  接下来我们看看Transformer的一个核心特性,在这里输入序列中每个位置的单词都有自己独 特的路径流入编码器。在自注意力层中,这些路径之间存在依赖关系。而前馈(feed-forward)层没有这些依赖关系。因此在前馈(feed-forward)层时可以并行执行各种路径。

  首先从输入开始理解,Scaled Dot-Product Attention里的Q, K, V从哪里来:按照我的理解就是给我一个输入X, 通过3个线性转换把X转换为Q,K,V。两个单词,Thinking, Machines. 通过嵌入变换会X1,X2两个向量[1 x 4]。分别与Wq,Wk,Wv三个矩阵[4x3]想做点乘得到,{q1,q2},{k1,k2},{v1,v2} 6个向量[1x3]。

Attention is All you Need - 图2

2.2.1 QKV线性转换

  向量{q1,k1}做点乘得到得分(Score) 112, {q1,k2}做点乘得到得分96。

Attention is All you Need - 图3

2.2.2 QK点乘结果

  对该得分进行规范,除以8。这个在论文中的解释是为了使得梯度更稳定。之后对得分[14,12]做softmax得到比例 [0.88,0.12]。

Attention is All you Need - 图4

2.2.3 softmax处理

  用得分比例[0.88,0.12] 乘以[v1,v2]值(Values)得到一个加权后的值。将这些值加起来得到z1。这就是这一层的输出。仔细感受一下,用Q,K去计算一个thinking对thinking, machine的权重,用权重乘以thinking,machine的V得到加权后的thinking,machine的V,最后求和得到针对各单词的输出Z。(译注:自注意力的另一种解释就是在编码某个单词时,就是将所有单词的表示(值向量)进行加权求和,而权重是通过该词的表示(键向量)与被编码词表示(查询向量)的点积并通过softmax得到。),然后即得到自注意力层在该位置的输出(在我们的例子中是对于第一个单词)。

  上述例子是单个向量的运算例子。下图展示的是矩阵运算的例子。输入是一个[2x4]的矩阵(单词嵌入),每个运算是[4x3]的矩阵,求得Q,K,V。Q对K转制做点乘,除以dk的平方根。做一个softmax得到合为1的比例,对V做点乘得到输出Z。那么这个Z就是一个考虑过thinking周围单词(machine)的输出。

Attention is All you Need - 图5

2.2.4 矩阵表示

Attention is All you Need - 图6

2.2.5 矩阵运算表示

  QKT其实就会组成一个word2word的Attentionmap!(加了softmax之后就是一个合为1的权重了)。比如说你的输入是一句话 “i have a dream” 总共4个单词,这里就会形成一张4x4的注意力机制的图:

Attention is All you Need - 图7

2.2.6 4*4注意力机制图

  这样一来,每一个单词就对应每一个单词有一个权重。主要Encoder里做Self-AttentionDecoder里面叫做masked Self-Attention在这里的masked就是要在做language modelling(或者翻译)的时候,不给模型看到未来的信息。masked就是不给模型看到未来的信息,mask就是沿对角线把灰色的区域用0覆盖掉。详细的来说,i作为第一个单词,只能有和i自己的Attention。have作为第二个单词,有和i, have 两个Attention。a 作为第三个单词,有和i,have,a 前面三个单词的Attention。到了最后一个单词dream的时候,才有对整个句子4个单词的Attention。做完softmax后就像这样,横轴和为1。

Attention is All you Need - 图8

2.2.7 softmax矩阵表示

2.3 Multi-HeadAttention(多头注意力机制)

  Multi-Head Attention就是把Scaled Dot-Product Attention的过程做H次,然后把输出Z合起来。论文中,它的结构图如下:

Attention is All you Need - 图9

2.3.1 多头注意力机制结构图

  论文中还增加一种称为Multi-Headed注意力机制,可以提升注意力层的性能。我们还是以上面矩阵的形式来解释:

Attention is All you Need - 图10

2.3.2多头注意力矩阵表示

  它使得模型可以关注不同位置。虽然在上面的例子中,z1 包含了一点其他位置的编码,但当前位置的单词还是占主要作用, 当我们想知道“The animal didn’t cross the street because it was too tired” 中 it 的含义时,这时就需要关注到其他位置。这个机制为注意层提供了多个“表示子空间”(representation Subspaces)。下面我们将具体介绍:

  (1)经过 Multi-Headed,我们会得到和 heads 数目一样多的 Query / Key / Value 权重矩阵组.论文中用了8个,那么每个Encoder/Decoder我们都会得到 8 个集合。这些集合都是随机初始化的,经过训练之后,每个集合会将input Embeddings (或者来自较低编码器/解码器的向量)投影到不同的表示子空间中。

  (2)我们重读记忆八次相似的操作,得到八个Zi矩阵。简单来说,就是定义8组权重矩阵,每个单词会做8次上面的Self-Attention的计算这样每个单词就会得到8个不同的加权求和Z。

Attention is All you Need - 图11

2.3.3 单词加权求和

  (3)feed-forward处只能接受一个矩阵,所以需要将这八个矩阵压缩成一个矩阵。方法就是先将八个矩阵连接起来,然后乘以一个额外的权重矩阵W0。为了使得输出与输入结构对标 乘以一个线性W0 得到最终的Z

Scaled Dot-Product Attention

这里的计算除于dk的原因:

We suspect that for large values of dk, the dot products grow large in magnitude, pushing the softmax function into regions where it has extremely small gradients

另一种的注意力机制就是Additive Attention
虽然二者的理论上的复杂度是相似的,但是Dot Attention更加省空间,更快

这里d是key的embedding长度。

Multi-Head Attention

多头注意力使用了多个head,每一个head对V,K,Q向量乘上了Linear进行降维缩小,然后做Scale Dot Attention
虽然使用了多头,但是由于先前进行了降维,所以实质的计算复杂度是差不多的
(同时由于使用了多头注意力,所以代码的并行化进一步的提高)
image.png
image.png

Applications of Attention in our Model

这里没有完全看懂 有点懵,本质上没有使用卷积和循环神经网络
对于原文里经常出现的position一词的理解,,不知道是不是指的就是输入和输出里不同位置的词

Position-wise Feed-Forward Networks

本质就是套了ReLu的两层全连接层
中间的隐藏层是2048的,输入输出是512的
image.png

Embeddings and Softmax

Encode和Decode共享嵌入矩阵的值
下面的描述没看懂

pre-softmax linear transformation, similar to [30]. In the embedding layers, we multiply those weights by dmodel.

Positional Encoding

由于没有卷积和循环神经网络,所以为了充分的利用上下文的序列数据信息,所以增加了位置编码
(具体原理也是没有看懂,为什么公式哪个样子)

Why Self-Attention

使用Self-Attention的原因

  1. 每一层神经网络的计算复杂度
  2. 神经网络对并行计算的支持:序列化计算的需求
  3. 神经网络中对长距离依赖的路径长度:一个因素就是在网络计算中数据的正反向传输距离
    1. self-attention限制在输出序列位置的输入序列周边大小为r的临近区域

相对而言,每一个单独的Attention Head都捕捉到了原句子的语法和语义结构