NLP:Transformer之self-attention(特别分享3)

本文目录:


前言 :之前讲解了Transformer各部分作用、残差等,本文分享self-attention。

一、核心思想:一句话概括

Self-Attention 的核心思想是:让序列中的每一个词(元素)都能够"关注"到序列中的所有其他词(包括它自己),并根据相关性动态地聚合所有词的信息,从而得到一个新的、融入了全局上下文信息的表示。

简单比喻:

读一句话时,为了理解某个词的含义,你的大脑会自动地回顾句子中的其他词,并赋予它们不同的重要性。Self-Attention 就是让机器模拟这个过程。

  • 理解"它"这个词时,你会更关注句子前面提到的某个名词(比如"苹果")。
  • 理解"好吃"这个词时,你会更关注"苹果"而不是"石头"。

二、计算流程的直观比喻

我们把 Self-Attention 想象成一个信息检索系统

  1. 准备阶段(Input Processing) :每个词都把自己改造成三份身份:查询(Query)键(Key)值(Value)
  2. 检索阶段(Attention Scoring)
    • 一个词(通过它的 Query )去"询问"序列中的所有词(它们的 Key):"我和你们每个人的相关度是多少?"
    • 通过计算 Q·K 得到一组相关度分数(Attention Scores)。
  3. 加权求和阶段(Output)
    • 将这些相关度分数作为权重,对所有词的 Value(实际携带的信息)进行加权求和。
    • 最终输出:一个融合了全局信息的、新的词表示。

最终效果 :每个词的新表示,不再是它孤立的嵌入向量,而是一个深知全局上下文的"社交达人"。


三、分步计算详解(附数字例子)

假设我们有一个简单的序列:"Thinking Machines",两个词。它们的初始嵌入向量(假设维度为 4)为:
x₁ = [1, 0, 1, 0] (代表 "Thinking")
x₂ = [0, 2, 0, 2] (代表 "Machines")

第 1 步:创建 Query, Key, Value 向量

每个输入向量 x_i 会分别乘以三个可训练的权重矩阵 W^Q, W^K, W^V,从而产生对应的 Q, K, V 向量。

假设我们的权重矩阵是:

复制代码
W^Q = [[1, 0, 1, 0],
       [0, 1, 0, 1],
       [1, 0, 0, 1],
       [0, 1, 1, 0]]

W^K = [[0, 1, 1, 0],
       [1, 0, 0, 1],
       [0, 0, 1, 1],
       [1, 1, 0, 0]]

W^V = [[1, 1, 0, 0],
       [0, 1, 1, 0],
       [0, 0, 1, 1],
       [1, 0, 0, 1]]

计算第一个词 "Thinking" 的 Q, K, V:
q₁ = x₁ · W^Q = [1,0,1,0] · W^Q = [2, 0, 2, 0]
k₁ = x₁ · W^K = [1,0,1,0] · W^K = [0, 2, 2, 0]
v₁ = x₁ · W^V = [1,0,1,0] · W^V = [1, 1, 1, 1]

同理,计算 "Machines" 的 Q, K, V:
q₂ = x₂ · W^Q = [0,2,0,2] · W^Q = [0, 4, 0, 4]
k₂ = x₂ · W^K = [0,2,0,2] · W^K = [4, 0, 4, 0]
v₂ = x₂ · W^V = [0,2,0,2] · W^V = [2, 2, 2, 2]

关键W^Q, W^K, W^V 是模型需要学习的参数,它们决定了如何从原始输入中解读出"要查询什么"、"用什么来被查询"、"实际信息是什么"。

第 2 步:计算注意力分数

我们现在计算 "Thinking" (Query)对序列中每个词(Key)的注意力分数。分数通过 Query 和 Key 的点积计算。

score₁₁ = q₁ · k₁ = [2,0,2,0] · [0,2,2,0] = 0*2 + 2*0 + 2*2 + 0*0 = 4 (Thinking 与自身的相关性)
score₁₂ = q₁ · k₂ = [2,0,2,0] · [4,0,4,0] = 2*4 + 0*0 + 2*4 + 0*0 = 16 (Thinking 与 Machines 的相关性)

第 3 步:缩放并应用 Softmax

  1. 缩放(Scale) :点积的结果可能很大,导致 Softmax 梯度变小。因此除以 Key 向量维度(d_k)的平方根进行缩放。这里 d_k=4,平方根是 2。
    scale_score₁₁ = 4 / 2 = 2
    scale_score₁₂ = 16 / 2 = 8

  2. Softmax :将分数转换为概率分布(总和为1),使得大的分数更大,小的分数更小。
    softmax([2, 8]) ≈ [0.012, 0.988]

    解读:对于 "Thinking" 这个词来说,它认为 "Machines" 的信息(0.988)远比它自己的信息(0.012)重要得多!

第 4 步:与 Value 向量加权求和,得到输出

将 Softmax 得到的权重作用在所有词的 Value 向量上,并求和,得到 "Thinking" 位置的新表示 z₁

z₁ = 0.012 * v₁ + 0.988 * v₂ ≈ 0.012*[1,1,1,1] + 0.988*[2,2,2,2] ≈ [1.97, 1.97, 1.97, 1.97]

这个新的 z₁ 向量就是 "Thinking" 经过自注意力机制处理后的输出。它几乎完全由 "Machines" 的信息构成,这非常合理,因为 "Thinking Machines" 是一个整体概念。

对 "Machines" 重复步骤 2-4,可以计算出 z₂


四、矩阵运算:实际是如何计算的

上述过程是为了理解,实际代码中是用矩阵一次算完的,极其高效。

  1. 将所有输入词向量堆叠成矩阵 X
  2. 计算 Q, K, V 矩阵:
    Q = X · W^Q
    K = X · W^K
    V = X · W^V
  3. 计算注意力分数矩阵:Scores = Q · K^T / sqrt(d_k)
  4. 对 Scores 矩阵的每一行应用 Softmax。
  5. 计算输出矩阵 ZZ = Softmax(Scores) · V

整个过程可以封装为一个漂亮的公式:
Attention(Q, K, V) = softmax(QK^T / √dₖ) V


五、为什么 Self-Attention 如此强大?

  1. 全局依赖性:一步直接捕获序列中任意两个位置之间的关系,不受距离限制。解决了 RNN 的长程依赖问题。
  2. 并行化:巨大的矩阵乘法可以完全并行计算,训练速度远快于必须顺序计算的 RNN。
  3. 可解释性 :通过分析注意力权重(softmax(QK^T)),我们可以直观地看到模型在做决策时关注了哪些词,如图:

总结

Self-Attention 是一个精巧的"信息检索与聚合"系统。它通过 Query、Key、Value 的抽象,让模型能够动态地、有选择地融合序列的全局信息,从而为每个位置生成一个上下文感知的强大表示。它是 Transformer 能够统治 NLP 乃至整个深度学习领域的基石。

本文分享到此结束。

相关推荐
猫天意2 小时前
【目标检测】metrice_curve和loss_curve对比图可视化
人工智能·深度学习·目标检测·计算机视觉·cv
山烛2 小时前
OpenCV:图像透视变换
人工智能·opencv·计算机视觉·图像透视变换
艾醒(AiXing-w)2 小时前
探索大语言模型(LLM):Ollama快速安装部署及使用(含Linux环境下离线安装)
linux·人工智能·语言模型
月小水长2 小时前
大模型接入自定义 MCP Server,我开发了个免费使用的基金涨跌归纳和归因分析的 Agent
人工智能·后端
咏方舟【长江支流】3 小时前
AI+华为HarmonyOS开发工具DevEco Studio详细安装指南
人工智能·华为·移动开发·harmonyos·arkts·deveco studio·长江支流
阿里云云原生3 小时前
Qoder 全新「上下文压缩」功能正式上线,省 Credits !
人工智能
我星期八休息3 小时前
深入理解跳表(Skip List):原理、实现与应用
开发语言·数据结构·人工智能·python·算法·list
蒋星熠3 小时前
如何在Anaconda中配置你的CUDA & Pytorch & cuNN环境(2025最新教程)
开发语言·人工智能·pytorch·python·深度学习·机器学习·ai
Hcoco_me3 小时前
什么是机器学习?
人工智能·机器学习