Attention Is All Your Need ============================ 关于Attention的定义 +++++++++++++++++++ Attention函数可以看做是一个映射,从 ``query && key-value对的集合 -> output 的映射`` 。其中 query, key, value, output 均是向量。 由 key & key 算出一个归一化的常量,然后用这个常量在对应的value上加权;加权后的结果相加,就是output . 两种常见的attention +++++++++++++++++++ 一种是 ``additive attention`` (*Dzmitry Bahdanau, Kyunghyun Cho, and Yoshua Bengio. Neural machine translation by jointly learning to align and translate. CoRR, abs/1409.0473, 2014.*), 另一种是 dot-product(multiplicative) attention. 尽管加法attention和点积attention有理论上相同的复杂度,但是点积attention在实际中更快,更省内存;因为它可以用矩阵乘法来高度优化! 当query和key的维度比较小时,加法attention与点积attention效果类似;但是当其维度较大时,加法attention就比不带scale的点积attention好! 猜测是因为当维度大时,**点积结果的magnitude很大,从而进入到softmax函数的极度低梯度的范围**。 所以,为了抵消这个影响,我们用 $ \sqrt d_k $ 来缩放这个magnitude. 为什么magnitude会很大? 是因为 query, key 都是均值为0,方差为1的独立随机变量,它们的点积 $ q \dot k = \sum_{i=1}^{d_k} q_i k_i $ 就是一个均值为0,方差为 的 $ d_k $ 的结果。 这也解释了为什么要除以 $ \sqrt d_k $: 这样方差又成了1 ?? Multi-Head Attention ++++++++++++++++++++++ 传统的attention,就是在 query, key, value 上直接算一个加权结果。Multi-Head attention, 则是将用多个映射,分别将 query, key, value 单独映射为多个表示 ``[ (query_1, key_1, value_1), (query_2, key_2, value_2), ...]``,再在映射的结果上分别算attention,得到 ``[output1, output2, ...]``, 最后把这些output拼接后做一个映射,得到最终的output; 好处就是,允许模型联合地去关注输入的不同位置的不同子空间的表示。这个是单个的attention所不能做到的。 其实还是好理解,就类比与 CNN 的多个filter吧。 实际种,用的一个矩阵来分别映射query,key,value; 而且,映射后的维度为原始维度除以head的数量,这样其实整体的运算量不变。