注意力机制(attention)
在使用LSTM,CNN等模型的时候,很难决定对于一个信息什么是重要的,什么是不重要的。因此注意力机制就是为了优化这一问题
怎么做注意力机制
注意力机制包含,查询对象(Q),被查询对象(V),K
K = k 1 , ⋯ , k n K=k_1,\cdots,k_n K=k1,⋯,kn
用Q与K做点乘,求的K与Q的相似度,做一层softmax回归得到相似度的概率,在与v相乘最终得到新的v
s o f t m a x ( a 1 , ⋯ , a n ) ∗ ( v 1 , ⋯ , v n ) = V 1 softmax(a_1,\cdots,a_n)*(v_1,\cdots,v_n) = V^1 softmax(a1,⋯,an)∗(v1,⋯,vn)=V1
此时的 V 1 V^1 V1就包含了对于Q来说哪个信息更重要的信息。
自注意力机制(self-attention)
自注意力机制是注意力机制的一个子集,注意力机制没有规定KQV的来源。
自注意力机制规定KQV都来自输入X,可以说 K ≈ Q ≈ V K\approx Q\approx V K≈Q≈V。
KQV,是由X点乘 W K , W Q , W V W_K,W_Q,W_V WK,WQ,WV三个参数得到的,其余操作与注意力机制一样
为什么softmax要除以 d k \sqrt{d_k} dk
因为softmax会放大差距,举个例子
70,50 -》0.78,0.22
因此同时除以一个数字能够减少差距,让最后的概率不会过于离谱
self-attention与RnnS对比
RnnS不能解决长序列的问题,并且不能并行。
self-attention就解决了这个问题。
并且self-attention得到的z含有更多信息。
Masked(掩码) Self-attention
用生成模型生成下一个词的时候,我们希望给下一个词也做自注意力机制,但是生成的词是一个一个生成的,因此没有办法对整个句子做自注意力机制。
因此就需要掩码自注意力机制。
说白了就是你做第二个词的时候是不知道下一个词的
Multi-Head self-attention(多头自注意力机制)
提升了X,生成的 Z ′ Z{'} Z′相对于Z有了提升。
把X对应点乘不同的h(通常为8)个矩阵,得到不同的8个QKV,做自注意力机制。
最后得到的多个Z拼接起来,在做一层线性变换,得到合适的维度。
那么为什么这样做有用呢
独热编码将物品的意义映射到空间向量的一个位置上,当你通过点乘W得到QKV相当于对这个物品意义的一部分进行自注意力的学习,如果使用多头自注意力,点乘不同的W得到8套QKV,相当于给这个物品的多个层面上学习,最终得到的Z所含信息就更全面,预测自然更加准确。