transformer中自注意力和交叉注意力

自注意力机制(Cross-Attention)

自注意力是注意力机制的一个特例,但和注意力有区别,所有自注意力都是注意力,但并非所有注意力都是自注意力。自注意力的核心作用是信息聚合。

1、Q,K,V的来源:同源

        Q (Query)、K (Key)、V (Value) 都来自同一个输入序列。这意味着序列中的每个元素(例如一个词)在计算注意力时,是拿着自己的 Query 去匹配该序列中所有元素(包括它自己)的 Key,并根据匹配度对它们的 Value 进行加权求和。

2、要解决的问题/目的:

        如何让一个序列内部的元素彼此建立关联,捕捉全局的上下文依赖关系。例如在处理句子时,它计算出句子中每个词与其他所有词的相关性,从而为每个词生成一个上下文感知的表示。

3、典型应用:

        Transformer 架构中的编码器(Encoder)所有层内部。

        Transformer 架构中的解码器(Decoder)第一个子层(带掩码)内部。

交叉注意力机制(Cross-Attention)

交叉注意力机制是通用注意力机制(Attention Mechanism)的一种典型应用,尤其指代编码器-解码器架构中的注意力。它是连接两个不同序列之间的信息交互,关注“对方哪里什么更重要”

  1. Q, K, V 的来源:不同源

    Q (Query):来自一个序列(通常是上一层的解码器输出),K (Key)V (Value):来自另一个序列(通常是编码器的最终输出)。
  2. 要解决的问题/目的:

    如何让一个序列(目标序列,如解码器正在生成的输出)与另一个序列(源序列,如编码器处理的输入)建立关联。让解码器在生成每一个 Token 时,能够有选择地关注输入序列中最相关的部分,从而提取所需信息。这类似于机器翻译中的“对齐”过程。
  3. 典型应用:

    Transformer 解码器中第二个子层(多头编码器-解码器注意力机制)。

多头注意力机制(Multi-Head Attention)

多头注意力的基本原理

多头注意力机制的核心思想是将单次注意力计算分成多个并行、独立的“头”(Heads)进行计算,最后将所有“头”的结果整合起来,以获得更丰富和全面的信息捕捉能力。

1. 多个“头”:学习不同的特征侧面
  • 并行计算: 多头注意力将完整的 Q (Query), K (Key), V (Value) 向量通过多组不同的、可学习的线性变换,映射到多个独立的子空间中,每个子空间对应一个“头”。

  • 捕捉多样性: 每个“头”都在这个降维的子空间中独立执行一次注意力计算。由于每个头使用的线性变换矩阵不同,它们能够从输入序列中不同的维度和侧面捕捉到关联性。例如,一个头可能关注语法上的关系,而另一个头可能关注语义上的关系。

2. 合并与整合
  • 拼接(Concatenate): 当所有独立的“头”计算完成后,将它们各自得到的输出向量按顺序拼接在一起,形成一个更宽的向量。

  • 最终投影: 对拼接后的结果进行最后一次线性变换(投影),将它变回模型所需的原始维度,作为多头注意力机制的最终输出。

3. 作用和优势

多头注意力机制的主要优势在于它赋予了模型强大的表达能力。它通过同时关注来自不同子空间的信息,避免了单次注意力计算可能错过重要关联的问题,使得模型能够更稳定、更全面地理解输入序列中复杂的依赖关系。

同时,由于它是通过在多个降维子空间中并行计算实现的,所以在计算效率上与单次全维度注意力计算相比是相当的

向量填充的作用

向量填充的主要目的是为了实现批量处理(Batch Processing)

  1. 确保序列长度一致: 在训练模型时,一个批次(Batch)中的所有句子长度必须相同,以方便进行矩阵运算。

  2. 具体操作: 填充操作使用一个特殊的 [PAD] 标记,将短于目标长度的句子填充至该长度。

填充掩码(Padding Mask)的作用

填充掩码的目的是在模型的注意力计算中“掩盖”掉填充位置,让模型忽略这些无效的字符。

  1. 避免模型学习无效信息: 它告诉模型(尤其是注意力机制)哪些位置是真实的单词,哪些是填充的无效字符,从而避免模型从这些无意义的 [PAD] 标记中学习。

  2. 工作原理: 在计算注意力权重时,填充掩码会将注意力分数矩阵中对应于 [PAD] 的位置设置为一个极小的负数(如 -1e9)。

  3. 结果: 这样经过 Softmax 函数层后,这些填充位置的注意力权重会趋近于 0,从而在加权求和时,模型就不会关注这些填充的向量。

位置编码

位置编码的基本原理和作用

位置编码的作用就是人工地将序列的顺序信息添加到输入向量中,让模型知道各个元素在序列中的位置。

  1. 作用:

    将每个 Token 在序列中的位置信息注入到词嵌入向量中。让模型知道序列中的各个元素在序列中的相对位置和绝对位置
  2. 基本原理(实现方式):

    为序列中的每个位置(例如,第一个词、第二个词)生成一个独一无二的位置编码向量。该位置编码向量与词嵌入向量具有相同的维度注入方式: 在将词向量输入给 Transformer 编码器之前,将词嵌入向量(Word Embedding)和对应的位置编码向量(Positional Encoding)进行相加,形成包含了位置信息的最终输入向量。位置编码的生成方式可以是固定的(例如,使用正弦和余弦函数)或可学习的。

为什么使用位置编码?

使用位置编码的根本原因在于 Transformer 模型固有的结构缺陷——它无法感知序列的顺序信息

  1. 自注意力机制的特性导致位置信息丢失:

    Transformer 的核心是自注意力机制,它通过并行计算序列中所有词之间的相似度来捕捉依赖关系。在这个计算过程中,模型只关心词向量本身的内容相似度,完全不关心它们在序列中的排列顺序。因此,对于自注意力层来说,输入序列被视为一个集合(Set),而不是一个序列(Sequence)。
  2. 无法区分语序:

    如果不添加位置信息,模型无法区分“猫坐在垫子上”和“垫子坐在猫上”这两个语序不同但词汇集合完全相同的句子,这会导致语义错误。
  3. 与 RNN 的区别:

    像 RNN 或 LSTM 这样的循环网络是顺序处理的,其内在的串行机制已经天然地包含了位置信息。而 Transformer 为了追求高度并行计算的能力,放弃了这种串行结构,因此也丢失了内置的位置感知能力。为了弥补这一缺失,就必须显式地将位置信息“注入”到输入中。

层归一化(Layer Normalization)

层归一化(Layer Normalization)是 Transformer 架构中的一个关键组成部分,其作用和位置与残差连接(Residual Connection)紧密相关。

1. 核心作用
  • 稳定训练过程:层归一化通过将输入数据的分布标准化,可以稳定深度神经网络的训练过程。

  • 加速收敛:稳定的梯度有助于模型更快地学习和收敛。

2. 在 Transformer 中的位置

层归一化应用于 Transformer 编码器解码器的每个子层之后:

  • 编码器(Encoder):位于多头自注意力机制和前馈神经网络这两个子层之后。

  • 解码器(Decoder):位于三个子层(掩码自注意力、交叉注意力、前馈神经网络)之后。

具体应用顺序:在 Transformer 中,每个子层(如注意力或前馈网络)的输出都会先与该子层的输入进行残差连接(即:输出 = 子层(输入) + 输入),然后紧接着应用层归一化

3. 与残差连接的关系

层归一化与残差连接同时使用,两者协同工作:残差连接用于缓解深层网络中的梯度消失问题,而层归一化则用于将残差连接后的结果进行规范化,以稳定激活值的分布。

更多推荐