Dive into Deep Learning: 注意力机制基础
本文最后更新于 2024年3月14日 晚上
本文为 Dive into Deep Learning 11.1-11.3 的简单梳理。
注意力
在正式进入注意力机制的介绍前,我们先来考虑一个问题:过去的深度学习任务中,给定的模型输入都是良好定义的。像是在计算机视觉领域中进行图像分类的任务,给定的图像大小通常是固定的;在使用 RNN 进行自然语言处理时,我们也通常考虑固定长度 token 列表,或者通过编码器将不同长度的 token 列表进行对齐。
数据库的视角
我们以数据库的视角来看看这个问题。我们将数据集看成简单的键-值对表示的数据库,也就是说每对样本都可以看做为 $(\mathbf{k}, \mathbf{v})$ 的数据库数据。
于是,数据库 $\mathcal{D} \overset{\text{def}}{=} \{(\mathbf{k}_1, \mathbf{v}_1), \dots, (\mathbf{k}_m, \mathbf{v}_m)\}$,其中 $m$ 为数据集中的样本数量。
回到开始时我们思考的问题:输入都是良好定义的。也就是说,之前的任务中的输入空间通常是比较“整齐”的;我们所需要考虑的是更加“不整齐”,或者说是更加可变的、更大的输入空间。
回忆一下数据库的知识。我们通常会通过编写十分自由(这也就意味着输入空间很大)的 SQL 询问来对数据进行查询,然后得到我们期望的结果的格式。我们记 $\mathbf{q}$ 为一次询问。于是这个问题就变成了如何通过 $\mathcal{D} $ 和询问 $\mathbf{q}$,组合出我们希望的输出。我们暂且先忽视如何转换成输出,我们先来考虑一下“组合”:如何利用我们已经知道的信息。
一个很直观的想法是,找到一个函数 $\alpha(\mathbf{q}, \mathbf{k}_i)$,能够代表 $\mathbf{v}$ 在组成 $\mathbf{q}$ 的输出的“重要程度”,通过 $\mathbf{v}$ 的线性组合的方式计算输出。
注意力的定义
前文中的重要程度,其实就是我们有多关注这个数据。实际上,注意力这个名词的来源就是从此引申出来的。
定义 对于 $\mathbf{q}$ 在 $\mathcal{D}$ 上的注意力,可以表示为:
$$
\text{Attention}(\mathbf{q}, \mathcal{D})\overset{\text{def}}{=}
\sum_{i=1}^m \alpha(\mathbf{q}, \mathbf{k}_i) \mathbf{v}_i
$$
其中,$\alpha(\mathbf{q}, \mathbf{k}_i)$ 为标量,代表注意力权重。
实际上,这个操作我们通常叫做注意力汇聚(attention pooling)。
对于深度学习场景下最常见的注意力权重假设,我们认为 $\alpha(\mathbf{q}, \mathbf{k}_i)$ 形成了一个凸组合(convex combination),也就是说 $\sum \alpha(\mathbf{q}, \mathbf{k}_i) = 1$,且 $\alpha(\mathbf{q}, \mathbf{k}_i)$ 非负。
注意力的可视化
注意力机制的好处之一是非常直观,尤其是当权重为非负值且总和为 $1$ 时。在这种情况下,我们可以认为大的权重代表了模型选择了更加具有(与询问之间的)关联性的某个组成。
于是,我们可以用热力图画出询问与 $(\mathbf{k}, \mathbf{v})$ 之间的关联性。
注意力汇聚
Nadaraya–Watson 核回归
更改注意力汇聚的方式
学习注意力汇聚:注意力评分函数
(未完待续)