当前位置: 首页 > news >正文

注意力机制中为什么q与k^T相乘是注意力分数

要理解 “q×kT\mathbf{q} \times \mathbf{k}^Tq×kT 是注意力分数”,核心是抓住注意力机制的本质目标 ——量化 “查询(q)” 与 “键(k)” 之间的关联程度,而向量点积(矩阵相乘的元素本质)恰好是实现这一目标的天然工具。下面分三步拆解:

一、注意力分数的核心使命:找 “查询与键” 的关联度

注意力机制的核心逻辑是 “按需聚焦”:比如阅读时,我们会根据当前 “想找的信息(查询 q)”,去关注文本中 “相关的内容(键 k)”。为实现这一逻辑,第一步必须先回答:“每个查询与每个键的相关性有多高?”

这个 “相关性数值”,就是注意力分数。

例如:

  • 若查询 q 是 “猫的颜色”,键 k1 是 “黑色猫咪”、k2 是 “红色汽车”,则 q 与 k1 的分数应高,与 k2 的分数应低;
  • 若有多个查询(如 “猫的颜色”“狗的大小”)和多个键,则需要一个 “查询 - 键关联表”,记录所有查询对所有键的相关性 —— 这正是 q×kT\mathbf{q} \times \mathbf{k}^Tq×kT 矩阵的作用。

二、向量点积:天然的 “关联度度量工具”

q×kT\mathbf{q} \times \mathbf{k}^Tq×kT 矩阵中,每个元素的本质是 “单个查询向量 **** **** 与单个键向量 **** **** 的点积”(即 qi⋅kj\mathbf{q}_i \cdot \mathbf{k}_jqikj),而点积的几何意义恰好能量化 “关联度”。

回顾向量点积的数学定义与几何意义:

对两个维度为 dkd_kdk 的向量 qi\mathbf{q}_iqikj\mathbf{k}_jkj,点积公式为:

qi⋅kj=∑t=1dkqi,t×kj,t\mathbf{q}_i \cdot \mathbf{k}_j = \sum_{t=1}^{d_k} q_{i,t} \times k_{j,t}qikj=t=1dkqi,t×kj,t

其几何等价形式为:

qi⋅kj=∥qi∥×∥kj∥×cos⁡θ\mathbf{q}_i \cdot \mathbf{k}_j = \|\mathbf{q}_i\| \times \|\mathbf{k}_j\| \times \cos\thetaqikj=qi×kj×cosθ

其中:

  • ∥qi∥\|\mathbf{q}_i\|qi∥kj∥\|\mathbf{k}_j\|kj 是向量的模长(可理解为向量的 “信息量大小”);
  • θ\thetaθqi\mathbf{q}_iqikj\mathbf{k}_jkj 的夹角,cos⁡θ\cos\thetacosθ 是 “方向相似度”——θ\thetaθ 越小(方向越接近),cos⁡θ\cos\thetacosθ 越接近 1,点积越大;θ\thetaθ 越大(方向越背离),cos⁡θ\cos\thetacosθ 越接近 - 1,点积越小。

这恰好完美匹配 “关联度” 的需求:

  • 当查询 q 与键 k “方向相似”(比如 q 是 “猫”,k 是 “猫咪”),cos⁡θ\cos\thetacosθ 大,点积大→注意力分数高,说明两者相关;
  • 当查询 q 与键 k “方向无关”(比如 q 是 “猫”,k 是 “汽车”),cos⁡θ\cos\thetacosθ 接近 0,点积小→注意力分数低,说明两者无关。

此外,点积还有一个关键优势:计算高效。相比欧氏距离(衡量 “差异”,需开平方)等其他度量方式,点积仅需加法和乘法,适合深度学习中大规模矩阵运算(这也是 Transformer 选择点积作为分数度量的重要工程原因)。

三、q×kT\mathbf{q} \times \mathbf{k}^Tq×kT:批量计算所有 “查询 - 键” 的关联度

