Attention

23929 分钟阅读

Attention is all you need!

Introduction

在Seq2Seq模型中,编码器将输入序列编码为固定长度的上下文向量,然后解码器使用该上下文向量生成输出序列。然而,这种方法在处理长序列时存在问题,因为编码器需要将整个序列编码为单个向量,这会导致信息丢失。

Seq2Seq模型

如果说输入序列很长,那么将其编码为单个向量会不可避免地丢失信息。所以需要引入一种注意力机制,使得解码器在生成每个输出时,能够关注输入序列的不同部分。

人眼的注意力机制

人眼在看一个物体时,会有一个focus,对于某个部分会看得更清楚,而其他部分则看得比较模糊。

Attention

Attention

例如,一开始,将s0s_0和每个hih_i进行运算,得到e1ie_{1i},然后进行softmax运算,得到α1i\alpha_{1i},然后根据α1i\alpha_{1i}和对应的hih_i求数学期望,得到最后的c1c_1

et+1,i=fatt(st,hi) e_{t+1,i} = f_{att}(s_t, h_i) αt+1,i=et+1,ij=1Tet+1,j \alpha_{t+1,i} = \frac{e_{t+1,i}}{\sum_{j=1}^T e_{t+1,j}} ct+1=i=1Tαt+1,ihi c_{t+1} = \sum_{i=1}^T \alpha_{t+1,i} h_i

得到ctc_t后,再和yty_t进行运算,得到下一阶段的st+1s_{t+1}。然后再重复上述过程,直到生成结束符。

Attention
Attention
Attention

例如将英语翻译成法语的过程,每一个法语单词对英语的每个单词的注意力都不一样(在这里越亮代表注意力越大)

Attention

生成图像字幕时,每一个单词对图像的每个区域的关注度也不一样(在这里越亮代表注意力越大)

image Captioning with RNN and attention

image Captioning with RNN and attention

图像首先通过CNN处理,生成特征网格(如图中蓝色矩阵所示)。每个特征向量 hi,jh_{i,j} 代表图像不同区域的信息。

使用注意力函数 fatt(st1,hi,j)f_{att}(s_{t-1}, h_{i,j}) 计算对齐分数 et,i,je_{t,i,j},表示解码器在时间步 tt 时对图像特征 hi,jh_{i,j} 的关注程度。

对对齐分数进行 softmax 运算,得到注意力权重 αt,i,j\alpha_{t,i,j},用于衡量每个特征在生成当前输出时的重要性。

通过加权求和计算上下文向量 ct=i,jαt,i,jhi,jc_t = \sum_{i,j} \alpha_{t,i,j} h_{i,j},整合了图像中不同区域的信息。

解码器从起始状态 s0s_0 开始,结合上下文向量 ctc_t 和前一个输出 yt1y_{t-1} 生成下一个状态 sts_t 和输出 yty_t

这个过程持续进行,直到生成结束符。

Attention layer

single Query Vector

输入:

  • Query Vector: qq shape: DqD_q,例如sts_t
  • Input Vector: XX shape: NX×DqN_X \times D_q,例如hh
  • similarity function: scaled dot-product

计算

Computation:

  • Similarities: ee (Shape: NXN_X) where ei=qxi/DQe_i = q \cdot x_i / \sqrt{D_Q}
  • Attention weights: a=softmax(e)a = \text{softmax}(e) (Shape: NXN_X)
  • Output vector: y=iaixiy = \sum_i a_i x_i (Shape: DqD_q)
Info

在注意力机制中,使用点积来计算相似度。如果向量的维度 DD 很大,点积的值也会很大。这会导致 softmax 的输出趋于极端值,从而影响梯度的有效传播。 解决方法:为了缓解这个问题,通常会对点积进行缩放(例如,除以 DD ),以防止相似度值过大。这就是“缩放点积注意力”的由来。

Multi Query Vector

