Transform and Attention
RNN模型结构:
缺点:RNN可能存在梯度消失
所以《Attention Is All You Need 》提出利用Attention代替RNN,下面是Transformer的网络结构:
Transformer的内部结构
每一个Encode的内部由Embedding层,self-attention层,全连接层组成,通过Encoder来获取注意力(attention),例如it对于animal的权值最大(颜色最深),那么它的注意力全在animal上
Self_Attention的计算机制其实是由一个公式计算的,X要和权值矩阵W分别相乘得到对应的Query,Key,Value.
mulit-head self attention最后得到的Z进行拼接:
模型共包含三个 attention 成分,分别是 encoder 的 self-attention,decoder 的 self-attention,以及连接 encoder 和 decoder 的 attention。这三个 attention block 都是 multi-head attention 的形式,输入都是 query Q 、key K 、value V 三个元素,只是 Q 、 K 、 V 的取值不同罢了。接下来重点讨论最核心的模块 multi-head attention(多头注意力)。
multi-head attention 由多个 scaled dot-product attention 这样的基础单元经过 stack 而成。
按字面意思理解,scaled dot-product attention 即缩放了的点乘注意力,我们来对它进行研究。
那么 Q、K、V 到底是什么?encoder 里的 attention 叫 self-attention,顾名思义,就是自己和自己做 attention。在传统的 seq2seq 中的 encoder 阶段,我们得到 n 个时刻的 hidden states 之后,可以用每一时刻的 hidden state hi,去分别和任意的 hidden state hj,j=1,2,…,n 计算 attention,这就有点 self-attention 的意思。回到当前的模型,由于抛弃了 RNN,encoder 过程就没了 hidden states,那拿什么做 self-attention 来自嗨呢?
可以想到,假如作为 input 的 sequence 共有 n 个 word,那么我可以先对每一个 word 做 embedding 吧?就得到 n 个 embedding,然后我就可以用 embedding 代替 hidden state 来做 self-attention 了。所以 Q 这个矩阵里面装的就是全部的 word embedding,K、V 也是一样。
所以为什么管 Q 叫query?就是你每次拿一个 word embedding,去“查询”其和任意的 word embedding 的 match 程度(也就是 attention 的大小),你一共要做 n 轮这样的操作。
我们记 word embedding 的 dimension 为 dmodel ,所以 Q 的 shape 就是 n*dmodel, K、V 也是一样,第 i 个 word 的 embedding 为 vi,所以该 word 的 attention 应为:
caled dot-product attention 基本就是这样了。基于 RNN 的传统 encoder 在每个时刻会有输入和输出,而现在 encoder 由于抛弃了 RNN 序列模型,所以可以一下子把序列的全部内容输进去,来一次 self-attention 的自嗨。
理解了 scaled dot-product attention 之后,multi-head attention 就好理解了,因为就是 scaled dot-product attention 的 stacking。
先把 Q、K、V 做 linear transformation,然后对新生成的 Q’、K’、V’ 算 attention,重复这样的操作 h 次,然后把 h 次的结果做 concat,最后再做一次 linear transformation,就是 multi-head attention 这个小 block 的输出了。
Mulit-head self attention 能够让一个单词可对多个单词进行注意力加权,这里的it对animal注意,也对tire注意。
Position Embedding
对每一个位置pos,用和模型embedding维数 dmodel 一样的向量表示,其中奇数位和偶数位的计算公式还不一样。里面还有一个突兀的常数10000.
通过正余弦定理我们可以把位置pos+k的positional embedding表示为
其中
将公式(1)(2)稍作调整,就有
注意啦,pos和pos+k相对距离k是常数,所以有
其中 为常数。
不同位置的position encoding做点乘的可视化。点乘结果会随着相对位置的增加而递减。
总结:
Self-Attention和Encoder-Decoder-Attention的区别:
Self-Attention的Q,K,V均来自同样的输入,因为要算自己跟自己的attention嘛。
Encoder-Decoder_Attention的Q来自decoder的输入,而K,V的计算使用的是encoder的输出,因为我们要计算decoder的输入跟encoder里面每一个的相似度嘛。
感谢原作者,连接:https://www.zhihu.com/question/307293465/answer/745664531