注意力机制笔记

马毅:要想正确理解深度神经网络,就必须认识到其本质是学习高维数据中的低维结构的手段。从第一性原理出发,把目的和手段分清楚,其余的都很容易被统一、被解释。

从 Attention 的角度理解马毅老师这句话,Embedding 的时候本来就升维了,再做 QKV 就相当于在高维里面抽低维信息。而且 Q 也是可学习的,所以就既能学到好的抽取方法;对于每一种抽取方法,又能特别高效地抽取。

GitHub 项目地址:rnn-note / attention-note

一、语言模型入门:RNN, LSTM, GRU

1.1 序列模型

马尔可夫假设,当前数据只跟最近 τ 个数据点相关。把最近 τ 个数据点作为特征,用 MLP 预测当前数据点的值。



1.2 文本预处理

对文本词元化 (tokenize) 并构建词表,就是把文本映射到从 0 开始的索引。



1.3 语言模型和数据集

对语料分批量 (batch) 处理。介绍了两种(batch 内的)采样策略:

  • 随机采样策略:每个 batch 内的相邻子序列是随机的
  • 顺序分区策略:每个 batch 内的相邻子序列是顺序的


1.4 循环神经网络的从零开始实现

每次输出仅由前一个隐状态和当前新输入 x 决定,是为 RNN。

提及的知识点:

  • 独热编码:文本经过词元化后,还要经过 one-hot 处理,才能进入模型
  • 困惑度:我们用困惑度来描述文本生成的质量,通过一个序列中所有的 n 个词元的交叉熵损失的平均值来衡量 $$\frac{1}{n} \sum_{t=1}^n-\log P\left(x_t \mid x_{t-1}, \ldots, x_1\right)$$
  • 梯度裁剪:对于 $T$ 长序列将产生 $O(T)$ 长矩阵乘法链。当 $T$ 较大时,可能导致数值不稳定,例如可能导致梯度爆炸或梯度消失。这种情况下优化算法可能无法收敛。下式通过将梯度 $g$ 投影回给定半径 $\theta$ 来限制梯度的大小。其中 $\frac{\theta}{|\mathbf{g}|}$ 可以理解为梯度 $g$ 的单位方向向量。 $$\mathbf{g} \leftarrow \min\left(1, \frac{\theta}{|\mathbf{g}|}\right) \mathbf{g}$$


1.5 循环神经网络的简洁实现

使用高级 API 实现循环神经网络。



1.6 门控循环单元

”门控循环单元与普通的循环神经网络之间的关键区别在于: 前者支持隐状态的门控。 这意味着模型有专门的机制来确定应该何时更新隐状态, 以及应该何时重置隐状态。 这些机制是可学习的。“

为了解决长期记忆依赖的问题,使用两个门和一个候选隐状态:

  • 重置门 $\mathbf{R}_t$
  • 更新门 $\mathbf{Z}_t$
  • 候选隐状态 $\mathbf{H}_t$

重置门、更新门由上一轮隐状态和当前新输入 x 决定;候选隐状态由上一轮隐状态、当前新输入 x 和重置门决定;本轮产出的隐状态由更新门、上一轮隐状态、候选隐状态决定。

公式表示如下: $$\begin{aligned} \mathbf{R}_t &= \sigma(\mathbf{X}_t \mathbf{W}_{xr} + \mathbf{H}_{t-1} \mathbf{W}_{hr} + \mathbf{b}_r)\\ \mathbf{Z}_t &= \sigma(\mathbf{X}_t \mathbf{W}_{xz} + \mathbf{H}_{t-1} \mathbf{W}_{hz} + \mathbf{b}_z)\\ \tilde{\mathbf{H}}_t &= \tanh(\mathbf{X}_t \mathbf{W}_{xh} + \left(\mathbf{R}_t \odot \mathbf{H}_{t-1}\right) \mathbf{W}_{hh} + \mathbf{b}_h)\\ \mathbf{H}_t &= \mathbf{Z}_t \odot \mathbf{H}_{t-1} + (1 - \mathbf{Z}_t) \odot \tilde{\mathbf{H}}_t \end{aligned}$$



1.7 长短期记忆网络

