普通乘积 vs 对应元素乘积
普通乘积AB的第i行第j列,等于A第i行与B第j列的点积,公式是Cᵢⱼ=ΣAᵢₖBₖⱼ。这个求和不是多余步骤,它代表多个中间因素共同作用于一个输出。对应元素乘积没有求和,只计算Cᵢⱼ=AᵢⱼBᵢⱼ。
最典型的坑是看到两个同形矩阵就逐格相乘。比如图像像素乘掩码应该用对应元素乘积;神经网络中的输入乘权重通常要用普通乘积。两种算法可能都能运行,但含义完全不同。
矩阵相乘怎么算避坑,不能只靠“行乘列”四个字硬记。真正容易翻车的是混淆乘法类型、忽视矩阵顺序、只看尺寸不看数据含义,以及把工具输出当成正确答案。下面按四组对比拆开原理,讲清每条规则为什么存在,以及错误答案通常是怎样一步步产生的。
普通乘积AB的第i行第j列,等于A第i行与B第j列的点积,公式是Cᵢⱼ=ΣAᵢₖBₖⱼ。这个求和不是多余步骤,它代表多个中间因素共同作用于一个输出。对应元素乘积没有求和,只计算Cᵢⱼ=AᵢⱼBᵢⱼ。
最典型的坑是看到两个同形矩阵就逐格相乘。比如图像像素乘掩码应该用对应元素乘积;神经网络中的输入乘权重通常要用普通乘积。两种算法可能都能运行,但含义完全不同。
A为3×4、B为4×2时,内侧的4表示每次点积有4组乘数,因此必须一致;外侧的3和2决定输出有3行2列。把结果误写成4×4,往往是把参与求和的维度错当成保留维度。
可以把A理解成3个对象、每个对象4项特征,B负责把4项特征压缩成2项指标。输出自然是3个对象各有2项指标。这样理解,比机械背“前行后列”更不容易忘。
矩阵乘法一般不满足交换律。若A、B都是2×2,AB和BA虽然尺寸相同,数值也常常不同;若A是2×3、B是3×4,AB可算而BA根本不能算。顺序不是排版习惯,而是变换的先后关系。
对列向量x而言,ABx表示先做B变换,再做A变换。把顺序换成BAx,相当于更改流水线。旋转后拉伸与拉伸后旋转就是直观例子:同一个点可能落到两个不同位置。
软件只检查数字形状,不检查标签。一个“产品×月份”矩阵乘“月份×地区”矩阵在尺寸上合法,但如果第二个矩阵的行实际记录的是员工而非月份,答案没有业务意义。内侧维度不仅数量要相等,所代表的对象也必须一致。
稳妥做法是计算前给每一维写标签,例如“门店×商品”乘“商品×指标”。工具报错时先查shape;工具不报错时反而要查语义、顺序和单位。能运行只是最低门槛,不是正确证明。
高频错误有四个:把普通乘法写成逐元素乘法、把列当成行、漏掉求和、擅自交换AB顺序。计算前写出维度与标签,能挡住大部分错误。
AB要求A的列数等于B的行数,BA要求B的列数等于A的行数,两组条件彼此独立,所以一个成立不代表另一个也成立。
对ndarray而言,星号表示对应元素相乘,@或np.matmul表示普通矩阵乘法。np.dot在高维数组上的行为不同,二维矩阵场景也更建议使用@,含义更直观。