动手学深度学习10.3 attention的注意力分数 | attention scoring functions

2,526 阅读3分钟

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

Attention score

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

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

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

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

就是用xxxix_i之间的距离关系对yy进行加权。 

展开得到:

α(q,ki)=softmax(a(q,ki))=exp(a(q,ki))j=1mexp(a(q,kj))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)=qk/da(\mathbf q, \mathbf k) = \mathbf{q}^\top \mathbf{k} /\sqrt{d}
  • 其中dd是向量维度的大小。

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

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

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

公式如下:

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

Additive attention

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

公式如下:

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

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

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

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

补充

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