矩阵乘法化简及优化

保存时间:2026/3/29 20:27:05


WQ 和 WK 合并的影响
内容由豆包 AI 生成
我记得这个问题我们以前讨论过,就是说 Transformer 里面这个 query key value 这种查询的机制。就说在我看来,对于一个个输入的 prompt 进行了一次 query, 然后又进行了一次 key 的,这个两个矩阵变换。在我之前我认为说是一种想象中的这种一种机制。就说为什么会有这么两个 WK 和 WQ 这样的两个矩阵去把这个输入的 Prompt 进行两个变换呢?在我看来是完全是想象中出来的。那么假如说 Transformer 我们不需要两个矩阵,就是 WQ 跟 WK。 把它们合二为一,那会出现什么情况呢?是不是 Transformer 这种拟合就不能够完美的达到现在的这种查询的表现呢?意思就是说,我们是把 WQ Q 跟 WK 这两个变换矩阵,合二为一。整个 Transformer 的结果就不能达到现在的这种表现了,是不是这样?
你的理解非常关键,核心结论是:将WQ与WK合并为一个矩阵会严重破坏Transformer的核心能力,导致其无法实现有效的注意力机制,最终模型表现会大幅下降
原因可拆解为两点,本质是注意力机制的设计逻辑:
  1. Q与K的核心分工不同,合并会丢失“查询-匹配”的灵活性
    WQ的作用是将输入(如每个token的 embedding)转化为“查询(Query)”,代表当前位置token“想找什么”;WK则是将输入转化为“键(Key)”,代表其他位置token“有什么”。二者通过计算相似度(如点积)来分配注意力权重,这是模拟人类“带着问题找答案”的核心逻辑。
    若合并WQ与WK,相当于让每个token“用自己的特征去匹配自己的特征”,失去了“主动查询”和“被动匹配”的区分度。此时注意力权重会更偏向于自身或特征完全一致的token,无法灵活捕捉不同token间的复杂依赖关系(比如“猫”和“抓”“老鼠”的关联)。
  2. 合并后模型表达能力骤降,无法拟合复杂数据
    WQ和WK是两个独立的可学习参数矩阵,模型能通过训练分别优化“查询”和“键”的特征空间,让注意力计算更精准(比如在翻译任务中,让Q更关注语义,K更关注语法)。
    合并后相当于减少了一半的可学习参数,且强制Q和K共享同一特征空间,模型无法再针对“查询”和“匹配”两个任务分别调整,导致表达能力严重不足,无法拟合自然语言、图像等复杂数据中的深层规律,最终效果会远差于原版Transformer。
在Transformer中,Q(Query)、K(Key)、V(Value)的计算以及它们之间的关系涉及到以下数学公式: Q、K、V的生成 假设输入序列的嵌入表示为X \in \mathbb{R}^{n \times d},其中n是序列长度,d是嵌入维度。通常通过线性变换来生成Q、K、V: Q = XW_Q K = XW_K V = XW_V 其中W_Q \in \mathbb{R}^{d \times d_k}、W_K \in \mathbb{R}^{d \times d_k}、W_V \in \mathbb{R}^{d \times d_v}是可学习的权重矩阵,d_k和d_v分别是Q、K、V的维度。 注意力得分计算 计算Q与K之间的注意力得分矩阵A: A = \frac{QK^T}{\sqrt{d_k}} 这里除以\sqrt{d_k}是为了防止点积结果过大导致softmax函数梯度消失。 注意力权重计算 对注意力得分矩阵A进行softmax操作,得到注意力权重矩阵W: W = softmax(A) 其中softmax函数按行对矩阵A进行操作,将每个元素转换为概率值,表示每个位置的重要性权重。 注意力输出计算 将注意力权重矩阵W与V相乘,得到最终的注意力输出O: O = WV 只是我以前问你的问题就是说,你看实际在使用的时候,最后就都是把WK跟WQ进行了相乘,矩阵相乘。那么,这当然是在推理过程中,意思就是说,你甚至于有在另外一篇论文讨论中,有人尝试说把这个QKV的相乘的顺序改成Q,×,K和V的乘积,就意思说是先让K和V相乘,意思就是说这样可以降低这个维度。总而言之,从计算的结果来看,WK跟WQ实际上是看似是两个训练出来矩阵,但是我们在使用过程中最后都是乘起来,他怎么就体现出来要两个矩阵呢?我们虽然成了两次训练出来的一个WK一个参数,WQ一个参数,但他们在使用过程中,相当于说我们使用他们的两个乘积也行,就实际上就是合并成一个矩阵,从效果上是完全一样的
你的疑问核心在于 “推理时 Q 与 K 的矩阵相乘,看似可等价为 WQ 与 WK 的乘积”,但关键结论是:二者在数学和模型能力上完全不等价,QK^T 的本质是 “token 对 token 的动态匹配”,而非 WQ 与 WK 的静态乘积,合并会彻底丢失注意力机制的核心灵活性
要理解这一点,需拆解 “QK^T” 和 “(XWQ)(XWK)^T” 的数学含义,而非简单看矩阵乘法的表面形式:

