【AI】矩阵乘为什么是加权求和?

矩阵乘与加权求和的关系

假设我们已经计算好了2x2的注意力权重矩阵 A 和 2x3 的值矩阵 V 。(我们用小一点的矩阵,这样方便手算)。

  • 注意力权重矩阵 A (Attention Weights) ,维度是 2x2 。

    • A 的第1行 [0.8, 0.2] 代表:计算第1个输出词时,给第1个输入词0.8的权重,给第2个输入词0.2的权重。
    • A 的第2行 [0.1, 0.9] 代表:计算第2个输出词时,给第1个输入词0.1的权重,给第2个输入词0.9的权重。
A = [[0.8, 0.2],
     [0.1, 0.9]]

值矩阵 V (Value) ,维度是 2x3 。

  • V 的第1行 [1, 10, 100] 是第1个输入词的Value向量。
  • V 的第2行 [2, 20, 200] 是第2个输入词的Value向量。
V = [[1, 10, 100],
     [2, 20, 200]]

现在我们要计算输出矩阵 Z = A * V 。

角度一:标准的矩阵乘法计算

我们来计算输出 Z 的第1行,第1个元素 Z[0, 0] : Z[0, 0] = A 的第1行 * V 的第1列 = (0.8 * 1) + (0.2 * 2) = 0.8 + 0.4 = 1.2

再计算 Z 的第1行,第2个元素 Z[0, 1] : Z[0, 1] = A 的第1行 * V 的第2列 = (0.8 * 10) + (0.2 * 20) = 8 + 4 = 12

再计算 Z 的第1行,第3个元素 Z[0, 2] : Z[0, 2] = A 的第1行 * V 的第3列 = (0.8 * 100) + (0.2 * 200) = 80 + 40 = 120

所以,输出矩阵 Z 的第1行是 [1.2, 12, 120] 。
这个计算过程完全符合你说的“A的每一行乘以V的每一列”(这里应该是A,不是Z)。

角度二:加权求和的概念意义

现在我们换个方式来思考如何得到 Z 的第1行 [1.2, 12, 120] 。

根据我们的描述, Z 的第1行应该是 V 矩阵中所有行向量的加权求和,权重来自于 A 矩阵的第1行 [0.8, 0.2] 。

我们来算一下: Z 的第1行 = (0.8 * V 的第1行) + (0.2 * V 的第2行)

Z 的第1行 = 0.8 * [1, 10, 100] + 0.2 * [2, 20, 200]

Z 的第1行 = [0.81, 0.810, 0.8100] + [0.22, 0.220, 0.2200]

Z 的第1行 = [0.8, 8, 80] + [0.4, 4, 40]

Z 的第1行 = [0.8 + 0.4, 8 + 4, 80 + 40]

Z 的第1行 = [1.2, 12, 120]

结论

两种不同角度的计算,得到了完全相同的结果 。

  • 角度一的理解是“如何算” :它描述了矩阵乘法在计算机或纸上一步步执行的机械过程(行乘以列)。
  • 角度二的描述是“算的是什么” :它描述了这个运算的最终效果和概念——用 A 矩阵的一行作为权重,去混合(加权求和) V 矩阵的所有行向量,从而得到输出 Z 的一行。

在解释算法时,我们更倾向于使用“加权求和”这种说法,因为它更直观地揭示了 注意力机制的本质 : 根据注意力权重,将所有输入词的“内容(Value)”以不同的比例融合起来,形成当前词的新的、包含上下文信息的表示 。

所以,“加权求和”是对这个步骤背后意义的诠释。两个角度并不矛盾,而是同一枚硬币的两面。

注意力机制(Attention Mechanism)是一种在深度学习和人工智能中广泛使用的技术,旨在使模型在处理信息时能够重点关注重要的部分,从而提升任务的效率和精度。它最初应用于自然语言处理(NLP),并迅速扩展到计算机视觉(CV)、语音处理等领域[^2]。 在大模型领域,注意力机制通过计算输入序列中元素之间的相关性,为不同元素分配不同的权重,让模型聚焦于重要信息。经典的注意力机制涉及查询(Query,Q)、键(Key,K)和值(Value,V)三个关键矩阵,通常由输入数据经线性变换得到。通过计算查询和键之间的相似度得分(常用点积运算),再经 softmax 函数归一化得到注意力权重,最后根据权重对值矩阵进行加权求和得到输出[^2]。 以下是一个简单的 PyTorch 代码示例,展示了如何实现一个简单的注意力机制: ```python import torch import torch.nn.functional as F def simple_attention(query, key, value): # 计算相似度得分 scores = torch.matmul(query, key.transpose(-2, -1)) # 归一化得到注意力权重 attention_weights = F.softmax(scores, dim=-1) # 根据注意力权重对值进行加权求和 output = torch.matmul(attention_weights, value) return output, attention_weights # 示例输入 query = torch.randn(3, 5) # 假设查询有 3 个,每个维度为 5 key = torch.randn(3, 5) # 键的数量和维度与查询相同 value = torch.randn(3, 7) # 值有 3 个,每个维度为 7 output, weights = simple_attention(query, key, value) print("Attention output shape:", output.shape) print("Attention weights shape:", weights.shape) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值