前面讲的是 “单个查询 vs 单个键” 的情况,而实际模型中,我们通常有多个查询(m 个)和多个键(n 个),需要一次性计算 “所有查询对所有键的分数”—— 这就需要通过矩阵相乘 q×kT\mathbf{q} \times \mathbf{k}^Tq×kT 实现,其维度变化和元素含义如下:

1. 明确向量 / 矩阵维度(结合文档假设)

  • 单个查询向量 qi\mathbf{q}_iqi:维度为 dkd_kdk(如文档中 dk=64d_k=64dk=64),即形状为 (1,dk)(1, d_k)(1,dk)
  • 多个查询组成的矩阵 Q\mathbf{Q}Q:包含 mmm 个查询,形状为 (m,dk)(m, d_k)(m,dk)(每行是一个查询);
  • 单个键向量 kj\mathbf{k}_jkj:维度同样为 dkd_kdk,形状为 (1,dk)(1, d_k)(1,dk)
  • 多个键组成的矩阵 K\mathbf{K}K:包含 nnn 个键,形状为 (n,dk)(n, d_k)(n,dk)(每行是一个键);
  • 键矩阵的转置 KT\mathbf{K}^TKT:将 K\mathbf{K}K 的行与列交换,形状变为 (dk,n)(d_k, n)(dk,n)(每列是一个键)。

2. 矩阵相乘的物理含义:生成 “注意力分数矩阵”

根据矩阵相乘的规则(前矩阵列数 = 后矩阵行数才能相乘),Q×KT\mathbf{Q} \times \mathbf{K}^TQ×KT 的计算过程如下:

  • 输入维度:Q(m,dk)×KT(dk,n)\mathbf{Q}(m, d_k) \times \mathbf{K}^T(d_k, n)Q(m,dk)×KT(dk,n)
  • 输出维度:(m,n)(m, n)(m,n)(前矩阵行数 × 后矩阵列数);
  • 输出矩阵的每个元素 (i,j)(i, j)(i,j):第 iii 个查询向量 qi\mathbf{q}_iqi 与第 jjj 个键向量 kj\mathbf{k}_jkj 的点积(即 qi⋅kj\mathbf{q}_i \cdot \mathbf{k}_jqikj)。

这个 (m,n)(m, n)(m,n) 的输出矩阵,就是注意力分数矩阵—— 它本质是一张 “查询 - 键关联表”:

  • 行:对应每个查询(共 mmm 行);
  • 列:对应每个键(共 nnn 列);
  • 元素 (i,j)(i,j)(i,j):第 iii 个查询对第 jjj 个键的 “关联度分数”。

3. 与文档逻辑的呼应:分数矩阵的后续处理

需要注意的是,Q×KT\mathbf{Q} \times \mathbf{K}^TQ×KT 得到的是 “原始注意力分数”,正如文档中强调的,由于点积的方差会随 dkd_kdk 增长(Var(qi⋅kj)=dk\text{Var}(\mathbf{q}_i \cdot \mathbf{k}_j) = d_kVar(qikj)=dk),原始分数会出现数值极端化问题。因此,后续必须除以 dk\sqrt{d_k}dk 进行方差归一化(将方差固定为 1),再通过 softmax 转化为 “注意力权重”(表示每个键对查询的贡献占比)—— 这也印证了文档中 “缩放点积注意力” 的完整流程:

Attention(Q,K,V)=softmax(Q×KTdk)×V\text{Attention}(\mathbf{Q}, \mathbf{K}, \mathbf{V}) = \text{softmax}\left( \frac{\mathbf{Q} \times \mathbf{K}^T}{\sqrt{d_k}} \right) \times \mathbf{V}Attention(Q,K,V)=softmax(dkQ×KT)×V

其中 V\mathbf{V}V(值向量)是最终要 “聚焦” 的内容,而 Q×KTdk\frac{\mathbf{Q} \times \mathbf{K}^T}{\sqrt{d_k}}dkQ×KT 正是归一化后的注意力分数矩阵。

