Brief introduction to the famous paper about Transformers: Attention Is All You Need

(这篇博文用英文攥写并由ChatGPT进行翻译,如果有误请参照英文原文)

Transformer

Paper: Attention Is All You Need

Github link of Transformer

1. 背景

  • 编码器-解码器
  • 自注意力
  • 前馈网络
  • 位置编码

数据集: WMT 2014英法翻译任务

评估指标: BLEU (bilingual evaluation understudy)

  • BLEU使用n-gram计算修改后的精度度量来度量候选文本与参考文本之间的相似性。其思想是,如果参考中的一个词已经匹配,则不能再次匹配该词。
  • $\text{Count}_{\text{clip}} = \min (\text{count, Max_Ref_Count})$

$$ \text{BLEU} = \text{BP} \times \exp(\sum_{n=1}^N \mathbf{w_n}\log P_n) $$

  • $\text{BP}$ (Brevity Penalty,简洁惩罚)将在候选长度与参考翻译长度相同时为1。
  • $N$: n-grams
  • $\mathbf{w_n}$: 每个修改后精度的权重

在Transformer问世之前,序列到序列模型,尤其是LSTM,在下游NLP任务中占据主导地位。Transformer引入了自注意力机制,使注意力机制更加可并行化和高效。使用自注意力机制替代LSTM,在翻译任务中实现了更高的准确性。

基于Transformer的预训练模型: BERT (使用Transformer编码器), GPT (使用Transformer解码器), ALBERT

2. Seq2Seq和Attention

详情请参见斯坦福224N有关Sequence-to-Sequence Models and Attention的介绍:

3. Transformer

3.1 架构

**编码器:**如论文所述,

  • 编码器由6个相同的层组成
  • 每个层中有两个子层:1)一个多头自注意力机制和2)一个简单的位置完全连接的前馈网络
  • 在每个子层中,应用层标准化和残差连接

解码器:

  • 解码器也由6个相同的层组成
  • 每个层中有三个子层:1)一个掩码多头自注意力机制,2)一个简单的位置完全连接的前馈网络和3)对编码器堆栈的输出执行的多头注意力
  • 在每个子层中,都应用了层归一化和残差连接。

层归一化

$$LN(x_i)= \alpha\times \frac{x_i - \mu_L}{\sqrt{\sigma^2 + \epsilon}} + \beta$$

为什么在解码器中使用掩码?

该修改的自注意机制用于防止位置关注后续位置。

在 Transformer 中应用了两种掩码:序列掩码和填充掩码。填充掩码应用于所有的缩放点积注意力,而序列掩码仅在解码器中使用。

掩码1:序列掩码

在有监督学习任务中,我们可以看到参考翻译,因此在这种情况下可能会出现作弊。在下面的图中,我们可以看到注意力矩阵。矩阵中的每行表示一个输出,每列表示一个输入。注意力矩阵显示了输出和输入之间的关联。在这种情况下,在矩阵上应用一个下三角形掩码可以让后续输出仅依赖于先前输出。

掩码2:填充掩码

我们需要对序列进行对齐,因为不同批次中的序列长度不同。注意机制不应关注那些位置。处理这些无意义的位置的一种方法是将这些位置分配一个非常负面的值,以便在 softmax 之后,概率将非常接近于 0。

3.2 注意力

注意力函数可以描述为将查询和一组键-值对映射到输出,其中查询,键,值和输出都是向量。

3.2.1 缩放点积注意力

输入(嵌入后):

  • $\mathbf{x_1}$:[batch_size,1,embedding_dim=512]
  • $\mathbf{x_2}$:[batch_size,1,embedding_dim=512]

参数:

  • $\mathbf{W}^Q: 512\times 64$
  • $\mathbf{W}^K: 512\times 64$
  • $\mathbf{W}^V: 512\times 64$

$$ \text{Attention}(Q,K,V) = \text{softmax}

