来源
- 课程:宋浩老师《线性代数》教学视频 2.0 版
- 分集:第 12 个分集,2.3 矩阵的乘法
- 视频:BV1h7pteyEww,P12
- 原始材料:截图目录
- 课堂例题:例题.md
1. 能不能乘、结果多大
设
则 的列数等于 的行数,乘积 有意义,并且
口诀:中间相等可以相乘,结果的形状取两头。
写成 shape 就是
- 中间的两个 相等:说明可以相乘;
- 外面的 :决定结果是 。
例如
这个口诀只判断“能否相乘”和“结果 shape”,还没有计算结果中的元素。
2. 怎样计算:左行乘右列
乘积 的第 行第 列元素为
也就是:
的第 个元素 = 的第 行与 的第 列做点积。
计算步骤:
- 从左矩阵取一行;
- 从右矩阵取一列;
- 对应位置相乘;
- 把所有乘积相加。
矩阵乘法不是对应元素相乘。对应元素相乘叫 Hadamard 积,在 NumPy/PyTorch 中通常由 A * B 表示。
3. 为什么顺序重要
即使 与 都有意义,也通常有
原因是:
- 用 的行乘 的列;
- 用 的行乘 的列;
- 两者甚至可能具有不同 shape。
另外, 有意义并不能保证 有意义。每次调换顺序后,都要重新检查中间维度。
从“线性变换的复合”看,,表示先执行 ,再执行 。改变顺序通常就改变了运算过程和结果。
4. 矩阵乘法不满足的规律
4.1 一般不满足交换律
只有满足 的特定方阵,才称 可交换。
4.2 一般不满足消去律
即使
也不能直接推出 。同理, 且 也不能直接推出 。
以后学习可逆矩阵后会看到:只有当公共因子可逆时,才能在正确的一侧乘逆矩阵完成消去。
4.3 非零矩阵的乘积可能为零矩阵
并不能保证 。矩阵存在“零因子”,这与普通实数乘法不同。
5. 矩阵乘法满足的规律
在各乘积都有意义的前提下:
-
结合律
-
分配律
注意公共因子在左边还是右边,不能随意换位置。
-
数乘结合
-
单位矩阵
单位矩阵在矩阵乘法中的作用类似数字 。
-
数量矩阵
若 ,则
(矩阵阶数匹配时)。
-
同阶对角矩阵
所以任意两个同阶对角矩阵可交换。
6. 可交换矩阵
若同阶方阵 满足
则称 与 可交换。
常见结论:
- 可交换矩阵一定是同阶方阵;
- 单位矩阵与任意同阶方阵可交换;
- 数量矩阵 与任意同阶方阵可交换;
- 任意两个同阶对角矩阵可交换;
- 若计算得到 ,则一定不可交换。
“都是方阵”或“同阶”只是必要的 shape 条件,不足以保证可交换。
7. NumPy / PyTorch 对照
NumPy
import numpy as np
A = np.array([[-1, 1, 2],
[ 3, 0, 1]]) # (2, 3)
B = np.array([[ 1, 2],
[ 0, 3],
[-1, 1]]) # (3, 2)
AB = A @ B # (2, 2)
BA = B @ A # (3, 3)
print(A.shape, B.shape, AB.shape, BA.shape)
print(np.matmul(A, B)) # 等价写法
二维矩阵相乘优先使用 @ 或 np.matmul。np.dot 在一维、二维和高维输入时语义不同,阅读复杂代码时不如 @ 直观。
PyTorch
import torch
A = torch.tensor([[-1., 1., 2.],
[ 3., 0., 1.]])
B = torch.tensor([[ 1., 2.],
[ 0., 3.],
[-1., 1.]])
AB = A @ B
AB2 = torch.matmul(A, B)
AB3 = torch.mm(A, B) # 只用于二维矩阵
torch.matmul 和 @ 还支持批量矩阵乘法,并会处理前面的 batch 维;torch.mm 只接受二维输入。
编程经验
-
先打印 shape,再写乘法。
print(A.shape, B.shape) assert A.shape[-1] == B.shape[-2] C = A @ B -
不要把
*当矩阵乘法。A * B通常是逐元素相乘,并且可能触发广播。 -
批量矩阵乘法仍遵守口诀。 对形如
(..., m, n) @ (..., n, s)的张量,最后两个维度得到(..., m, s),前面的维度按广播规则处理。 -
浮点数下结合顺序会影响性能和微小误差。 数学上 ,但有限精度计算的舍入顺序不同,结果末位可能有细小差异;库也会选择更高效的内核与计算顺序。
-
nn.Linear的权重存储顺序容易迷惑。 若输入X的 shape 是(batch, in_features),PyTorch 的weight存为(out_features, in_features),实际计算相当于:Y = X @ weight.T + bias
8. 与大模型的联系
8.1 线性投影
设一批 token 表示为
权重为
则
这正是“中间相等,形状取两头”。词嵌入投影、Q/K/V 投影、MLP 上投影与下投影都在反复做这件事。
8.2 注意力分数
单个注意力头中,若
则
得到每个 token 对所有 token 的注意力分数。再与
相乘:
真实实现常使用 (batch, heads, T, d_k),但最后两维仍然遵守同一个口诀。
8.3 顺序就是计算流程
神经网络中的矩阵乘法表示线性变换的复合。 表示先用 变换 ,再用 ;改成 就改变了模型的计算含义。因此矩阵乘法不满足交换律,不只是考试规则,也是网络结构必须固定顺序的原因。
本节易错点
- 误以为两个矩阵同型才能相乘;真正要检查的是左矩阵列数与右矩阵行数。
- 中间维度相等后,把结果 shape 写成中间维度;应当取两头。
- 计算元素时做“行乘行”或“列乘列”;正确做法是左行乘右列。
- 用
A * B代替A @ B。 - 默认 ,或认为 有意义就必有 。
- 从 且 直接消去 。
- 从 推出 或 。
- 把“同阶方阵”误当成“可交换”的充分条件。
本节自检
- 是否有意义?结果 shape 是什么?
- 的第 个元素怎样计算?
- 为什么 有意义时, 仍可能没有意义?
- 矩阵乘法不满足哪两条普通数乘法中熟悉的规律?
- 的结果为什么是 ?



















