transformer讲解

286 阅读1分钟

理解Q、V、V

image.png image.png

image.png

  dot得到这两条信息的相似程度,除以dk\sqrt{d_k}训练梯度稳定,最后我们用softmax函数对结果进行归一化,也就是让所有元素的和为1,现在我们得到了一个权重矩阵。

除以dk\sqrt{d_k}训练梯度稳定,为什么?

  在我们的两个向量维度非常大的时候, 点乘结果的方差也会很大(元素差距很大),在点乘的值很大softmax的梯度趋近于0,在原文中有提到 假设q和k的元素是相互独立维度为dk的随机变量,它们的平均值是0, 方差为1,那么q和k的点乘的平均值为0, 方差为dk。如果將点乘的结果进行缩放操作,也就是除以dk,就可以有效控制方差从dk回到1,也就是有效控制梯度消失的问题

image.png 我们再复习一下海王选妃的流程 输入X和三个矩阵相乘,分别得到三个矩阵Q,K,V:

  • Q是我们正要查询的信息
  • K是正在被查询的信息
  • V就是被查询到的内容

Multi-headattention

image.png

  Multi-headattention是通过h个线性变换来计算Q,K,V,也就是用h组不同的Wq,Wk,Wv和X相乘,得到h组Q,K,V,我们再分别用这h组Q,K,V计算attention, 得到h个矩阵(z1znz_1……z^n)

image.png

将h个z矩阵拼接起来,也就是经过一个线性变换,把多个子空间的结果央射到原来的空间得到结果Z

Add & Norm

image.png

  • Add:残差结构,防止退化
  • Norm:标准化,加速收敛

FNN

FFN(x)=max(0,xW1+b1)W2+b2\text{FFN}(x) = \max(0, \, xW_1 + b_1)W_2 + b_2

max(0,)\max(0, \cdot) 是 ReLU(Rectified Linear Unit)激活函数,保留正值,将负值置零,引入非线性。

最后multi-head attention提炼得到的向量,用一个两层的神经网络进一步提取它的特征,Encoder的任务就算完成啦。

decoder 解码

masked

image.png   在decoder的第一个注意力层比之前encoder中的注意力注意力层还多了一个(masked前缀) mask的两种操作:

  • 关键区别

    • Padding Mask:处理变长输入。
    • Causal Mask:保证生成顺序。

Padding Mask

1. 为什么需要 Padding Mask?

  • 输入对齐:模型需要固定长度的输入,但实际序列长度不同。
    • 过长序列:截断到最大允许长度(如 max_length=100)。
    • 过短序列:用填充符(如 0)填充到 max_length
  • 避免无效计算:填充符本身无意义,需防止模型关注这些位置。

2. Padding Mask 的核心思想

  • 掩码填充位置:在计算注意力权重时,通过添加一个极大的负值(如 -1e9),使得这些位置经过 softmax 后的权重趋近于 0
  • 数学原理softmax(xi)=exijexj\text{softmax}(x_i) = \frac{e^{x_i}}{\sum_j e^{x_j}} 若某个位置 xi=x_i = -\infty,则 exi0e^{x_i} \approx 0,对应的注意力权重为 0。

3. 实现步骤

假设原始序列为 [3, 5, 7],期望长度 max_length=5,填充后为:

padded_sequence = [3, 5, 7, 0, 0]  # 填充符为 0

(2) 生成 Padding Mask 标记填充位置为 True(需要掩码),非填充位置为 False

mask = [False, False, False, True, True]  # 对应填充后的序列 [3,5,7,0,0]

因果掩码(Sequence)

  在翻译一句话的时候,我们希望transformer按顺序来翻译它, 先翻译完前i个单词,再去预测第i+1个单词,这样的话,我们需要阻止它去注意还不该翻译到的单词,也就是每个单词只能注意到自己和自己之前的单词 。这就需要因果掩码了

因果掩码的作用

  • 强制顺序生成:在自回归(Autoregressive)任务中(如机器翻译、文本生成),模型必须按顺序逐个生成单词,每一步只能基于已生成的内容预测下一个词。
  • 防止信息泄漏:阻止模型在预测第 i+1个位置时,访问到第 i+1及之后的未来信息。