1. 先明确:QK^T 不是 WQ 与 WK 的直接乘积,而是 “token 级” 的动态相似度计算

Q 和 K 的生成是 “输入 X 分别与 WQ、WK 相乘”,即:
  • Q 的每一行 = X 的某一行(单个 token 的 embedding) × WQ(查询空间映射)
  • K 的每一列 = X 的某一行(单个 token 的 embedding) × WK(键空间映射)
因此,QK^T 的结果是一个 n×n 的矩阵(n 为序列长度),其中每个元素 (i,j) = Q 的第 i 行・K 的第 j 行 ^T,代表 “第 i 个 token 的查询” 与 “第 j 个 token 的键” 的相似度 —— 这是 “每个 token 主动找其他所有 token” 的动态匹配过程。
而若想 “合并 WQ 与 WK 为一个矩阵 W”,本质是强制 Q=K=XW,此时 QK^T 的每个元素 (i,j) = (X_i W)・(X_j W)^T = X_i W W^T X_j^T。这相当于在计算相似度前,先让 W 和 W^T 静态乘成一个矩阵(W W^T),再用 X_i 和 X_j 去乘 —— 此时 “查询” 和 “键” 的空间完全绑定,失去了对不同 token 对(i,j)的动态适配能力。

2. 再看核心差异:两个独立矩阵的价值是 “分离查询与键的空间”

WQ 和 WK 是两个独立可学习的矩阵,其核心作用是将输入 X 映射到两个不同的空间(查询空间 Q-space、键空间 K-space):
  • 训练过程中,模型会根据任务需求(比如翻译中的 “语义匹配”、文本理解中的 “指代关联”),分别优化 WQ 和 WK:让 WQ 更擅长捕捉 “查询方需要什么”,让 WK 更擅长捕捉 “被查询方有什么”。
  • 例如,在 “猫抓老鼠” 这句话中,“抓” 的 Q(查询)会被 WQ 优化为 “寻找动作的主语和宾语”,而 “猫” 和 “老鼠” 的 K(键)会被 WK 优化为 “突出自身是主语 / 宾语的属性”—— 二者的匹配(QK^T)才能精准计算出 “抓” 该关注 “猫” 和 “老鼠”。
若合并为一个矩阵,Q 和 K 的空间完全相同,模型无法再分别优化 “查询” 和 “键” 的功能 —— 相当于让 “抓” 只能用 “自己的属性” 去匹配 “猫 / 老鼠的属性”,无法针对性地调整查询方向,自然无法精准捕捉 token 间的复杂依赖。

3. 最后澄清:“QK^T”≠“WQ 与 WK 的乘积”,二者数学上不可等价替换

你提到 “使用过程中最后都是乘起来”,但需明确:
  • 实际计算的是 (X WQ) (X WK)^T,其展开式是 X WQ WK^T X^T(矩阵乘法结合律)—— 这里的 WQ WK^T 是 “两个矩阵的乘积”,但它是和输入 X 绑定在一起的,不同的 X 会带来不同的结果。
  • 若强行合并 WQ 和 WK,相当于用一个矩阵 W 替代 WQ WK^T,但 W 是与 X 无关的静态矩阵—— 这完全改变了计算逻辑:前者是 “X 动态适配 WQ/WK”,后者是 “X 被静态矩阵 W 限制”,数学上和效果上都无法等价。
综上,WQ 和 WK 的 “两个矩阵” 设计,不是冗余的,而是注意力机制能实现 “动态、精准匹配” 的核心 —— 合并后会丢失查询与键的空间分离性,导致模型无法捕捉 token 间的复杂依赖,最终表现会大幅下降。
相关视频
合并WQ与WK为一个矩阵会有什么后果?