(2)键值对模式
更一般地,我们可以用键值对(key-value pair)格式来表示输入信息,其中 “键”用来计算注意力分布αi,“值”用来计算聚合信息。
假设输入为 q,Memory 中以(k,v)形式存储需要的上下文。感觉在 Q&A 任务中,这种设置比较合理,Transformer 是采用的这种建模方式。k是question,v是answer,q是新来的question,看看历史memory中q和哪个k更相似,然后依葫芦画瓢,根据相似k对应的v,合成当前question的answer。
2.attention分类
按score函数不同分 按generate context vector函数分
(1)按score function分
解码器的输入是一个向量序列,长度为$m$。解码器位置$i$的输入是采用了attention机制的上下文向量$c_i$,不同位置的上下文向量不同。
通用模型图
(1)score function
计算score有多种计算方法,其实本质就是度量两个向量的相似度。如果两个向量在同一个空间,那么可以使用 dot 点乘方式(或者 scaled dot product,scaled 背后的原因是为了减小数值,softmax 的梯度大一些,学得更快一些),简单好使。如果不在同一个空间,需要一些变换(在一个空间也可以变换),additive 对输入分别进行线性变换后然后相加,multiplicative 是直接通过矩阵乘法来变换。不同计算方法代表不同的attention模型$v_{\alpha},W_{\alpha}$为待学习的参数,$n$为向量的维度。
$$\operatorname{score}\left({\mathbf{s}}_{i-1},{\mathbf{h}}_{t}\right)=\left\{\begin{array}{ll}\frac{{\mathbf{s}}_{i-1} \cdot {\mathbf{h}}_{t}}{\left\|{\mathbf{s}}_{i-1}\right\| \times\left\|{\mathbf{h}}_{t}\right\|}, & \text { cosin } \\{\mathbf{s}}_{i-1} \cdot {\mathbf{h}}_{t}, & \text { dot } \\ \frac{s_{i-1} \cdot {\mathbf{h}}_{t}}{\sqrt{n}}, & \text { scaled-dot } \\ {\mathbf{s}}_{i-1}^{T} \mathbf{W}_{\alpha} {\mathbf{h}}_{t}, & \text { general } \\ {\mathbf{v}}_{\alpha}^{T} \tanh \left(\mathbf{W}_{\alpha}\left[{\mathbf{s}}_{i-1}: {\mathbf{h}}_{t}\right]\right), & \text { concat / additive }\end{array}\right.$$
(2)alignment function
权重$\alpha_{i,t}$刻画了:在对第$i$个输出进行解码时,第$t$个输入的重要程度。
计算权重的方法:首先计算$\mathbf{s_{i-1}}$和$\mathbf{h_t}$的相关性,然后对所有的$t=1,2,...,n$归一化即可得到权重系数。即:$e_{i,t}=\operatorname{score}(\mathbf{s_{i-1}},\mathbf{h_t)}$,$\alpha_{i,t}=\frac{exp(e_{i,t})}{\sum_{t\'=1}^n{exp(e_{i,t\'})}},t=1,2,...,n$
(3)generate context vector function