四、举个具体例子:让抽象矩阵变直观

假设:

  • 查询数量 m=2m=2m=2(比如查询 1:“猫的颜色”,查询 2:“狗的大小”);
  • 键数量 n=3n=3n=3(比如键 1:“黑色猫咪”,键 2:“棕色小狗”,键 3:“红色汽车”);
  • 维度 dk=2d_k=2dk=2(简化计算,实际为 64)。

1. 设定具体向量(符合文档初始化:均值 0、方差 1)

  • 查询矩阵 Q\mathbf{Q}Q(2×2):

    Q=[0.80.20.10.9]\mathbf{Q} = \begin{bmatrix} 0.8 & 0.2 \\ 0.1 & 0.9 \end{bmatrix}Q=[0.80.10.20.9]

    (第 1 行:查询 1 “猫的颜色”,第 2 行:查询 2 “狗的大小”)

  • 键矩阵 K\mathbf{K}K(3×2):

    K=[0.70.30.20.80.4−0.5]\mathbf{K} = \begin{bmatrix} 0.7 & 0.3 \\ 0.2 & 0.8 \\ 0.4 & -0.5 \end{bmatrix}K=0.70.20.40.30.80.5

    (第 1 行:键 1 “黑色猫咪”,第 2 行:键 2 “棕色小狗”,第 3 行:键 3 “红色汽车”)

  • 键转置 KT\mathbf{K}^TKT(2×3):

    KT=[0.70.20.40.30.8−0.5]\mathbf{K}^T = \begin{bmatrix} 0.7 & 0.2 & 0.4 \\ 0.3 & 0.8 & -0.5 \end{bmatrix}KT=[0.70.30.20.80.40.5]

2. 计算 Q×KT\mathbf{Q} \times \mathbf{K}^TQ×KT(原始注意力分数矩阵)

根据矩阵相乘规则:

  • 元素 (1,1)(1,1)(1,1)(查询 1× 键 1):0.8×0.7+0.2×0.3=0.56+0.06=0.620.8×0.7 + 0.2×0.3 = 0.56 + 0.06 = 0.620.8×0.7+0.2×0.3=0.56+0.06=0.62(分数高,关联强);
  • 元素 (1,2)(1,2)(1,2)(查询 1× 键 2):0.8×0.2+0.2×0.8=0.16+0.16=0.320.8×0.2 + 0.2×0.8 = 0.16 + 0.16 = 0.320.8×0.2+0.2×0.8=0.16+0.16=0.32(分数中,关联弱);
  • 元素 (1,3)(1,3)(1,3)(查询 1× 键 3):0.8×0.4+0.2×(−0.5)=0.32−0.1=0.220.8×0.4 + 0.2×(-0.5) = 0.32 - 0.1 = 0.220.8×0.4+0.2×(0.5)=0.320.1=0.22(分数低,关联弱);
  • 元素 (2,1)(2,1)(2,1)(查询 2× 键 1):0.1×0.7+0.9×0.3=0.07+0.27=0.340.1×0.7 + 0.9×0.3 = 0.07 + 0.27 = 0.340.1×0.7+0.9×0.3=0.07+0.27=0.34(分数中,关联弱);
  • 元素 (2,2)(2,2)(2,2)(查询 2× 键 2):0.1×0.2+0.9×0.8=0.02+0.72=0.740.1×0.2 + 0.9×0.8 = 0.02 + 0.72 = 0.740.1×0.2+0.9×0.8=0.02+0.72=0.74(分数高,关联强);
  • 元素 (2,3)(2,3)(2,3)(查询 2× 键 3):0.1×0.4+0.9×(−0.5)=0.04−0.45=−0.410.1×0.4 + 0.9×(-0.5) = 0.04 - 0.45 = -0.410.1×0.4+0.9×(0.5)=0.040.45=0.41(分数低,关联弱)。

