attention的注意力分数 | attention scoring functions

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

Attention score

本节内容主要是解释什么是attention打分函数。

当然我们首先需要了解什么是attention scoring(注意力分数)。

我们之前讲通用的注意力汇聚公式如下:

f ( x ) = i = 1 n α ( x , x i ) y i f(x) = \sum_{i=1}^n \alpha(x, x_i) y_i

就是用 x x x i x_i 之间的距离关系对 y y 进行加权。 

展开得到:

α ( q , k i ) = s o f t m a x ( a ( q , k i ) ) = exp ( a ( q , k i ) ) j = 1 m exp ( a ( q , k j ) ) R \alpha(\mathbf{q}, \mathbf{k}_i) = \mathrm{softmax}(a(\mathbf{q}, \mathbf{k}_i)) = \frac{\exp(a(\mathbf{q}, \mathbf{k}_i))}{\sum_{j=1}^m \exp(a(\mathbf{q}, \mathbf{k}_j))} \in \mathbb{R}

image.png

  • 绿色框框里是α,对应的是注意力权重。
  • 红色框框里是a,对应的是注意力分数。

也就说, ​注意力分数 softmax之后变为 ​注意力权重 , ​注意力权重 就是 ​注意力分数 经过softmax计算。


看一下下图: image.png

以softmax为界限,左边就是注意力分数(attention score)的计算部分,右边就转入注意力权重(attention weight)的计算了。

Attention scoring functions

我们之前在nadaraya-waston核回归之中讲过,我们选择高斯核作为计算方法。由此可知我们可以选择不同计算方法形成不同的注意力评分函数,不同的注意力评分函数会导致不同的注意力汇聚操作。这次我们介绍两种常用的注意力评分函数计算方法:

Scaled dot-product attention

之前我们在nadaraya-waston核回归key是一个向量,query是单个值。其实query也可以是一个张量的。

缩放点积注意力(scaled dot-product attention)主要就是为了处理当query也是向量的时候该如何进行计算,注意这里要求query和key长度必须相等!!!

公式如下:

a ( q , k ) = q k / d a(\mathbf q, \mathbf k) = \mathbf{q}^\top \mathbf{k} /\sqrt{d}
  • 其中 d d 是向量维度的大小。

我们之前是使用高斯核 K ( u ) = 1 2 π exp ( u 2 2 ) K(u) = \frac{1}{\sqrt{2\pi}} \exp(-\frac{u^2}{2}) 来计算 x x 和每个 x i x_i 之间的距离也就是query和keys之间的距离,现在我们直接使用内积一步到位。

学过线代的应该都知道,从几何意义上来说,是一个向量在另一个向量上的投影;从信号处理的角度来说,内积是两个信号的相似性。因此在这里使用向量内积直接求query和key之间的距离。

此外这样计算还有一个好处,就是我们实际操作中使用mini-batch,这里可以直接将其拼接乘矩阵进行非常简单的计算即可完成整个attention weight的计算。

公式如下:

s o f t m a x ( Q K d ) V \mathrm{softmax}\left(\frac{\mathbf Q \mathbf K^\top }{\sqrt{d}}\right) \mathbf V
  • 其中key和query的长度都是d
  • 假设有m个query和n个key,那其中:
    • query: Q R m × d \mathbf Q\in\mathbb R^{m\times d}
    • key: K R n × d \mathbf K\in\mathbb R^{n\times d}
    • value: V R n × v \mathbf V\in\mathbb R^{n\times v}
  • 最终结果维度是 R m × v \mathbb{R}^{m\times v}

Additive attention

讲完query和key等长,再看一下不等长时候怎么办。这种加性注意力(additive attention)这种主要是应对当query和key长度不同的时候是怎么操作的。

公式如下:

现在假设query的长度为q,key的长度为k,那么 q R q \mathbf{q} \in \mathbb{R}^q 和键 k R k \mathbf{k} \in \mathbb{R}^k

a ( q , k ) = w v tanh ( W q q + W k k ) a(\mathbf q, \mathbf k) = \mathbf w_v^\top \text{tanh}(\mathbf W_q\mathbf q + \mathbf W_k \mathbf k)
  • 可以很直观得从公式看出这里是将q和k直接扔进了一个小的神经网络里边,经过一层tanh激活函数之后得到注意力分数。

  • 其中 W q R h × q \mathbf W_q\in\mathbb R^{h\times q} W k R h × k \mathbf W_k\in\mathbb R^{h\times k} ,这样经过计算之后可以将结果都转化为 R h × 1 \mathbb R^{h\times 1}

  • 经过tanh激活之后在和维度为h的 w v R h \mathbf w_v\in\mathbb R^{h} 进行计算,得到最终结果是一个数,维度 R 1 \mathbb{R}^1

补充

注意上边讲的两种方法是对于一个query和key的计算,中间插的那个mini-batch的简便计算是对整体的,是把Scaled dot-product attention所有的query和key一起计算,第二部分中additive attention中没写整体计算方法。以免有人看的迷糊,特此声明。

猜你喜欢

转载自juejin.im/post/7102207894388473892