概念
Transformer
- Transformer 是 Google 的团队在 2017 年提出的一种 NLP 经典模型,现在比较火热的 Bert 也是基于 Transformer。
- Transformer 模型使用了注意力机制(attention mechanisms),不采用 RNN 的顺序结构,使得模型可以并行化训练,而且能够拥有全局信息
- Transformer 使用的是Encoder + Decoder的结构
Transformer 整体结构
- 添加了补充信息(手动修改版):
Transformer的编码器(Encode Block):
- 组成:由Multi-Head Attention,Add & Norm,Feed Forward 组成
- 作用:通过多头注意力机制、带有残差连接、层归一化、逐位置前馈网络,将输入的Embedding丰富化,形成更丰富的输入特征
softmax函数:
- 作用:将一组输入通过函数的方式,预测每个输出的可能概率,这个转换函数即softmax函数
- 公式:
$$
\sigma(z)j=\frac{e^{z_j}}{\sum{n}e{z_i}} \
z=[z_1,z_2,...,z_n] \
z:\text{输入向量},n:\text{向量的维度},\sigma(z)_j:\text{输出向量中,第j个元素的概率}
$$
点积操作(余弦法):
- 作用:计算相似度。如果两个向量的点积接近于0,它们被认为是正交的,即不相似;如果点积的绝对值很大,它们被认为是相似的
- 公式:
$$
\begin{aligned}
a &= [ a_1, a_2, \dots, a_n] \
b &= [ b_1, b_2, \dots, b_n] \
\
a \cdot b & = [a_1 b_1 + a_2 b_2 + \dots + a_n b_n] \
&= \sum\limits_{i=1}^n a_i b_i
a \cdot b = |a| |b| \cos \theta
\end{aligned}
$$
Transformer的输入:
单词的表示向量x:
- 公式: x = 单词 Embedding + 位置 Embedding
单词 Embedding:
- 含义:
- 逻辑上解释,词向量(Embedding)是从不同的语义角度(多维)解释单词。换个说法就是词向量表示单词的多维特征值。
- 数学上解释为,将词汇映射到多维空间中的向量表示。
- 预训练获取:
- Word2Vec
- Glove
- Transformer
位置 Encoding(Position Encoding):
- 表示单词出现在句子中的位置(因为 Transformer 不采用 RNN 的结构,而是使用全局信息,这样就不能利用单词的顺序信息)
- 位置Encoding与单词Embedding具有相同的维度$d_{model}$
- 位置PE的计算:
$$
\begin{aligned}
PE_{(pos,2i)} &=\sin(pos/10000^{2i/d_{model}})\
PE_{(pos,2i + 1)} &=\cos(pos/10000^{2i/d_{model}}) \
\text{pos}:\text{单词位置}, \text{i}:\text{维度}
\end{aligned}
$$
Transformer的注意力机制:
- 注意力函数可以描述为将一个查询$Q$和一组键值对$KV$映射到一个输出,其中查询$Q$、键$K$、值$V$和输出$Attention(Q,K,V)$都是向量。
- 输出$Attention(Q,K,V)$是值的加权和,其中分配给每个值的权重是由查询与相应键的相容函数计算得出的
- QKV的计算:
- 假设我们有一个模型,将英语句子$X$翻译成法语句子$Y$
- $X$的第一个词向量一般是$BOS$/$SOS$标记,该模型需要从输入句子 $X$ 中为输出句子 $Y$ 中的第一个词向量 $y1$ 提取上下文
$$
X = \begin{bmatrix}
\boldsymbol{x}_1 \
\boldsymbol{x}_2 \
\vdots \
\boldsymbol{x}_m
\end{bmatrix} \
Y = \begin{bmatrix}
\boldsymbol{y}_1 \
\boldsymbol{y}_2 \
\vdots \
\boldsymbol{y}_m
\end{bmatrix}
$$ - 对于$Q$:
- 假设:$y_1$是输出句子$Y$的第一个元素,本身是四个维度的向量
- 假设:$Q$的权重矩阵为$W^Q$,
- 对$y_1$进行$W^Q$点积计算$q_1 = y_1 \cdot W^Q$,计算$y_1$在注意力计算中的查询需求:
- 对于其他q值
$$ Q = \begin{bmatrix}
\boldsymbol{q}_1 \
\boldsymbol{q}_2 \
\vdots \
\boldsymbol{q}_n \
\end{bmatrix} = \begin{bmatrix}
\boldsymbol{y}_1 W^Q \
\boldsymbol{y}_2 W^Q \
\vdots \
\boldsymbol{y}_n W^Q
\end{bmatrix} = \begin{bmatrix}
\boldsymbol{y}_1 \
\boldsymbol{y}_2 \
\vdots \
\boldsymbol{y}_n \
\end{bmatrix} W^Q = YW^Q
$$
- 对于$K$:
- 假设:$x_1$是输入句子$X$的第一个元素,本身是四个维度的向量
- 假设:$K$的权重矩阵为$W^K$
- 对$x_1$进行$W^K$点积计算$k_1 = x_1 \cdot W^K$,计算$x_1$在注意力计算中的查询需求
- 对于其他k值
$$
K = \begin{bmatrix}
\boldsymbol{k}_1 \
\boldsymbol{k}_2 \
\vdots \
\boldsymbol{k}_n \
\end{bmatrix} = \begin{bmatrix}
\boldsymbol{x}_1 W^K \
\boldsymbol{x}_2 W^K \
\vdots \
\boldsymbol{x}_n W^K \
\end{bmatrix} = \begin{bmatrix}
\boldsymbol{x}_1 \
\boldsymbol{x}_2 \
\vdots \
\boldsymbol{x}_n \
\end{bmatrix} W^K = XW^K
$$
- 计算$q_1$和$k_1$的相似度得分,对$q_1$值和$k_1$值进行点积:
- 其中q、k维度必须相同(通过$WQ$、$WK$进行矩阵变换保证) $\dim(\boldsymbol{q}_1) = \dim(\boldsymbol{k}_1)$
- $\boldsymbol{s}_{11} = \boldsymbol{q}_1 \cdot \boldsymbol{k}_1 = \boldsymbol{q}_1\boldsymbol{k}^T_1$
- 计算$q_1$在$X$中每个key的相似度得分,对$q_1$值和$K$向量进行点积:
$$
\begin{aligned}
\boldsymbol{q}_1 K^\top &= \boldsymbol{q}_1 \begin{bmatrix}
\boldsymbol{k}_1 \
\boldsymbol{k}_2 \
\vdots \
\boldsymbol{k}_n \
\end{bmatrix}^\top \
&= \boldsymbol{q}_1 \begin{bmatrix}
\boldsymbol{k}_1^\top & \boldsymbol{k}_2^\top & \dots & \boldsymbol{k}_n^\top
\end{bmatrix} \
&= \begin{bmatrix}
\boldsymbol{q}_1 \boldsymbol{k}_1^\top & \boldsymbol{q}_1 \boldsymbol{k}2^\top & \dots & \boldsymbol{q}1 \boldsymbol{k}n^\top
\end{bmatrix} \
&= \begin{bmatrix}
s & s & \dots & s
\end{bmatrix}
\end{aligned}
$$ - 将得分转换为可能性/权重,对$q_1 K^T$的得分矩阵,进行$softmax()$,得到的结果表示在考虑查询$q_1$时,应该给$X$中的各个key多少权重,即$q_1 \text{对于} X$的注意力权重(attention weights):
$$
\begin{aligned}
\
\text{softmax}(\boldsymbol{q}1 K^\top) &= \text{softmax}(\begin{bmatrix}
s & s_{12} & \dots & s_{1n}
\end{bmatrix}) \
&= \begin{bmatrix}
w_{11} & w_{12} & \dots & w_{1n}
\end{bmatrix}
\end{aligned}
$$ - 对于$V$:
- 通过上述步骤,得到了$q_1$的注意力权重,如果要得到最终结果,还需要$X$的各个key的value值特征矩阵$V$:
- 假设$X$的value值权重矩阵为$W^V$
- 对$X$的元素进行计算:
$$
V = \begin{bmatrix}
\boldsymbol{v}_1 \
\boldsymbol{v}_2 \
\vdots \
\boldsymbol{v}_n
\end{bmatrix} = \begin{bmatrix}
\boldsymbol{x}_1 W^V \
\boldsymbol{x}_2 W^V \
\vdots \
\boldsymbol{x}_n W^V
\end{bmatrix} = \begin{bmatrix}
\boldsymbol{x}_1 \
\boldsymbol{x}_2 \
\vdots \
\boldsymbol{x}_n
\end{bmatrix} W^V = XW^V
$$
- 计算单词向量$y_1$对应的查询$q_1$在句子$X$中的上下文:
$$
\begin{aligned}
\
\text{softmax}(\boldsymbol{q}1^\top K) V &= \begin{bmatrix}
w & w_{12} & \dots & w_{1n}
\end{bmatrix} , V \
&= \begin{bmatrix}
w_{11} & w_{12} & \dots & w_{1n}
\end{bmatrix} \begin{bmatrix}
\boldsymbol{v}_1 \
\boldsymbol{v}2 \
\vdots \
\boldsymbol{v}n
\end{bmatrix} \
&= \sum\limits^n w \boldsymbol{v}_i
\end{aligned}
$$ - 计算整个$Y$在$X$的上下文:
- 见下一章 缩放点积注意力
- 其中 权重矩阵 $WQ,WK,W^V$都会在训练过程中得到优化
- $X$的第一个词向量一般是$BOS$/$SOS$标记,该模型需要从输入句子 $X$ 中为输出句子 $Y$ 中的第一个词向量 $y1$ 提取上下文
缩放点积注意力(Scaled Dot-Product Attention)
-
是计算注意力权重的一种具体方法
-
通过计算查询向量和键向量的点积 $QK^{\mathrm{T}}$,然后将这个点积结果除以 $\sqrt{d_k}$($d_k$是键向量的维度,即向量矩阵的列数)进行缩放,再经过 $Softmax$ 函数得到注意力权重。最后用这些权重对值向量 $V$ 进行加权求和得到输出:
$$
\text{Attention}(Q,K,V)=\text{softmax}\left(\frac{QK^{\mathrm{T}}}{\sqrt{d_k}}\right)V\
\text{where } Q = YW^Q, K = XW^K, V = XW^V
$$ -
缩放的目的:
- 是为了避免当 ${d_k}$ 较大时,点积结果过大,导致 Softmax 函数的梯度变得极小,从而影响模型的训练。
-
结构示意图:
-
计算过程图:
多头注意力(Multi-Head Attention)
- 多头注意力是由多个缩放点积注意力组合形成的
- 多头注意力使模型能够在不同位置共同关注来自不同表示子空间的信息
- 由于每个头的维度降低,总计算成本与具有全维度的单头注意力相似
$$
MultiHead(X,Y)=MultiHead(Q,K,V)=Concat(head_1,\ldots,head_h)W^{O}\quad \
where\ head_i = Attention(QW{Q}_i,KW_i,VW^{V}i) \qquad (i = 1 \dots h)
$$
一般 $h=8$ 表示8个注意头,且 $d_k = d_v = d/h = 64$;因为$W^O$的存在,实际,每个头不一定都必须使用相同的维度64
$W^{O}$:通过变换还原对应的维度的矩阵 - 结构示意图:
- 计算示意图:
自注意力机制(self-Attention)
- 操作在同一个序列上的注意力机制就是自注意力机制,即查询(Query)、键(Key)和值(Value)都来自同一个序列
- 在Encoder中的多头注意(Multi-Head Attention)是自注意力机制(self-Attention),因为其中的$X = Y$
- 在Decoder中的多头注意(Multi-Head Attention)非自注意力机制,而是源-目标注意力机制。(Mask Multi-Head Attention是自注意力机制)因为其中的$X != Y$
Transformer的 残差连接与层归一化层(Add & Norm):
Add&Norm
-
LayerNorm主要是将上层的结果进行归一化(LayerNorm)处理
公式:
$$
\text{LayerNorm}(x + MultiHeadAttention(x))、\text{LayerNorm}(x + FeedForward(x))
$$
X表示 Multi-Head Attention 或者 Feed Forward 的输入,MultiHeadAttention(X) 和 FeedForward(X) 表示对应的输出 (输出与输入 X 维度是一样的,所以可以相加) -
Add:
Add指 X + MultiHeadAttention(X),是一种残差连接。通常用于解决多层网络训练的问题,可以让网络只关注当前差异的部分 (在 ResNet 中经常用到) -
Norm:
Norm指 Layer Normalization(通常用于 RNN 结构)。将每一层神经元的输入都转成均值方差都一样的,这样可以加快收敛 -
残差连接公式:
Transformer的 逐位置前馈网络(Feed-Forward Networks):
- 每一层都包含一个全连接前馈网络,该网络分别且同等地应用于每个位置。
- 它由两个线性变换组成,中间有一个 ReLU 激活函数:
$$
FFN(x)=\max(0,xW_1 + b_1)W_2 + b_2 \
x:{输入},W_1、W_2:{线性变换权重矩阵},b_1、b_2:{偏置项}
$$ - ReLU 激活函数(Rectified Linear Unit):
$y=max(0,x)$,当输入x大于0时,激活函数
Transformer的解码器(Decode Block):
- 组成:由Masked Multi-Head Attention、Multi-Head Attention、Add&Norm、Feed-Forward、Softmax组成
- 作用:生成丰富Embedding的、对翻译输出结果有用的编码器
解码器中的掩蔽多头注意力(Masked Multi-Head Attention):
- 在 Decoder 的时候,是需要根据之前的已预测结果,求解当前位置最有可能的预测结果。因为有顺序的要求,所以需要逐个预测。通过Mask操作,可以避免当前位置知道后续位置的信息。
- Mask操作本身通过Mask矩阵进行变换得到结果
- 公式:
$$
Attention(Q,K,V)=softmax\left(\frac{QK^{\mathrm{T}}Mask}{\sqrt{d_k}}\right)V
$$ - Mask预测过程:
- 对$QK^{\mathrm{T}}$的结果应用Mask矩阵转换
- 对$QK^{\mathrm{T}}$的结果应用Mask矩阵转换
解码器中的多头注意(Multi-Head Attention):
- 作用:计算输入句子的特征(嵌入)与输出(部分)句子的特征之间的注意力值(源-目标注意力机制)
- K、V由编码器的输出计算得到(而不是上一个Decode Block)
- Q由上一个Decoder Block输出得到
- 好处:Decoder可以利用到Encoder的所有单词信息(单词信息无需Mask操作)
- LLM概念脑图
- GPT
- transformer
- self-attention
- COT(Chain of Thought)
- RLHF
- fine-tune
- Lora
- Sora
- TTS
参考:
- attention is all you need
- The Annotated Transformer
- Transformer’s Encoder-Decoder
- Transformer’s Self-Attention
- Transformer’s Positional Encoding