在self-attention中,$Q,K,V$是从前一层的输出中获取的,特别地,在第一层中,它们是词嵌入和位置编码的总和。在decoder中,$Q,K,V$也是从前一层的输出中获取的,类似地,在第一层中,它们也是词嵌入和位置编码的总和。与encoder不同,decoder使用掩码来隐藏接下来的信息。在encoder-decoder attention中,$Q$来自前一层的decoder输出,而$K,V$来自encoder的输出,因此decoder可以关注输入序列中的所有位置。

$d_k$是键的维数。当$d_k$很大时,点积可能会变得非常大,因此softmax函数的梯度可能非常小(因为$\exp$也会在分母中缩放巨大的值)。将其除以维数可以防止这种情况发生。

在multi-head attention中,我们将$Q,K,V$分成几个头部,并使用线性投影进行并行计算。图像显示了使用2个头的计算示例。这里的“分裂”并不意味着我们分裂了$Q,K,V$矩阵。它的意思是,我们不是初始化一组$Q,K,V$矩阵,而是初始化$h$组(在论文中$h=8$)。因此,我们最终会得到$h$个$Z$。但是,前馈网络不能接受多个矩阵作为输入,因此我们选择将这些$h$个矩阵连接起来,并初始化一个$W^O$矩阵。将连接的矩阵$Z$乘以$W^O$会得到输出。

注意:我们正在使用多个encoder / decoder层,我们必须确保输出与输入的大小相同。大小始终为$(\text{batch_size} \times \text{sequence_length} \times \text{embedding_dim})$。

Attention的几个注意点总结如下表:

QueriesKeysValues
encoder-encoderencoder输入encoder输入encoder输入
encoder-decoderdecoder输入encoder输入encoder输入
decoder-decoderdecoder输入decoder输入decoder输入

可以看出,在encoder-decoder attention中,queries与keys和values不同,而在encoder-encoder attention和decoder-decoder attention中它们是相同的。 我们还需要注意的一件事是,我们使用了多个编码器/解码器层,必须确保输出与输入具有相同的大小,大小始终为$(\text{batch_size} \times \text{sequence_length} \times \text{embedding_dim})$。

3.3 前馈网络

编码器和解码器还包含一个完全连接的前馈网络。前馈网络由两层组成:1)线性激活函数,2)ReLU。$x$是自注意力的输出,$W_1,W_2,b_1,b_2$是需要学习的参数。 $$ \text{FFN}(x) = \max (0, xW_1+b_1)W_2 +b_2 $$

3.4 位置编码

由于我们的模型不包含循环和卷积,为了使模型利用序列的顺序,我们必须注入有关序列中令牌的相对或绝对位置的信息。 $$ PE_{(pos,2i)} = \sin (\frac{pos}{10000^{2i/d_\text{model}}}) $$

$$ PE_{(pos,2i+1)} = \cos (\frac{pos}{10000^{2i/d_\text{model}}}) $$

  • $i$:维度
  • $pos$:位置
  • $d_\text{model}$:嵌入维度

例如,如果我们有一个令牌,其中$pos=3$,$d_\text{model}=512$,则位置编码将为: $$ (\sin \frac{3}{10000^{0/256}}, \cos \frac{3}{10000^{1/256}}, \sin \frac{3}{10000^{2/256}}, \cos \frac{3}{10000^{3/256}}, \dots) $$ 这意味着,对于偶数位置,我们使用$\sin$进行编码,而对于奇数位置,则使用$\cos$。位置编码使用绝对位置编码器。但是,相对位置也包含重要信息。这就是为什么我们使用三角函数的原因。 $$ \sin(\alpha+\beta) = \sin \alpha \cos \beta + \cos \alpha \sin \beta \ \cos(\alpha + \beta) = \cos \alpha \cos \beta - \sin \alpha \sin \beta $$

因此,对于一对令牌之间的任何偏移$k$,$PE(pos+k)$可以用$PE(pos)$和$PE(k)$表示,这意味着我们可以表示相对位置。

4. 实验设置和结果

实验设置,包括硬件信息和超参数,可以在原始论文中查看。他们在英语到德语和英语到法语任务上评估了模型,并且在两个任务上都比当时的SOTA模型取得了更高的准确性。