输入:

  • Query Vectors: QQ shape: Nq×DqN_q \times D_q
  • Input Vectors: XX shape: NX×DqN_X \times D_q
  • similarity function: scaled dot-product

输出

  • Similarities: EE (Shape: Nq×NXN_q \times N_X) where ei,j=qixj/DQe_{i,j} = q_i \cdot x_j / \sqrt{D_Q},即E=QXT/DQE=QX^T/\sqrt{D_Q}

  • Attention weights: AA (Shape: Nq×NXN_q \times N_X) where ai,j=softmax(ei,jdim=1)a_{i,j} = \text{softmax}(e_{i,j},dim=1)

  • Output vectors: YY (Shape: Nq×DqN_q \times D_q) where yi=jai,jxjy_i = \sum_j a_{i,j} x_j,即Y=AXY=AX

Key & Value matrix

Key & Value matrix

Inputs:

  • Query vectors: Q\mathbf{Q} (Shape: Nq×DqN_q \times D_q)
  • Input vectors: X\mathbf{X} (Shape: Nx×DxN_x \times D_x)
  • Key matrix: WK\mathbf{W}_K (Shape: Dx×DqD_x \times D_q)
  • Value matrix: WV\mathbf{W}_V (Shape: Dx×DvD_x \times D_v)

Computation:

  • Key vectors: K=XWK\mathbf{K} = \mathbf{X} \mathbf{W}_K (Shape: Nx×DqN_x \times D_q)
  • Value Vectors: V=XWV\mathbf{V} = \mathbf{X} \mathbf{W}_V (Shape: Nx×DvN_x \times D_v)
  • Similarities: E=QKT/Dq\mathbf{E} = \mathbf{Q} \mathbf{K}^T / \sqrt{D_q} (Shape: Nq×NxN_q \times N_x), Ei,j=(QiKj)/DqE_{i,j} = (\mathbf{Q}_i \cdot \mathbf{K}_j) / \sqrt{D_q}
  • Attention weights: A=softmax(E,dim=1)\mathbf{A} = \text{softmax}(\mathbf{E}, \text{dim}=1) (Shape: Nq×NxN_q \times N_x)
  • Output vectors: Y=AV\mathbf{Y} = \mathbf{A} \mathbf{V} (Shape: Nq×DvN_q \times D_v), Yi=jAi,jVjY_i = \sum_j A_{i,j} \mathbf{V}_j

将值向量和键向量分开来,分别通过不同的矩阵进行变换,可以得到更好的效果。

得到对应的E矩阵后,按列进行softmax归一化,得到A矩阵。

最后将A矩阵的列和对应的V矩阵点积运算,得到Y矩阵。

Self-attention

Self-attention

Inputs:

  • Input vectors: X\mathbf{X} (Shape: Nx×DxN_x \times D_x)
  • Key matrix: WK\mathbf{W}_K (Shape: Dx×DqD_x \times D_q)
  • Value matrix: WV\mathbf{W}_V (Shape: Dx×DvD_x \times D_v)
  • Query matrix: WQ\mathbf{W}_Q (Shape: Dx×DqD_x \times D_q)

Computation:

  • Query vectors: Q=XWQ\mathbf{Q} = \mathbf{X} \mathbf{W}_Q (Shape: Nx×DqN_x \times D_q)
  • Key vectors: K=XWK\mathbf{K} = \mathbf{X} \mathbf{W}_K (Shape: Nx×DqN_x \times D_q)
  • Value Vectors: V=XWV\mathbf{V} = \mathbf{X} \mathbf{W}_V (Shape: Nx×DvN_x \times D_v)
  • Similarities: E=QKT/Dq\mathbf{E} = \mathbf{Q} \mathbf{K}^T / \sqrt{D_q} (Shape: Nx×NxN_x \times N_x), Ei,j=(QiKj)/DqE_{i,j} = (\mathbf{Q}_i \cdot \mathbf{K}_j) / \sqrt{D_q}
  • Attention weights: A=softmax(E,dim=1)\mathbf{A} = \text{softmax}(\mathbf{E}, \text{dim}=1) (Shape: Nx×NxN_x \times N_x)
  • Output vectors: Y=AV\mathbf{Y} = \mathbf{A} \mathbf{V} (Shape: Nx×DvN_x \times D_v), Yi=jAi,jVjY_i = \sum_j A_{i,j} \mathbf{V}_j