长短期记忆网络 LSTM 比 GRU 复杂一点,效果也好一点。

  • 输入门:和候选记忆元一起更新 记忆元
  • 遗忘门:更新 记忆元
  • 输出门:和 记忆元 一起更新 隐状态


1.8.深度循环神经网络

在输入和输出之间,添加多层隐状态。



二、注意力机制

2.1 机器翻译数据集

“通过截断和填充文本序列,可以保证所有的文本序列都具有相同的长度,以便以小批量的方式加载。”



2.2 编码器-解码器架构

从不定长序列到不定长序列:

  • 编码器(encoder): 它接受一个长度可变的序列作为输入,并将其转换为具有固定形状的编码状态。
  • 解码器(decoder): 它将固定形状的编码状态映射到长度可变的序列。


2.3 序列到序列学习

使用两个循环神经网络设计一个序列到序列模型。

知识点:

  • 掩蔽填充词,将填充词元的预测排除在损失函数的计算之外
  • 使用 BLEU 衡量翻译质量的好坏



2.4 注意力提示

对于一个有杯子、书本、窗户的场景

  • 非自主性提示:杯子特别红
  • 自主性提示:想看书、想看看窗外

其实就是不依赖数据本身的统计信息,而是主动查询来获取信息。本节引出 QKV 的概念。



2.5 注意力汇聚:Nadaraya-Watson 核回归

使用注意力机制解回归问题。分别试验了非参模型和带参模型的效果。



2.6 注意力评分函数

注意力评分函数是 q 和 k 的函数,本质是对查询和键之间的关系建模。

本节介绍了两个注意力评分函数:

  • 加性注意力:用 MLP 做
  • 缩放点积注意力:用点积做,因此要求查询和键具有相同长度 $d$


2.7 Bahdanau 注意力

受对齐思想启发,Bahdanau 注意力将加性注意力加入解码器。

每个解码时间步,模型会根据当前解码器状态计算一个权重分布,用于加权求和编码器的所有隐藏状态,生成一个上下文向量。这意味着每次生成新词时,模型可以关注输入序列的不同部分。



2.8 多头注意力

为了使用多个注意力汇聚,多头注意力块用 h 组不同的线性投影 (linear projections) 来变换查询、键和值。然后用变换后的 QKV 将并行地进行注意力汇聚。最后,将 h 个注意力汇聚的输出 concat 在一起,并通过另一个可以学习的线性投影 (逐位前馈网络, FFN) 进行变换,以产生最终输出。



2.9 自注意力和位置编码

当注意力汇聚的 QKV 均来自同一组输入时,这种注意力被称为自注意力。为了让神经网络既能并行地处理词元,又能学到序列信息,Transformer 通过在输入中添加位置编码来注入绝对或者相对信息。



2.10 Transformer

Transformer 作为编码器-解码器架构的一种实现,其整体架构如下所示。注意到图中出现了三个注意力块,接近输入的两个,是自注意力。连接编码器和解码器的,是编码器-解码器注意力。



问题列表

  • transformer架构中都有哪些层?
  • 自注意力机制在transformer中的作用?
  • 自注意力在transformer架构中的位置?
  • transformer架构中,都有哪些构件用到了注意力机制?
  • 缩放点积注意力做的是点积,加性注意力做的数学运算是什么?不是点积吗?
  • 在加性注意力中q和k的维度可以不同吗?在点积放缩注意力中q和k的维度可以不同吗?
  • 多头自注意力机制如何平衡多个头的输出信息?
  • 可以把多头注意力跟CNN中的通道做类比吗?两者有什么差别?
  • 自注意力的输入是否有固定的长度限制?
  • 实际训练时,样本长度总会有一个限制,一般限制是多少?
  • 长距离依赖最远能多远,由什么参数决定的?
  • 相邻样本的位置编码是否也比较相近?这会导致采样策略影响模型效果吗?
  • 自注意力计算的时间复杂度是多少?
  • TPU相比GPU有什么优势?
  • 时至今日,深度学习本质还是学习线性变换w吗?数学上是否有更精妙的设计?
  • transformer做多头注意力时,多个头的qkv共用线性变换 W_q W_k W_v 吗?

参考: