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) 一起构成一个完整的处理单元。

希望这个解释能让你对 Transformer 中的注意力机制有一个更清晰的理解!它确实是现代 LLM 取得巨大成功的关键技术之一。