矩阵乘法:一行怎样读取一列
问题与目标
线性层和 attention 都依赖矩阵乘法。真正要理解的不是“前内后外”,而是:输出中的一个数从哪里来? 学完后你应能手算结果、说明共享维为何消失,并定位 shape 错误。
贯穿例子
A 有 2 行 3 列,B 有 3 行 2 列。输出 C 有 2 行 2 列。
动画中的蓝色整行、整列是一个输出的全部输入;深色方格只是当前正在相乘的一对。若关闭动画,按下面的静态式子也能得到同一结论:
心智模型:输出位置先选行列
要计算
- 用
i选择A的第i行; - 用
j选择B的第j列; - 沿共享的中间维
k对齐元素; - 逐项相乘后求和。
所以 [M,K] @ [K,N] → [M,N]。K 不是凭规则“消失”,而是被求和汇总了;M,N 留下来索引输出位置。
推广到模型张量
将一句话分成若干文本片段(token),为每个片段安排一个特征向量;多句话组成一批样本。记样本数为 B、每句片段数为 T,特征数为 Cin,线性层对每个位置应用同一组权重:
text
X [B,T,Cin] @ W [Cin,Cout] → Y [B,T,Cout]库把前面的 B,T 当作批次位置。对每个样本、每个 token,都独立执行 [Cin] @ [Cin,Cout]。因此 Cin 被汇总,Cout 成为新特征轴。
最小验证
常见误解与边界
- 逐元素乘法
A * B要求位置可对齐;矩阵乘法A @ B沿共享维做乘加。 A @ B通常不等于B @ A,甚至后者可能 shape 不合法。- shape 合法只证明运算能执行,不证明轴语义正确。
- 转置会换轴;矩阵乘法会产生新的加权组合,两者不是一件事。
小结与自测
矩阵乘法的原子动作是“选一行、选一列、对应相乘、全部求和”。请不看上文回答:[5,7] @ [7,3] 的输出是什么 shape?C[4,2] 读取哪一行和哪一列?共享的 7 去了哪里?