Transformer Model Learning

Oct 10, 2024 · 2 min read

Transformer (原文Attention is all your need) 小白学习路线:

  1. 台大李宏毅自注意力机制和Transformer详解 (强推!)
  2. 李沐Transformer论文逐段精读【论文精读】
  3. 【官方双语】GPT是什么?直观解释Transformer | 深度学习第5章

self-attention

Self-Attention是Transformer最核心的内容。在每个自注意力模块中,对于输入的prompt,每个单词有3个不同的矩阵,分别是查询(Query $Q$)、键(Key $K$)和值(Value $V$),长度均是64。它们是通过3个不同的权值矩阵由输入矩阵$X$乘以三个不同的权值矩阵$W^Q, W^K, W^V$得到,相当于经历了一次线性变换。其中$W^Q, W^K, W^V$是三个可训练的参数矩阵,三个矩阵的尺寸都是$512 \times 64$。 得到的$Q, K, V$可以理解为:

$Q$:要查询的信息,查询

$K$:被查询的向量,索引

$V$:查询得到的值,内容

Transformer原文《Attention is all you need》中将这个Attention公式描述为:Scaled Dot-Product Attention。

$Q = XW_Q$

$K = XW_K$

$V = XW_V$

$Attention(Q, K, V) = Softmax(\frac{QK^T}{\sqrt{d_k}})$V

Attention不直接使用$X$,而是使用经过矩阵乘法生成的这三个矩阵,因为使用三个可训练的参数矩阵,可增强模型的拟合能力。

那么$Q, K, V$三个矩阵在Attention的计算中扮演什么角色呢?我们对Attention的计算方法分步骤解读。

(1)将输入单词转化为嵌入向量$X$

(2)根据嵌入向量得到$Q, K, V$三个向量

(3)计算$Q$和$K$的相似度,也就是使用点积法计算相关性得分,即用$Q$中每一个向量与$K$中每一个向量计算点积,具体到矩阵的形式:$score = Q \cdot K^T$,$score$是一个$(2,2)$的矩阵

(4)transformer对$score$进行归一化,即$score = \frac{score}{\sqrt{d_k}}$。$d_k$就是$Q, K$矩阵的列数,即向量维度。这个除法被称为Scale,当$d_k$很大时,$QK^T$的乘法结果方差变大,进行Scale可以使方差变小,训练时梯度更新更稳定。

(5)通过softmax激活函数,将对$score$转换成$[0, 1]$之间的概率分布,同时更加凸显单词之间的关系。经过softmax的归一化后,每个值是一个大于0小于1的权重系数$\alpha$,且总和为0,这个结果可以被理解成一个权重矩阵

(6)根据每个单词之间的概率分布,然后乘上对应的Values值,$\alpha$与$V$进行点积,即$Z=softmax(score) \cdot V$,得到加权的每个输入向量的评分

Multi-Head Attention

为了增强拟合功能,Transformer对Attention继续扩展,提出了Multi-Head Attention。多头注意力的原理很简单,就是self-attention的基础上,对于输入的embedding矩阵,self-attention只使用了一组$W^Q, W^K, W^V$来变换得到Query, Keys, Values。而Multi-Head Attention使用多组$W^Q, W^K, W^V$得到多组Query, Keys, Values,每组分别计算生成不同的$Q, K, V$。 然后每一组分别计算得到一个加权之后的特征矩阵$Z_i$,将得到多个$Z_i$矩阵拼接(Concat)成一个大的特征矩阵$Z$,最后再用$Z$乘以$W^O$便得到了整个多头注意力层的输出。

具体的,其计算公式为:

$$MultiHead(Q,K,V) = Concat(head_1,...,head_h)W^O$$$$where\ head_i = Attention(QW_i^Q,KW_i^K,VW_i^V)$$

其中,$W_i^Q \in \mathcal{R}^{d_{model}\times{d_k}}, W_i^K \in \mathcal{R}^{d_{model}\times{d_k}}, W_i^V \in \mathcal{R}^{d_{model}\times{d_v}}, W^O \in \mathcal{R}^{hd_v\times{d_{model}}}$。

在计算每个head的注意力后,将所有头连接在一起,并通过一个线性层($W^O$矩阵)传递它。反过来,每个头都是用query、key和value(分别为$W^Q, W^K, W^V$矩阵)的三个单独矩阵的scaled dot-product attention。这三个矩阵对于每个头都是不同的,这就是下标$i$存在的原因。

在原文中,作者使用了$h=8$个并行的自注意力模块(8个头)来构建一个注意力层,并且对于每个自注意力模块都限定了$d_k = d_v = d_{model}/h = 64$。也就是说,多头注意力机制其实就是将一个大的高维单头拆分成了$h$个多头 整个过程如下图所示:

Add & Norm

得到特征向量$Z$后,并没有直接传入全连接神经网络FNN,而是经过了一步:Add & Normalize。

Add & Norm 层由 Add 和 Norm 两部分组成,其计算公式如下:

$$LayerNorm(X + MultiHeadAttention(X))$$$$LayerNorm(X + FeedForward(X))$$

其中,$X$表示 MultiHeadAttention 或 FeedForward 的输入,MultiHeadAttention($X$) 和 FeedForward($X$) 表示输出(输出和输入$X$维度是一样的,所以可以相加)

Add指$X$+MultiHeadAttention($X$),这是一种残差连接,通常用于解决多层网络训练的问题,可以让网络只关注当前差异的部分。

Norm指Layer Normalization,通常用于 RNN 结构,Layer Normalization 会将每一层神经元的输入都转成均值方差都一样的,这样可以加快收敛。

FFN

transformer模型中的全连接层是一个两层的神经网络,第一层的激活函数是ReLU,第二层是一个线性激活函数,可以表示为:

$$FFN(Z) = \max(0, ZW_1+b1)W_2+b2$$

先线性变换,然后ReLU非线性,再线性变换。输入的$Z$就是多头注意力的输出。经过FFN后最终得到的输出矩阵的维度与输入$Z$是一致的。因为这两层网络是为了将输入的$Z$映射到更高维的空间中,然后通过非线性函数ReLU进行筛选,筛选完后再变回原来的维度。

Maybe: Attention is all your need!


BGM:

  • 亲爱的,那不是爱情 -- 张韶涵

Reference

[1] The Illustrated Transformer

[2] 注意力机制到底在做什么,Q/K/V怎么来的?一文读懂Attention注意力机制

[3] This post is all you need(上卷)——层层剥开Transformer

[4] 详解Transformer (Attention Is All You Need)

[5] 史上最小白之Transformer详解

[6] Transformer模型详解(图解最完整版)

[7] 关于Transformer的那些个为什么

[8] How to Estimate the Number of Parameters in Transformer models

[9] 手写 Self-Attention 的四重境界,从 self-attention 到 multi-head self-attention

[10] Transformer推理结构简析(Decoder + MHA)