原理

注意力机制可以被看作一个推广的查询过程.

对于某个 query vector \(h_t\), 我们想知道一大串 \((h^\prime_1,\cdots, h^\prime_S)\) 与其关联程度, 并从中提取出某些信息来 (注重某几个而非所有的\(h^\prime\)).

这个关联程度的定义为

\[c_t = \sum_{i=1}^{S} \alpha_{i,t} h^\prime_i \]

这里的 权重 \(\alpha_{i,t}\) 的计算方式为

\[\alpha_{i,t} = \frac{\exp{score(h_t, h^\prime_i)}} { \sum_{j=1}^{S} \exp{score(h_t, h^\prime_j)} } \]

这里的 \(score(\cdot)\) 函数是一种衡量 \(h\) 和 \(h^\prime\) 的相似度的函数, 可以任意定义, 只要输出一个标量即可. 一般定义为

\[score(x,y) = x^\intercal \cdot W \cdot y \]

注意, 原始的\(h\) 和 \(h^\prime\) 要求有同样的维度, 但是实际上只要有恰当的 \(score\) 定义, 这个条件可以取消.

Attention 的常用表达和概念扩增

(从 Attention is all you need 中来):

\(K\): 键 key
\(Q\): 查询 query
\(V\): 值 value

\[\text { Attention }(Q, K, V)=\operatorname{softmax}\left(\frac{Q K^{T}}{\sqrt{d_{k}}}\right) V \]

这里的 \(K\) 就是上面的 \(h^\prime\), \(Q\) 则为 \(h_t\), 而 \(V\) 也为 \(h^\prime\). 上面的计算过程可以理解为 用 \(h_t\) (\(Q\)) 去查询 \(h^\prime\) (\(K\)), 得到的结果 \(\alpha\) 和 \(h^\prime\) (\(V\))结合, 得到最终结果 \(c_t\).

在这种形式化完成以后, 作者搞出来两种 attention: 单头 attention 和多头 attention.


可以看到, 单头 attention 就是普通的 attention.

对于多头情形, 可以看做首先将 \(V, K, G\) 进行一次倍增(通过线性映射), 然后同时进行多次单头attention, 最后合并起来输出结果. 多头 attention 可以看作进行了多次查询最后输出一个结果.

Self-attention 指 \(V = K = G\).