Attention

作者: 京漂的小程序媛儿 | 来源:发表于2020-06-15 21:05 被阅读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结合使用,不能并行化

    相关文章

      网友评论

          本文标题:Attention

          本文链接:https://www.haomeiwen.com/subject/qnwhxktx.html