Attention for Seq2Seq Model,where are an encoder and a decoder.
输入m个向量,encoder将输入信息压缩到m个状态向量 h 1 , . . . , h m h_1,...,h_m h1,...,hm中,最后一个状态信息 h m h_m hm是对所有输入信息的一个概括。decoder是一个文本生成器,生成m个状态 s 1 , . . . , s j − 1 s_1,...,s_{j-1} s1,...,sj−1,第 s j s_j sj是第m+1个状态。
计算:将 S j S_j Sj与所有encoder中的m个状态信息 h 1 , . . . , h m h_1,...,h_m h1,...,hm做对比,用align函数计算相关性, α i j = align ( h i , s j ) \alpha_{i j}=\operatorname{align}\left(\mathbf{h}_{i}, \mathbf{s}_{j}\right) αij=align(hi,sj),将计算结果 α i j \alpha_{i j} αij作为权重。
α : j \alpha_{: j} α:j中的元素全都介于0和1之间,并且相加和为1.以上能得到m个权重。
对 s j s_j sj和 h i h_i hi做线性变换,query的作用是匹配key值,key的作用是被query匹配。通过 q : j q_{: j} q:j与 K T K^T KT中每个元素的匹配,得到的 α : j \alpha_{: j} α:j越大,则匹配程度越高。
其中, W q , W K , W V W_q, W_K,W_V Wq,WK,WV是该层的参数,需要系统学习获得。
计算流程:
剥离RNN就可以得到attention层和self-attention层。
首先考虑基于Seq2Seq的模型,这样的模型有一个编码器和一个解码器。举个例子:想要把英语翻译成德语。那么英语单词就是encoder的输入序列 x 1 , x 2 , . . . , x m x_1,x_2,...,x_m x1,x2,...,xm,decoder依次生成德语单词作为下一轮decoder的输入序列 x 1 ′ , x 2 ′ , . . . , x t ′ x'_1,x'_2,...,x'_t x1′,x2′,...,xt′,接下来新生成的德语单词会成为第t+1个输入。
如果不用RNN,只考虑attention。首先利用encoder的输入 x 1 , x 2 , . . . , x m x_1,x_2,...,x_m x1,x2,...,xm来计算key和value向量,于是 x 1 x_1 x1就被映射成了 k : 1 k_{:1} k:1和 v : 1 v_{: 1} v:1…由此得到m个k和m个v向量。
接着将decoder的输入向量 x 1 ′ , x 2 ′ , . . . , x t ′ x'_1,x'_2,...,x'_t x1′,x2′,...,xt′做线性变换,将其映射道query向量 q : j q_{: j} q:j
接着计算权重。将 q : 1 q_{: 1} q:1与m个k向量做对比(比较相关性),计算出权重 α \alpha α,公式: α : 1 = Softmax ( K T q : 1 ) ∈ R m \alpha_{: 1}=\operatorname{Softmax}\left(\mathbf{K}^{T} \mathbf{q}_{: 1}\right) \in \mathbb{R}^{m} α:1=Softmax(KTq:1)∈Rm
然后计算context向量 c : 1 c_{: 1} c:1,需要用到权重向量 α : 1 \alpha_{: 1} α:1以及所有 v : m v_{: m} v:m。 c : 1 c_{: 1} c:1就是m个v向量的加权平均。
第二个权重向量和context向量和之前计算方式相同,由此就可以计算出所有context向量 c : j c_{: j} c:j。每个c对应一个decoder的输入 x ′ x' x′。decoder中有t个向量,则会计算出t个c值,这些c就是attention layer的输出,用 C C C表示。
回到之前英语翻译德语的例子,m个英语单词输入encoder,然后由decoder来依次产生德语单词。第2个context向量 c : 2 c_{: 2} c:2可以通过key和value向量看到所有的英语单词,即 x 1 , x 2 , . . . , x m x_1,x_2,...,x_m x1,x2,...,xm,同时还能看到 x 2 ′ x'_2 x2′,即当前输入的德语单词。此时可以将 c 2 c_2 c2作为一个特征向量输入到softmax分类器,来计算概率分布 p 2 p_2 p2,然后通过 p 2 p_2 p2抽样得出第三个德语单词,编码成 x 3 ′ x'_3 x3′,作为下一轮的输入(decoder)。
attention layer替代RNN,优势:不会遗忘。attention层的输入是 X X X和 X ′ X' X′,输出是 c 1 , c 2 , . . . , c t c_1,c_2,...,c_t c1,c2,...,ct,每一个 c c c向量对应一个 x ′ x' x′向量.
Attention层用于Seq2Seq有两个输入序列。Self-Attention不是seq2seq,只有一个输入序列。类似普通RNN。self-attention层的输入是两个相同的 X X X序列,一个 c c c向量都对应一个 x x x向量,但 c i c_i ci不止依赖于 x i x_i xi,而是依赖所有 x x x向量,改变其中任何 x x x, c i c_i ci都会发生变化。
self-attention层的原理和attention层的原理完全一样,只是输入不一样。self-attention只有一个输入序列 x 1 , x 2 , . . . , x m x_1,x_2,...,x_m x1,x2,...,xm。
计算过程
第一步是做三种变换:将 x i x_i xi映射到三种向量 q : i , k : i , v : i q_{: i},k_{: i},v_{: i} q:i,k:i,v:i上。参数依然是 W Q , W K , W V W_Q,W_K,W_V WQ,WK,WV。线性变换后, x 1 x_1 x1映射到 q : 1 , k : 1 , v : 1 q_{:1},k_{: 1},v_{: 1} q:1,k:1,v:1,其余类似。
第二步计算权重向量 α \alpha α。权重 α : j \alpha_{: j} α:j依赖于相应的 q : j q_{: j} q:j和所有 k k k。利用公式计算出所有的权重向量: α : j = Softmax ( K T q : j ) ∈ R m \boldsymbol{\alpha}_{: j}=\operatorname{Softmax}\left(\mathbf{K}^{T} \mathbf{q}_{: j}\right) \in \mathbb{R}^{m} α:j=Softmax(KTq:j)∈Rm,每一个权重向量都是m维的。
第三步计算context向量。对所有 v : j v_{: j} v:j做加权平均去计算相应的 c c c,权重都是 α \alpha α。 c 1 c_1 c1依赖与权重向量 α : 1 \alpha_{: 1} α:1以及所有v向量。同样的方法计算其余c向量
得到的 c : j c_{: j} c:j是self-attention layer的输出。
第j个输出 c : j c_{: j} c:j是依赖于矩阵 V V V,矩阵 K K K,和向量 q : j q_{: j} q:j。 c : j c_{: j} c:j依赖m个x向量。
attebtion layer的输入是encoder和decoder的元素,是两个不同的矩阵.输出的长度与decoder的输入长度相同。
self-attention layer的输入是两个相同的矩阵