查询向量,键向量,值向量都是由输入向量通过不同的矩阵变换得到的。

permutation invariant

自注意力机制是排列不变的,即输入序列的顺序不会影响输出结果。只会影响计算的顺序。

permutation invariant

f(s(x))=s(f(x)) f(s(x))=s(f(x))
  • 自注意力机制本身不“知道”它处理的向量的顺序。这意味着它对输入序列的排列不敏感。

  • 为了使模型能够感知输入序列中元素的顺序,可以将位置编码与输入向量连接或相加。位置编码为每个输入位置提供唯一的表示,使模型能够区分不同位置的元素。

通过添加位置编码,模型可以在处理输入时考虑元素的顺序。这对于自然语言处理等任务非常重要,因为词语的顺序会影响句子的意义。

Masked Self-attention

Masked Self-attention

在自注意力机制中,Masked Self-Attention Layer 是一种特殊的自注意力层

在生成任务中,模型在预测下一个词时不应该看到未来的词。Masked Self-Attention 通过遮掩(masking)未来的词来实现这一点。

在计算注意力权重时,使用遮掩矩阵将未来的词的相似度设置为负无穷大。这确保了 softmax 输出的注意力权重为零,从而忽略未来的信息。

通过这种方式,Masked Self-Attention Layer 能够在不泄露未来信息的情况下进行序列生成。

Multi-head Self-attention

Multi-head Self-attention

将输入向量分成多个子空间,每个子空间称为一个“头”。每个头独立执行自注意力计算,捕获不同的特征和关系。

步骤:

  • 将输入向量 X\mathbf{X} 分割成多个部分,每个部分对应一个注意力头。

  • 每个头独立计算自注意力,包括生成查询、键和值向量,计算相似度,应用 softmax,生成输出。

  • 将所有头的输出连接(concat)在一起。

  • 对连接后的输出进行线性投影,生成最终的输出。

  • 多头机制允许模型在不同的子空间中关注不同的特征,增强了模型的表达能力。

  • 通过并行计算提高了效率。

Example
CNN with Self-attention

最后通过 1×1 卷积将加权求和的结果转换回原始通道数 CC

Three ways of Processing Sqs

Transformer

Transformer Block

包括自注意力机制、前馈神经网络和层归一化。

  • 输入向量 x1,x2,x3,x4x_1, x_2, x_3, x_4 是经过嵌入处理的输入数据。

  • 计算输入向量之间的相似度,生成注意力权重。

  • 使用注意力权重对输入进行加权求和,捕获全局依赖关系。

  • 自注意力的输出与输入相加(残差连接),然后进行层归一化,稳定训练过程。

前馈神经网络(MLP)

  • 每个位置的向量通过一个小型的前馈神经网络(通常包含两个线性变换和一个激活函数,如 ReLU)。
  • 这种结构增强了模型的非线性表达能力。

第二个残差连接和层归一化

  • 前馈网络的输出与自注意力层的输出相加,再进行层归一化。

输出

  • 最终输出 y1,y2,y3,y4y_1, y_2, y_3, y_4 是经过自注意力和前馈网络处理后的结果。

Pre-norm Transformer

上面的结构称为Post-norm Transformer,其在残差连接之后进行层归一化。在深层网络中可能导致训练不稳定。

Pre-norm Transformer 在残差连接之前进行层归一化。更稳定,适合更深的网络。

Pre-norm Transformer