最终原始分数矩阵为:

Q×KT=[0.620.320.220.340.74−0.41]\mathbf{Q} \times \mathbf{K}^T = \begin{bmatrix} 0.62 & 0.32 & 0.22 \\ 0.34 & 0.74 & -0.41 \end{bmatrix}Q×KT=[0.620.340.320.740.220.41]

这个矩阵完全符合预期:

  • 查询 1(猫的颜色)对键 1(黑色猫咪)分数最高,对键 3(红色汽车)分数最低;

  • 查询 2(狗的大小)对键 2(棕色小狗)分数最高,对键 3(红色汽车)分数最低。

    后续只需除以 dk=2≈1.414\sqrt{d_k} = \sqrt{2} \approx 1.414dk=21.414 归一化,再经 softmax 就能得到合理的注意力权重。

总结:q×kT\mathbf{q} \times \mathbf{k}^Tq×kT 是注意力分数的本质原因

  1. 目标匹配:注意力需要 “关联度”,点积的几何意义(方向相似度 + 信息量)恰好量化了关联度;
  2. 运算高效:点积计算简单,适合大规模矩阵运算;
  3. 批量输出q×kT\mathbf{q} \times \mathbf{k}^Tq×kT 能一次性生成 “所有查询对所有键” 的关联度,形成结构化的分数矩阵;
  4. 衔接后续流程:原始分数矩阵需经文档中提到的 “除以 dk\sqrt{d_k}dk 归一化” 和 “softmax 权重转化”,最终实现 “按需聚焦”—— 这也说明 q×kT\mathbf{q} \times \mathbf{k}^Tq×kT 是注意力机制的核心 “分数来源”。
http://www.dtcms.com/a/347382.html

相关文章:

  • 每日定投40刀BTC(22)20250802 - 20250823
  • 编程刷题-染色题DFS
  • 03_数据结构
  • 在 CentOS 7 上搭建 OpenTenBase 集群:从源码到生产环境的全流程指南
  • MSPM0G3507工程模板创建
  • 微信小程序自定义组件开发(上):从创建到数据通信详解(五)
  • 纠删码技术,更省钱的分布式系统的可靠性技术
  • 使用springboot开发-AI智能体平台管理系统,统一管理各个平台的智能体并让智能体和AI语音设备通信,做一个属于自己的小艾同学~
  • Dubbo vs Feign
  • 个人思考与发展
  • 探秘北斗卫星导航系统(BDS):架构、应用与未来蓝图,展现中国力量
  • 详细说一说JIT
  • Redis面试精讲 Day 28:Redis云原生部署与Kubernetes集成
  • Js逆向 拼夕夕anti_content
  • 深入解析Spring Boot自动配置原理:简化开发的魔法引擎
  • Java基础第2天总结
  • 青少年机器人技术(四级)等级考试试卷-实操题(2021年12月)
  • 互联网大厂Java面试实战:核心技术栈与场景化提问解析(含Spring Boot、微服务、测试框架等)
  • Java 遗传算法在中药药对挖掘中的深度应用与优化策略
  • 雨雾天气漏检率骤降80%!陌讯多模态车牌识别方案实战解析
  • Redis--day10--黑马点评--秒杀优化消息队列
  • 【JavaEE】多线程 -- JUC常见类和线程安全的集合类
  • 什么猫粮好?2025最新猫粮排名合集
  • 深度解析Bitmap、RoaringBitmap 的原理和区别
  • MySql知识梳理之DDL语句
  • TypeScript 类型系统入门:从概念到实战
  • 从零开始学习JavaWeb-16
  • 阿德莱德多模态大模型导航能力挑战赛!NavBench:多模态大语言模型在具身导航中的能力探索
  • Mysql InnoDB 底层架构设计、功能、原理、源码系列合集【六、架构全景图与最佳实践】
  • 新能源汽车热管理仿真:蒙特卡洛助力神经网络训练