9. Modern Recurrent Neural Networks
9.7. Sequence to Sequence Learning
在机器翻译中,输入序列和输出序列都是长度可变的,使用两个 RNN 来设计「编码器-解码器」结构,以可变长度序列作为输入,将其转换为固定形状的隐藏状态。输入序列(源)的信息被 编码 到 RNN 编码器的隐藏状态中,输出序列(目标)的信息在 RNN 解码器基于输入序列的编码信息和已经生成的标记来预测下一个标记。序列中 <bos>
表示序列的开始;<eos>
表示序列的结束;<unk>
表示未知的数据。
9.7.1. Encoder
编码器将可变长度的输入序列转换成固定形状的 上下文变量 $\mathbf{c}$;并且将输入序列的信息编码在这个上下文变量中。
假设一个序列样本(批量大小:1),输入序列是$x_1,\ldots,x_T$,其中 $x_t$ 是输入序列中的第 $t$ 个标记。在时间步 $t$,RNN将用于 $x_t$ 的输入特征向量 $\mathbf{x}t$ 和来自上一时间步的隐藏状态 $\mathbf{h}{t-1}$ 转换为当前隐藏状态 $\mathbf{h}_t$。用一个函数 $f$ 来表示 RNN 层所做的变换:
$$
\mathbf{h}_t=f(\mathbf{x}t,\mathbf{h}{t-1})
$$
编码器通过特定的函数 $q$ 将所有时间步的隐藏状态转换为上下文变量:
$$
\mathbf{c}=q(\mathbf{h}_1,\ldots,\mathbf{h}_T)
$$
使用单向 RNN 来设计编码器,其中隐藏状态依赖于输入的子序列,子序列由序列的开始位置到隐藏状态所在的时间步的位置决定(包括当前时间步的输入)。
Todo:使用双向 RNN 来设计编码器,其中隐藏状态依赖于输入的两个子序列,分别是隐藏状态所在的时间步的位置之前的和之后的子序列(包括当前时间步处的输入),这个子序列完成了对整个序列的信息编码。
1 | class Seq2SeqEncoder(d2l.Encoder): |
10. Attention Mechanisms
10.2. Attention Pooling: Nadaraya-Watson Kernel Regression
查询(自主提示)和键(非自主提示)之间的交互产生了「注意力池化」,从而有选择性地聚合了值(感官输入)以产生输出。
10.2.3. Nonparametric Attention Pooling
使用 Nadaraya-Watson 核回归,核为 $K(u)=\frac1{\sqrt{2\pi}}\exp(-\frac{u^2}2)$,根据输入的位置对输出进行权衡:
$$
\begin{aligned}
f(x) &= \sum_{i=1}^n \frac{K(x - x_i)}{\sum_{j=1}^n K(x - x_j)} y_i\
&=\sum_{i=1}^n\alpha(x,x_i)y_i\
&=\sum_{i=1}^n\frac{\exp(-\frac12(x-x_i)^2)}{\sum_{j=1}^n\exp(-\frac12(x-x_j)^2)}y_i\
&=\sum_{i=1}^n\mathrm{Softmax}(-\frac12(x-x_i)^2)y_i
\end{aligned}
$$
1 | # X_repeat 的形状: (n_test, n_train), 用于批量计算 $f(x)$,而不是一个个计算 |
10.2.4. Parametric Attention Pooling
- 非参数 Nadaraya-Watson 核回归具有 一致性 的优势:如果有足够的数据,此模型会收敛到最佳解决方案。
- 参数化注意力池化:对非参数模型加入参数 $w$,在大注意力权重位置输出的图形会更加尖锐
$$
\begin{aligned}
f(x) &= \sum_{i=1}^n \alpha(x, x_i)y_i \
&= \sum_{i=1}^n \frac{\exp\left(-\frac{1}{2}((x - x_i)w)^2\right)}{\sum_{j=1}^n \exp\left(-\frac{1}{2}((x - x_i)w)^2\right)} y_i \
&= \sum_{i=1}^n \mathrm{softmax}\left(-\frac{1}{2}((x - x_i)w)^2\right) y_i.
\end{aligned}
$$
10.2.4.1. Batch Matrix Multiplication
批处理乘法用于提升小批量注意力计算的效率。
假设第一个小批量包含 $n$ 个矩阵 $\mathbf{X}_1,\ldots, \mathbf{X}_n$,形状为 $a\times b$,第二个小批量包含 $n$ 个矩阵 $\mathbf{Y}_1, \ldots, \mathbf{Y}_n$,形状为 $b\times c$。它们的批量矩阵乘法得出 $n$ 个矩阵 $\mathbf{X}_1\mathbf{Y}_1, \ldots, \mathbf{X}_n\mathbf{Y}_n$,形状为 $a\times c$。因此,假定两个张量的形状 $(n,a,b)$ 和 $(n,b,c)$ ,它们的批量矩阵乘法输出的形状为 $(n,a,c)$。
10.2.4.2. Defining the Model
1 | class NWKernelRegression(nn.Block): |
10.2.4.3. Training
1 | net = NWKernelRegression() |
10.3. Attention Scoring Functions
使用高斯核对查询和键之间的关系建模,可以将高斯核的指数部分视为 注意力评分函数(简称 评分函数)。
用数学语言描述,假设查询 $\mathbf{q} \in \mathbb{R}^q$ 和 “键-值”对 $(\mathbf{k}_1, \mathbf{v}_1), \ldots, (\mathbf{k}_m, \mathbf{v}_m), \mathbf{k}_i \in \mathbb{R}^k, \mathbf{v}_i \in \mathbb{R}^v$。注意力池化函数 $f$ 被表示成值的加权和:
$$
f(\mathbf{q}, (\mathbf{k}_1, \mathbf{v}_1), \ldots, (\mathbf{k}m, \mathbf{v}m)) = \sum{i=1}^m \alpha(\mathbf{q}, \mathbf{k}_i) \mathbf{v}_i \in \mathbb{R}^v,
$$
其中查询 $\mathbf{q}$ 和键 $\mathbf{k}_i$ 的注意力权重(标量)是通过注意力评分函数 $a$ 的 softmax 运算得到的,该函数将两个向量映射成标量:
$$
\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}.
$$
选择不同的注意力评分函数 $a$ 导致不同的注意力池化操作。
本节将会介绍两个注意力评分函数:
- Additive Attention:当查询和键是不同长度的矢量时
- Scaled Dot-Product Attention:当查询和键是相同长度的矢量时,这个评分函数的计算效率更高
10.3.1. Masked Softmax Operation
Softmax 运算用于输出一个概率分布作为注意力权重。为了在 Softmax 计算时过滤掉用于填充序列的没有意义的特殊标记,可以指定一个有效序列长度(即标记的个数),然后使用 masked_softmax
函数将无效的标记遮盖并输出为零。
1 | def masked_softmax(X, valid_lens): |
10.3.2. Additive Attention
当查询和键是不同长度的矢量时,可以使用可加性注意力作为评分函数。
$$
a(\mathbf q, \mathbf k) = \text{tanh}(\mathbf W_q\mathbf q + \mathbf W_k \mathbf k) \mathbf w_v^\top \in \mathbb{R}
$$
其中,查询 $\mathbf{q} \in \mathbb{R}^q$ ,键 $\mathbf{k} \in \mathbb{R}^k$,可学习的参数 $\mathbf W_q\in\mathbb R^{h\times q}$、$\mathbf W_k\in\mathbb R^{h\times k}$ 和 $\mathbf w_v\in\mathbb R^{h}$,隐藏层的单元个数是超参数 $h$。
1 | class AdditiveAttention(nn.Block): |
10.3.3. Scaled Dot-Product Attention
“点-积”操作要求查询和键具有相同的矢量长度 $d$,但是计算效率更高。假设查询和键的所有元素都是独立的随机变量,并且都满足均值为 $0$ 和方差为 $1$,那么两个矢量的“点-积”满足均值为 $0$和方差为 $d$。为了确保方差不受矢量长度的影响,可以将之除以 $\sqrt{d}$,则新的 缩放的“点-积”注意力 评分函数的方差为 $1$。
$$
a(\mathbf q, \mathbf k) = \mathbf{q}^\top \mathbf{k} /\sqrt{d}
$$
在实践中,常常基于小批量的角度来提高效率,例如:基于 $n$ 个查询和 $m$ 个“键-值”对计算注意力,其中查询和键的长度为 $d$,值的长度为 $v$。查询 $\mathbf Q\in\mathbb R^{n\times d}$、键 $\mathbf K\in\mathbb R^{m\times d}$ 和值 $\mathbf V\in\mathbb R^{m\times v}$ 的缩放的“点-积”注意力是
$$
\mathrm{softmax}\left(\frac{\mathbf Q \mathbf K^\top }{\sqrt{d}}\right) \mathbf V \in \mathbb{R}^{n\times v}.
$$
在下面的缩放的“点-积”注意力的实现中,使用了 dropout 进行模型正则化。
1 | class DotProductAttention(nn.Block): |
10.4. Bahdanau Attention
没有对齐方向限制的可区分的注意力模型。在预测标记时,如果不是所有的输入标记都相关,模型将仅对齐(或者注意)输入序列中与当前预测相关的部分。这是通过将上下文变量视为注意力池化的输出来实现的。