多头自注意力机制与Transformer
2024.12.06整理
自注意力机制(计算过程见:https://zhuanlan.zhihu.com/p/338817680 3.2节与3.3节)
有$M$个特征(或者单词) (又叫seq_len: 句子长度,即单词数量)
每个单词用一个$d$维向量表示,记作矩阵,矩阵有$M$行,每行对应一个特征/单词,每行是$d$维。
Self-Attention 的输入是矩阵$X$,则可以使用线性变换矩阵$W_Q,W_K,W_V$计算得到$Q,K,V$矩阵。
$W_Q,W_K,W_V$的维度是,得到的$Q,K,V$矩阵的维度是。 $X, Q, K, V$的每一行都对应一个单词。
矩阵乘法:
$Q=X×W_Q$
$K=X×W_K$
$V=X×W_V$
然后计算$Score(Q,K^T)$,即矩阵相乘$QK^T$,维度是$M*M$,元素$a_{ij}$代表第$i$个单词和第$j$个单词之间的关联程度(attention强度/权重/attention系数/相似性)。
(为了防止$a_{ij}$过大,所有的$a_{ij}$都要除以$\sqrt{d’}$)
再对$QK^T$的每一行做$softmax$,使得每行各元素之和都为1.
得到新的维度为$M*M$的矩阵$softmax(QK^T)$。
再和矩阵$V$进行元素相乘,得到最终的输出矩阵$Z$,$Z=softmax(QK^T) × V$
$Z$的维度是$M*d’$
矩阵$X,V,Z$的每一行都是对每个单词的向量表示,都有$M$行,因此该过程简单来讲就是$X→V→Z$,
得到最终的矩阵$Z$,$Z$的每行是作为对每个单词的新向量表示。
每个单词的新向量,都是融合了其它单词信息的新向量。而$X$的每行是没有融合其他单词信息的旧向量。计算公式写成:
自注意力机制的输出为矩阵$Z$:
多头自注意力机制
(一组头:就是一组$Q \ K \ V$矩阵,多头有多组$Q \ K \ V$矩阵,从而得到不同的输出矩阵$Z_i$)
【不同的头又叫不同的“子空间”,头=子空间,可理解为不同的角度】
【如果想从多个角度看,可以用多个头,即换不同的矩阵$W_Q,W_K,W_V$得到不同的$Q,K,V$,然后得到不同的输出矩阵$Z_i$】
多头自注意力机制Multi-Head Attention,是由多个自注意力机制Self-Attention组成的。
Multi-Head Attention 包含多个 Self-Attention 层,
首先将输入X分别传递到 h 个不同的 Self-Attention 中,计算得到 h 个输出矩阵$Z_i$。
比如当 h=8 时,此时会得到 8 个输出矩阵$Z_i$。
得到 8 个输出矩阵$Z_1$~$Z_8$之后,Multi-Head Attention 将它们拼接在一起 (Concat),然后传入一个Linear层,得到 Multi-Head Attention 最终的输出Z。
(每个$Z_i$的维度是,与$X$的维度不同;而多头自注意力机制的最终输出$Z$的维度是,与$X$的维度相同。)
Transformer其他细节:
见下面,写的易懂,要多看!
https://zhuanlan.zhihu.com/p/338817680
补充笔记:
Transformer 本身是不能利用单词的顺序信息的,因此需要在输入中添加位置 Embedding!
$PE_{pos,2i},PE_{pos,2i+1}$,这里的$2i,2i+1$是维度索引,即分量,是在计算奇数编号和偶数编号的分量的值。
层归一化(Layer Normalization)和批归一化(Batch Normalization,BN)的区别:
假设输入矩阵为$X_{n*d}$,
n 是批量大小(batch size),代表有n个单词/物品,一行对应一个;
d 是每个单词/物品的特征数量。
Layer Normalization 的步骤如下:
计算均值: 对每个样本(行)计算特征的均值。对于第$i$个样本$\mathbf{x}_i = (x_{i1}, x_{i2}, …, x_{id})$,均值是:
计算方差: 对每个样本计算特征的方差:
归一化: 使用均值和方差对每个特征进行归一化:
其中 $\epsilon$ 是一个非常小的常数,用于防止除零错误。
缩放和平移: 在归一化后,Layer Normalization 会引入两个可学习的参数 $\gamma$ 和 $\beta$,分别用于缩放和平移。最终输出是:
其中 $\gamma_j$ 和 $\beta_j$是为每个特征(每个列)学习到的参数。
总结:
Layer Normalization 对每个样本的特征进行归一化。
它不像 Batch Normalization 依赖于批量数$n$,而是对每个样本单独归一化,适用于处理序列数据(如RNN、Transformer等),尤其在批量大小较小或单个样本处理时。
批归一化的步骤:
计算批次均值: 对整个批次的每个特征维度(列)计算均值,即计算每一列(特征)在批次中所有样本的均值。对于第$j$个特征维度,它的批次均值是:
其中,$x_{ij}$是第 $i$个样本在第$j$个特征维度上的值。
计算批次方差: 对整个批次的每个特征维度(列)计算方差,即计算每一列(特征)在批次中所有样本的方差。对于第$j$个特征维度,它的批次方差是:
这里的$\sigma_j^2$是第$j$个特征维度在批次中的方差。
归一化: 使用计算得到的均值$\mu_j$和方差 $\sigma_j^2$对每个样本的每个特征进行归一化处理。对于第$i$个样本在第$j$个特征维度上的归一化值:
这里$\epsilon$ 是一个很小的常数,用来防止方差为零时出现除零错误。
缩放和平移(可选): 批归一化通常会引入两个可学习的参数:$\gamma_j$和$\beta_j$,分别用于缩放和偏移归一化后的值。这样做的目的是让网络有更大的表达能力,因为在训练过程中,经过归一化的输出可以通过这些参数重新调整回原始尺度。
其中,$\gamma_j$是缩放因子,$\beta_j$是偏移因子,通常会初始化为1和0。
批归一化通常在卷积神经网络(CNN)和全连接层网络(FCN)中使用。
层归一化:是在每个样本的特征维度上进行归一化,每个样本独立归一化。每行进行归一化、
批归一化:是在整个批次上对每个特征维度进行归一化,考虑了批次中的所有样本。每列进行归一化。
每个Decoder Block:
- 包含两个 Multi-Head Attention 层。
- 第一个 Multi-Head Attention 层采用了 Masked 操作:
- 在计算得到$QK^T$,对$QK^T$的每一行做$softmax$之前,
- 先使用Mask矩阵,将$QK^T$变成Mask $QK^T$,
- 再对Mask $QK^T$的每一行做$softmax$。
- 第二个 Multi-Head Attention 层的K, V矩阵使用 Encoder 的编码信息矩阵C进行计算得出,而Q使用上一个 Decoder block 的输出计算得出。
Encoder和Decoder的输入输出:
Encoder的输入:源文本的单词表示矩阵$X_{n,d}$, 如“我 有 一只 猫”,共4个单词
Encoder的输出:信息编码矩阵$C_{n,d}$,与$X$的维度一致,
Decoder的输入:目标文本的单词表示矩阵$X_{n,d}$,如”<Begin> I have a cat”,共5个单词
(Encoder的输出矩阵$C$会输入到Decoder的第二个$Multi-Head \ Attention$中)
Decoder的输出:预测的单词序列,如“I have a cat <end>”。

...
...
This is copyright.