Skip to main content

Attention注意力机制

自注意力机制 Self-Attention

(https://space.bilibili.com/88461692/lists)
不懂去这个链接看视频
想象一下你在阅读一个句子,比如:“银行旁边的河岸上长满了青草。

当你读到“”这个字时,为了准确理解它的意思(是河岸还是银行的岸?),你的大脑会自动地将注意力更多地放在句子中的相关词语上。在这个例子中,“”这个字会告诉你这里的“岸”更可能是指“河岸”。

注意力机制的核心思想就是模拟人类这种关注重要信息、忽略不相关信息的能力。 它允许模型在处理一个序列中的某个元素时,能够动态地、有选择地从序列的其他元素中获取信息。

在 Transformer 中,最核心的是 自注意力机制 (Self-Attention)。所谓“自”,指的是序列中的元素自己关注自己序列中的其他元素,来更好地理解当前这个元素的含义。

自注意力机制的工作流程可以分解为以下几个步骤:

把每个输入词想象成一个正在开会的代表。

  1. 准备三个“角色牌” (Query, Key, Value - Q, K, V):

    • 对于输入序列中的每一个词(的 Embedding 向量),我们都会通过乘以三个不同的、可学习的权重矩阵 (W_q, W_k, W_v),为它生成三个新的向量:
      • Query (Q) 向量: 可以理解为当前这个词(代表)提出的一个“问题”或“查询”,它想知道:“序列中哪些词与我最相关?”
      • Key (K) 向量: 可以理解为序列中每个词(代表)拥有的一个“标签”或“索引”,用来被其他词的 Query 查询和匹配。
      • Value (V) 向量: 可以理解为序列中每个词(代表)实际携带的“内容”或“信息”。一旦某个词被 Query 认为高度相关,那么它的 Value 向量就会被更多地采纳。
    • 重要: 每个输入词都会有自己的一套 Q, K, V 向量。
  2. 打分:Query 与所有 Key 的“匹配度” (Score):

    • 现在,对于序列中的某一个词(我们称它为“当前词”),我们要计算它的 Query 向量与序列中所有其他词(包括它自己)的 Key 向量之间的“匹配度”或“相似度”。
    • 最常用的计算方式是点积 (Dot Product)。即,用当前词的 Q 向量去和每个词的 K 向量做点积。
    • 直观理解: 如果当前词的“问题”(Q) 和某个词的“标签”(K) 非常匹配(点积结果大),那么说明那个词可能对理解当前词很重要。
    • 例如,对于句子中的“岸”(Q),它会和“河”(K)、“银行”(K)、“旁边”(K) 等所有词的 Key 进行点积打分。
  3. 分数归一化与缩放 (Scale & Softmax):

    • 缩放 (Scale): 为了防止点积结果过大导致梯度消失或爆炸(尤其是在向量维度较高时),通常会将上一步得到的点积分数除以一个缩放因子(通常是 Key 向量维度的平方根,即 sqrt(d_k))。
    • Softmax: 然后,对这些缩放后的分数应用 Softmax 函数。Softmax 会将这些分数转换成一组概率值(注意力权重),它们的和为 1。
    • 直观理解: Softmax 后的注意力权重表示,在理解当前词时,应该给序列中其他每个词(包括它自己)分配多少“注意力”。权重越高的词,说明它与当前词的关系越密切,对理解当前词的贡献越大。
    • 例如,对于“岸”(Q),经过 Softmax 后,“河”这个词可能会获得一个较高的注意力权重 (比如 0.7),而“青草”可能获得一个较低的权重 (比如 0.1)。
  4. 加权求和:用注意力权重聚合 Value (Weighted Sum):

    • 最后,用上一步得到的注意力权重,去对序列中所有词的 Value 向量进行加权求和。
    • 直观理解: 这就像是,当前词根据它对其他词的“关注程度”(注意力权重),从其他词那里“提取信息”(Value 向量)。关注度越高的词,其信息被提取的比例就越大。
    • 这个加权求和得到的结果,就是当前词经过自注意力机制处理后新的表示 (Output Vector)。这个新的表示就融入了整个序列中与它相关的上下文信息。
    • 例如,“岸”的新表示,就会更多地融入“河”的 Value 信息,较少地融入“青草”的 Value 信息。

总结一下自注意力的核心步骤:

对于序列中的每一个词: Q = 当前词的Embedding * W_q K_i = 第 i 个词的Embedding * W_k V_i = 第 i 个词的Embedding * W_v

Score_i = Q · K_i / sqrt(d_k) AttentionWeights = Softmax(Scores)

OutputVector_当前词 = sum(AttentionWeights_i * V_i)

为什么这个机制如此强大?

  • 捕捉长距离依赖: 与 RNN 需要通过很多时间步才能传递信息不同,自注意力机制可以直接计算序列中任意两个词之间的关系,无论它们在序列中相隔多远。这对于捕捉长距离依赖非常有效。
  • 并行计算: 对于序列中的所有词,上述 Q, K, V 的生成、打分、以及最终的加权求和,很多步骤都可以通过矩阵运算高效地并行完成。这是 Transformer 比 RNN 训练更快的一个重要原因。
  • 可解释性 (一定程度上): 注意力权重可以被可视化,让我们大致了解模型在处理某个词时,更关注序列中的哪些其他部分。
  • 动态上下文: 对于同一个词,在不同的上下文中,它关注的词和被赋予的注意力权重是不同的,这使得模型能够根据具体的语境动态地调整对词的理解。

多头注意力 (Multi-Head Attention):

为了让模型能够从不同的“角度”或“子空间”关注信息,Transformer 还引入了多头注意力机制

  • 做法: 不是只有一组 W_q, W_k, W_v 权重矩阵,而是有多组(例如 8 组,即 8 个“头”)。
  • 每个“头”都会独立地执行上述的自注意力计算过程,得到一个输出向量。
  • 然后,将所有“头”的输出向量拼接起来,再通过一个线性变换(乘以一个权重矩阵 W_o)得到最终的多头注意力输出。
  • 直观理解: 就像让多个专家(每个头是一个专家)从不同方面分析同一个问题,然后综合他们的意见。有的头可能关注句法关系,有的头可能关注语义相似性等。

Transformer 中的位置:

自注意力机制是 Transformer 模型中每个 Encoder Block 和 Decoder Block 的核心组成部分。它通常会与前馈神经网络 (Feed-Forward Network) 和层归一化 (Layer Normalization) 一起构成一个完整的处理单元。

好的,我们来详细描述一下多头注意力机制 (Multi-Head Attention)。这是 Transformer 模型中一个非常重要的组件,它建立在基础的缩放点积注意力(Scaled Dot-Product Attention,也就是我们之前讨论的自注意力核心)之上,并对其进行了扩展。

为什么需要多头注意力?

单一的自注意力机制虽然强大,但它在学习信息时可能只关注一种类型的相关性。就像一个人可能只从一个角度看问题。

多头注意力的核心思想是:让模型能够从不同的表示子空间 (representation subspaces) 并行地学习信息,并关注到不同方面或类型的相关性。 这就像同时有多个“注意力头”,每个头独立地学习关注序列中的不同部分或不同类型的模式。

多头注意力机制的工作流程:

假设我们有 h 个“头”(例如 h=8 是一个常见设置)。

  1. 输入准备 (对每个头进行线性投影):

    • 对于输入的 Query (Q), Key (K), 和 Value (V) 向量(这些通常是前一层输出的词嵌入或隐藏状态),我们不再像单头注意力那样只有一组线性变换权重 W_q, W_k, W_v
    • 取而代之的是,我们为每一个头 i (从 1 到 h) 都准备一套独立的、可学习的线性变换权重矩阵:
      • W_q^{(i)} (Query 权重矩阵 for head i)
      • W_k^{(i)} (Key 权重矩阵 for head i)
      • W_v^{(i)} (Value 权重矩阵 for head i)
    • 原始的 Q, K, V 向量分别乘以这些对应头的权重矩阵,得到每个头专属的 Q_i, K_i, V_i
      • Q_i = Q * W_q^{(i)}
      • K_i = K * W_k^{(i)}
      • V_i = V * W_v^{(i)}
    • 维度变化:
      • 通常,原始 Q, K, V 向量的维度是 d_model (例如 512)。
      • 为了保持计算量和参数量与单头注意力大致相当(如果单头注意力的 Q, K, V 维度也是 d_model),每个头的 Q_i, K_i, V_i 的维度通常会被设置为 d_model / h。例如,如果 d_model=512h=8,那么每个头的 Q_i, K_i, V_i 的维度就是 512 / 8 = 64
      • 这意味着每个头在更低维度的子空间中进行注意力计算。
  2. 并行进行缩放点积注意力计算 (Parallel Attention Heads):

    • 现在,对于每一个头 i,我们都独立地执行标准的缩放点积注意力机制head_i = Attention(Q_i, K_i, V_i) = softmax( (Q_i * K_i^T) / sqrt(d_k_i) ) * V_i
      • 其中 d_k_i 是头 i 的 Key 向量的维度(即 d_model / h)。
    • 这样,我们就得到了 h 个独立的输出向量 head_1, head_2, ..., head_h。每个 head_i 的维度是 d_v_i (通常等于 d_k_i,即 d_model / h)。
    • 直观理解: 每个头都在它自己的“视角”或“子空间”中学习序列元素之间的相关性,并提取相应的信息。有的头可能关注句法关系,有的头可能关注临近词的关系,有的头可能关注更远距离的语义关系等。
  3. 拼接输出 (Concatenate):

    • 将所有 h 个头的输出向量 head_1, head_2, ..., head_h 在特征维度上进行拼接 (concatenate)Concat_Heads = Concat(head_1, head_2, ..., head_h)
    • 拼接后的向量维度是 h * (d_model / h) = d_model。这样,我们又回到了原始模型的维度。
  4. 最终线性投影 (Final Linear Projection):

    • 将拼接后的向量再通过一个额外的、可学习的线性变换权重矩阵 W_o (输出权重矩阵) 进行投影。 MultiHeadOutput = Concat_Heads * W_o
    • 这个 W_o 矩阵的维度通常是 (d_model, d_model)
    • 这个最终的线性投影允许模型将来自不同头的信息进行整合和混合,产生最终的多头注意力输出。
    • MultiHeadOutput 的维度也是 d_model

多头注意力的优势:

  1. 从不同表示子空间学习信息:

    • 允许模型在不同的位置和不同的表示子空间上共同关注信息。如果只有一个注意力头,其平均化效应可能会抑制来自特定位置或特定方面的信息。
    • 不同的头可以学习到不同类型的依赖关系(例如,短期依赖 vs 长期依赖,句法 vs 语义)。
  2. 增强模型的表达能力:

    • 每个头可以专注于序列的不同部分或不同特征,综合起来可以提供更丰富、更全面的上下文表示。
  3. 更稳定的学习 (某种程度上):

    • 虽然每个头的维度降低了,但多个头并行计算,并将结果综合起来,可能有助于稳定学习过程。

参数和计算量:

  • 如果设置每个头的维度 d_k_i = d_v_i = d_model / h,那么多头注意力的总计算量与具有 d_model 维度的单头注意力是相似的。
  • 主要的额外参数来自于 hW_q^{(i)}, W_k^{(i)}, W_v^{(i)} 和一个 W_o

一个比喻来理解多头注意力:

想象你正在参加一个圆桌会议,讨论一个复杂的问题(比如理解一个句子)。

  • 单头注意力: 就像只有一位专家在听取所有人的发言(Value),并根据自己的判断(Query 对比所有人的 Key)来综合信息,形成对问题的理解。这位专家的视角可能是单一的。
  • 多头注意力: 就像有多位不同领域的专家(每个头是一个专家)同时参加会议。
    1. 线性投影: 每个专家在听取原始发言(Q, K, V)之前,会先根据自己的专业领域对这些信息进行一次“预处理”或“筛选”,形成自己专属的 Q_i, K_i, V_i(在更低维度的子空间)。
    2. 并行注意力: 每位专家独立地根据自己的 Q_i 和所有人的 K_i 来判断哪些发言最重要,并综合这些重要发言的 V_i,形成自己的初步结论 (head_i)。
    3. 拼接: 把所有专家的初步结论放在一起。
    4. 最终投影: 有一个“总协调人”(W_o)负责将所有专家的意见进行最终的整合和提炼,形成对整个问题的全面理解 (MultiHeadOutput)。

在 Transformer 中的应用:

多头注意力是 Transformer 模型中 Encoder 和 Decoder 层的基础构建块。

  • Encoder 中的自注意力: Q, K, V 都来自前一层的输出(或输入的词嵌入)。
  • Decoder 中的自注意力: Q, K, V 都来自前一层的 Decoder 输出(或目标序列的词嵌入),并且会使用掩码 (masking) 来防止关注未来的 token。
  • Decoder 中的 Encoder-Decoder 注意力 (交叉注意力):
    • Query (Q) 来自前一层的 Decoder 输出。
    • Key (K) 和 Value (V) 来自 Encoder 的最终输出
    • 这允许 Decoder 在生成每个目标词时,关注到输入序列的不同部分。

总而言之,多头注意力通过让模型并行地从不同的表示子空间学习和关注信息,显著增强了 Transformer 模型的表达能力和性能。它是理解和实现现代 LLM 的关键概念之一。