2. 因果掩码的实现

(1) 掩码形式

因果掩码是一个 下三角矩阵,形状为 (seq_len, seq_len),其中:

  • 下三角部分(包括对角线) :值为 0(允许注意力通过)。
  • 上三角部分:值为 -∞(禁止注意力通过)。

示例(序列长度=4): Mask=[0000000000]\text{Mask} = \begin{bmatrix} 0 & -\infty & -\infty & -\infty \\ 0 & 0 & -\infty & -\infty \\ 0 & 0 & 0 & -\infty \\ 0 & 0 & 0 & 0 \\ \end{bmatrix}

(2) 应用方法

  在计算自注意力分数后,将掩码添加到注意力分数矩阵上,再通过 softmax 计算注意力权重。由于 softmax 会将 -∞ 映射为 0,上三角部分的未来位置权重被清零。

Masked Scores=Scores+Mask

Transformer 中self-attention以及mask操作的原理以及代码解析_mask self attention-CSDN博客

注意力 Encoder-Decoder Multi-head Attention

1. Encoder-Decoder Attention的输入来源

  • Query (Q) :来自Decoder的当前状态(即Decoder的上一层的输出)。

    • 例如,在机器翻译中,Decoder需要根据已生成的目标序列(如“I love”)预测下一个词(如“you”),此时Q对应目标序列的表示。
  • Key (K) 和 Value (V) :均来自Encoder的最终输出。

    • Encoder对源序列(如“我 爱”)进行编码后,生成上下文相关的表示,K和V通过线性投影从这些表示中派生。

核心作用

  • 对齐源序列与目标序列
    通过计算Q(目标序列)和K(源序列)的相似度,模型学习如何从源序列中检索与当前目标位置相关的信息(即注意力权重),最终通过V加权求和得到上下文向量。
  • 示例
    在翻译“I love you”时,生成“爱”时需要关注源序列中的“love”,此时注意力权重会在“love”对应的位置达到峰值。

位置编码

image.png

  transform本来没有类似于RNN捕捉序列的能力,但如果我们将输入的文字编码成词向量的时候结合单词的位置信息,它就可以学习词序信息了。

PE的计算结果是一个行数与序列数相等,列数和模型维度相等的矩阵,pos代表的是目前的token在序列的位置,dmodel代表模型的维度

image.png

相对距离的线性表示

  对任意相对距离 k,PEpos+k可用PEpos的线性函数表示,所以两个位置点积反映相对距离,从而对注意力产生影响。

  • (1) 线性关系的存在性

    对于任意位置 pos\text{pos} 和相对距离 kk,存在一个线性变换矩阵 Mk\mathbf{M}_k,使得:

    PEpos+k=MkPEpos\text{PE}_{\text{pos} + k} = \mathbf{M}_k \cdot \text{PE}_{\text{pos}}

    这是由正弦和余弦函数的加法公式保证的。例如:

    sin(pos+k)=sin(pos)cos(k)+cos(pos)sin(k),cos(pos+k)=cos(pos)cos(k)sin(pos)sin(k)\sin(\text{pos} + k) = \sin(\text{pos})\cos(k) + \cos(\text{pos})\sin(k), \\ \cos(\text{pos} + k) = \cos(\text{pos})\cos(k) - \sin(\text{pos})\sin(k)

    这可以表示为矩阵乘法形式。

  • (2) 点积反映相对距离

    两个位置编码的点积仅依赖于它们的相对距离 k=pos1pos2k = \text{pos}_1 - \text{pos}_2,而与绝对位置无关:

    PEpos1PEpos2=f(pos1pos2)\text{PE}_{\text{pos}_1} \cdot \text{PE}_{\text{pos}_2} = f(\text{pos}_1 - \text{pos}_2)

    这一性质使得注意力机制能够隐式地捕捉序列中元素之间的相对位置关系。

参考资料:

Transformer使我快乐(下)_哔哩哔哩_bilibili

Transformer学习资源&顺序推荐 - 有氧 - 博客园