Attention

2020-06-15  本文已影响0人  京漂的小程序媛儿

1. 核心思想

在Decoding阶段对input中的信息赋予不同权重。

在nlp中就是针对sequence的每个time step input,在cv中就是针对每个pixel。

2. 原理解析

针对Seq2seq翻译来说,rnn-based model差不多是图1的样子:

传统rnn-based model

而比较基础的加入attention与rnn结合的model是下面的样子(也叫soft attention):

其中a是h对应的权重,算出所有权重后会进行softmax和加权,得到c 。

Encoding和Decoding阶段仍然是RNN,但是Decoding阶使用attention的输出结果作为rnn的输入

那么重点来了, 权重a是怎么来的呢?常见有三种方法(h和z match的结果):

a=cos_sim(z,h)

a=neural_network(z,h)

a=h(T)wz

思想就是根据当前解码“状态”z来判断输入序列h的权重分布a。

如果把attention剥离出来去看的话,其实是以下的机制:

输入是query(Q), key(K), value(V),输出是attention value。如果与之前的模型对应起来的话,query就是z,key和value都是h。模型通过Q和K的匹配计算出权重,再结合V得到输出:

Attention(Q,K,V) = softmax(sim(Q,K))V

再深入理解下去,这种机制其实做的是寻址(addressing),也就是模仿中央处理器与存储交互的方式将存储的内容读出来,可以看一下李宏毅老师的课程

3. 模型分类

3.1 Soft/Hard Attention

soft attention:传统attention,可被嵌入到模型中去进行训练并传播梯度

hard attention:不计算所有输出,依据概率对encoder的输出采样,在反向传播时需采用蒙特卡洛进行梯度估计

3.2 Global/Local Attention

global attention:传统attention,对所有encoder输出进行计算

local attention:介于soft和hard之间,会预测一个位置并选取一个窗口进行计算

3.3 Self Attention

传统attention是计算Q和K之间的依赖关系,而self attention则分别计算Q和K自身的依赖关系

如何使用向量来计算自注意力,然后来看它实怎样用矩阵来实现。

如何计算自注意力?

第一步:每个编码器的输入向量(每个单词的词向量)中生成三个向量

也就是说对于每个单词,我们创造一个查询向量、一个键向量和一个值向量。这三个向量是通过词嵌入与三个权重矩阵后相乘创建的。

可以发现这些新向量在维度上比词嵌入向量更低。他们的维度是64,而词嵌入和编码器的输入/输出向量的维度是512. 但实际上不强求维度更小,这只是一种基于架构上的选择,它可以使多头注意力(multiheaded attention)的大部分计算保持不变

X1与WQ权重矩阵相乘得到q1, 就是与这个单词相关的查询向量。最终使得输入序列的每个单词的创建一个查询向量、一个键向量和一个值向量。

第二步:计算得分。假设我们在为这个例子中的第一个词“Thinking”计算自注意力向量,我们需要拿输入句子中的每个单词对“Thinking”打分。这些分数决定了在编码单词“Thinking”的过程中有多重视句子的其它部分。

这些分数是通过打分单词(所有输入句子的单词)的键向量K与“Thinking”的查询向量Q相点积(一个数)来计算的。所以如果我们是处理位置最靠前的词的自注意力的话,第一个分数是q1和k1的点积,第二个分数是q1和k2的点积。

第三步和第四步:将分数除以8(8是论文中使用的键向量的维数64的平方根,这会让梯度更稳定。这里也可以使用其它值,8只是默认值),然后通过softmax传递结果。softmax的作用是使所有单词的分数归一化,得到的分数都是正值且和为1。

这个softmax分数决定了每个单词对编码当下位置(“Thinking”)的贡献。显然,已经在这个位置上的单词将获得最高的softmax分数,但有时关注另一个与当前单词相关的单词也会有帮助。

第五步:将每个值向量乘以softmax分数。

第六步是对加权值向量求和。

实际中,这些计算是以矩阵形式完成的,以便算得更快。那我们接下来就看看如何用矩阵实现的。

第一步:计算查询矩阵、键矩阵和值矩阵。

为此,我们将将输入句子的词嵌入装进矩阵X中,将其乘以我们训练的权重矩阵(WQ,WK,WV)。

x矩阵中的每一行对应于输入句子中的一个单词。我们再次看到词嵌入向量 (512,或图中的4个格子)和q/k/v向量(64,或图中的3个格子)的大小差异。

最后,由于我们处理的是矩阵,我们可以将步骤2到步骤6合并为一个公式来计算自注意力层的输出。

3.4 Multi-head Attention

1.它扩展了模型专注于不同位置的能力。在上面的例子中,虽然每个编码都在z1中有或多或少的体现,但是它可能被实际的单词本身所支配(对自己影响最大的就是自己)。如果我们翻译一个句子,比如“The animal didn’t cross the street because it was too tired”,我们会想知道“it”指的是哪个词,这时模型的“多头”注意机制会起到作用。

2.它给出了注意力层的多个“表示子空间”(representation subspaces)。接下来我们将看到,对于“多头”注意机制,我们有多个查询/键/值权重矩阵集(Transformer使用八个注意力头,因此我们对于每个编码器/解码器有八个矩阵集合)。这些集合中的每一个都是随机初始化的,在训练之后,每个集合都被用来将输入词嵌入(或来自较低编码器/解码器的向量)投影到不同的表示子空间中。

在“多头”注意机制下,我们为每个头保持独立的查询/键/值权重矩阵,从而产生不同的查询/键/值矩阵。和之前一样,我们拿X乘以WQ/WK/WV矩阵来产生查询/键/值矩阵。

如果我们做与上述相同的自注意力计算,只需八次不同的权重矩阵运算,我们就会得到八个不同的Z矩阵。

这给我们带来了一点挑战。前馈层不需要8个矩阵,它只需要一个矩阵(由每一个单词的表示向量组成)。所以我们需要一种方法把这八个矩阵压缩成一个矩阵。那该怎么做?其实可以直接把这些矩阵拼接在一起,然后用一个附加的权重矩阵WO与它们相乘

试着把它们集中在一个图片中,这样可以一眼看清

我们在例句中编码“it”一词时,不同的注意力“头”集中在哪里:

当我们编码“it”一词时,一个注意力头集中在“animal”上,而另一个则集中在“tired”上,从某种意义上说,模型对“it”一词的表达在某种程度上是“animal”和“tired”的代表。

4. 优缺点

优点:

在输出序列与输入序列“顺序”不同的情况下表现较好,如翻译、阅读理解

相比RNN可以编码更长的序列信息

缺点:

对序列顺序不敏感

通常和RNN结合使用,不能并行化

上一篇下一篇

猜你喜欢

热点阅读