36 分钟
AI 数学精要

矩阵乘法及几何意义(含手算)

亲手算清每一个输出元素,理解矩阵乘为什么是「变换复合」与「特征组合」,以及它为何是 AI 的算力主体

  • 能判断两个矩阵能不能相乘,还能写出输出的形状
  • 能手算 2×2 矩阵乘法,并用反例说明矩阵乘法不可交换
  • 矩阵乘向量,本质就是把特征按权重组合起来,对应神经网络里的全连接层。
  • 会估算矩阵乘的浮点运算量,知道它为何成为 GPU 主战场

一层神经网络在算什么?答案:一次矩阵乘法加偏置

把全连接层的外衣剥掉,它的核心就是 Y = XW + b:输入 X 乘权重 W 再加偏置 b。Transformer 里占算力最大的部分,也是一连串矩阵乘。所以这一节不只教你怎么乘,更要让你看见「矩阵是一台变换机器,矩阵乘是让数据依次通过这些机器」。

先给你建立一个贯穿全节的双视角。看一堆排列成矩阵的数字,你要能在两种解读间自由切换:把它看成一张静态数据表时,行是样本、列是特征;把它看成一台动态机器时,它负责把一个向量从左侧空间搬运到右侧空间。矩阵乘法的精妙之处,在于它用同一套运算同时完成了「批量查表」和「批量变换」——这是它成为神经网络通用积木的原因。

2.1 矩阵的两副面孔:数据表与线性变换

同一堆数字有两种读法。数据视角:矩阵是一张表,每行一个样本、每列一个特征。变换视角:矩阵是一台机器,吃进一个向量、吐出一个新向量,完成旋转、缩放、投影等操作。矩阵乘法同时用这两副面孔——用权重矩阵把输入特征变换成输出特征。

矩阵乘法还有第三副更深刻的面孔——「线性组合的系数表」。C=AB 时,输出 C 的每一列,都是 A 的所有列按 B 对应那一列的系数加权混合出来的;等价地,C 的每一行是 B 的所有行按 A 对应行系数组合。行点列的逐元素算法,和「整列被线性组合」的结构视角说的是同一件事,后者在理解注意力头如何混合信息时尤其好用。

形状 [m,n]:m 行样本、n 列特征。比如 [1000,784] 就是一千张展平的手写数字图。这时候要盯紧行列语义、缺失值和归一化。

2.2 矩阵乘法在乘什么:行点列,逐个输出

能相乘的前提是「内侧对齐」:A 形状 [m,k]、B 形状 [k,n],A 的列数必须等于 B 的行数 k,输出 C 形状 [m,n]。输出元素 Cᵢⱼ = A 的第 i 行 · B 的第 j 列,是一次点积。手算 A=[[1,2],[3,4]]、B=[[5,6],[7,8]]:C₀₀ = [1,2]·[5,7] = 1×5 + 2×7 = 19C₀₁ = [1,2]·[6,8] = 1×6 + 2×8 = 22C₁₀ = [3,4]·[5,7] = 3×5 + 4×7 = 43C₁₁ = [3,4]·[6,8] = 3×6 + 4×8 = 50所以 C = [[19,22],[43,50]]。

示例代码(可运行)
填空题填写空白处的代码
A 形状 [2,3],B 形状 [3,4] # 内侧都是 3,可以相乘 # 输出形状取「外侧」:[] # C[0][0] = A 第0行 · B 第0列 # 若 A=[[1,0,0]],B 第一列=[2,5,9],则 C[0][0]=
选择题

下列哪一对矩阵「不能」相乘(前者在左)?

💡手算与排错都先「定形状再填数」

拿到乘法先在草稿上写 [m,k]@[k,n]=[m,n],把输出格子的行列标好,再逐格做行点列。代码里 shape mismatch 报错时同样先打印三个形状、确认内侧相等,能避免 90% 的维度错误。

2.3 为什么 AB≠BA:变换是有先后顺序的

数字乘法里 3×5=5×3,但矩阵乘一般不能交换顺序。因为它本质是「先后施加两个变换」,顺序变了结果就变:先旋转 90° 再沿 x 轴拉伸,和先拉伸再旋转,最后形状的朝向完全不一样。用之前的 A、B 反序算 B@A:第 0 行:[5,6]·[1,3]=5+18=23;[5,6]·[2,4]=10+24=34第 1 行:[7,8]·[1,3]=7+24=31;[7,8]·[2,4]=14+32=46结果是 [[23,34],[31,46]],和 A@B=[[19,22],[43,50]] 完全不同。矩阵乘满足结合律 (AB)C=A(BC),但不满足交换律。

示例代码(可运行)

先认几个特殊矩阵,它们就是矩阵乘法里的「常数」:单位矩阵 I 对角线为 1、其余为 0,满足 IA=AI=A,相当于数字里的 1;零矩阵全为 0,相乘得零;对角矩阵只在对角线上放缩放系数,乘它等于逐轴缩放。转置 Aᵀ 把行列互换([m,n] 变 [n,m]),且有 (AB)ᵀ=BᵀAᵀ——顺序反转,这一点在推导梯度时反复用到。

找 Bug* 做的是逐元素相乘(要求同形),得到 [[5,12],[21,32]],不是矩阵乘;[2,3]@[2,3] 内侧 3≠2 直接报错。
import numpy as np A = np.array([[1,2],[3,4]]) B = np.array([[5,6],[7,8]]) # 想表达神经网络的矩阵乘,却写成了星号 C = A * B # 还想把 [2,3] 和 [2,3] 直接相乘 D = np.ones((2,3)) @ np.ones((2,3))
⚠️别把「逐元素乘 ⊙」当成「矩阵乘 @」

A*B 要求两个矩阵同形,对应位置元素相乘,结果还是原来的形状;A@B 要求内侧维度对齐,做行点列的矩阵乘法,结果形状是 [m,n]。两者的结果、形状、计算含义完全不一样。代码里把这俩运算符写错了通常不会报错——只要两个矩阵形状刚好一样就行,这是极难发现的静默 Bug。

2.4 矩阵乘向量:一次「加权混合特征」

矩阵 W 乘列向量 x 时,输出的每个分量 = W 的一行与 x 的点积,等价于「按权重把所有输入特征线性混合成一个新特征」。这正是全连接层:输入 3 个特征、权重 W 形状 [3,2],输出 2 个新特征,再加偏置。手算:x=[1,2](列向量),取 W=[[1,2],[3,4],[5,6]] 形状 [3,2]:输出第 0 项 [1,2]·[1,2]=1+4=5;第 1 项 [3,4]·[1,2]=3+8=11;第 2 项 [5,6]·[1,2]=5+12=17,得 [5,11,17]——把 2 维输入映射成 3 维表示。

Python
# PyTorch 全连接层与矩阵乘的对应(伪代码,不在浏览器运行)
import torch
import torch.nn as nn
fc = nn.Linear(in_features=2, out_features=3)  # 内部权重形状 [2,3]
x = torch.tensor([[1.0, 2.0]])               # 一批 1 个样本 [1,2]
y = fc(x)                                     # 等价 x @ W + b,输出 [1,3]
print(y.shape)  # torch.Size([1,3])
工程

一层全连接里的完整数据流

给你一组输入 X,形状 [64,784]——64 张图,每张 784 像素。隐藏层权重 W 形状 [784,128],偏置 b 形状 [128]。先算 Z=X@W:[64,784]@[784,128] = [64,128]。说白了就是 64 个样本被并行映射到 128 维。加 b 的时候,偏置会沿批次轴广播到每个样本上。之后再过激活函数,引入非线性。注意W 做成 [784,128] 而不是 [128,784],就是为了让内侧的 784 对齐。这就是形状规则在真实神经网络里的实际用法。

预测输出
x=[1,2],W=[[1,2],[3,4],[5,6]](形状 [3,2]),逐行点积求 W@x 的第二个分量(下标 1)等于多少?

先给你埋个关键伏笔:矩阵乘无论叠多少层,本质仍是线性变换,而线性变换的复合还是线性变换——这意味着只堆线性层,再深也等价于一层,连「异或」这样简单的非线性分界都画不出来。正因如此,每层矩阵乘之后必须紧跟非线性激活函数,把空间「掰弯」,网络才具备拟合弯曲决策边界的能力。你现在只需记住:全连接层 = 线性矩阵乘(负责混合信息)+ 非线性激活(负责改变形状),两者缺一不可,stage-12 会把这件事讲透。

2.5 算力账本:为什么矩阵乘是 AI 的「电费单」

输出矩阵 [m,n] 共 m×n 个元素,每个元素要做 k 次乘法和 k−1 次加法,约 2mnk 次浮点运算(FLOPs)。拿两个 4096×4096 方阵相乘算:2×4096×4096×4096 ≈ 1.374×10¹¹ ≈ 137.4 GFLOPs。大模型一层注意力就包含若干次这个量级的乘法,训练动辄上万层×数千步,这就是大模型需要成百上千张加速卡的根本原因。

把「参数量」和「计算量」分开看:参数量是权重占了多少内存(静态),计算量是一次前向要做多少次乘加(动态)。同一个权重在每个样本、每一步都被反复使用,所以大模型训练是「计算密集」而非「存储密集」。但推理 batch 很小时,瓶颈往往从计算转向把权重从显存搬到计算单元的「内存带宽」——这就是 stage-16 会定量讲的内存墙,它解释了为什么小批量生成时硬件算力利用率很低。

配对题把运算对到它的输出形状(左 [m,k]、右 [k,n])
🐍为什么 GPU / NPU 为矩阵乘而生

矩阵乘里成千上万个乘加彼此独立、规则整齐,正好喂给 GPU 的大量小核心并行执行;Tensor Core 这类单元把「一小块矩阵乘」做成单条硬件指令。面试常问「怎么省算力」,答案多围绕算子融合、低精度(FP16/INT8)、分块(tiling)以贴合缓存——stage-14/16 会定量展开。

ℹ️转置与乘法顺序:推导梯度时必用

转置就是交换矩阵的行和列,满足恒等式 (AB)ᵀ=BᵀAᵀ,运算顺序会反过来。反向传播里,把前向传播的矩阵乘法转置后按逆序往回传,靠的就是这条性质。单位矩阵 I 是矩阵乘法的单位元,对角阵用来做逐轴缩放。这类「常数矩阵」可以帮你快速判断运算结果的形状。

选择题

关于矩阵乘法,下列说法正确的是?

本节小结

给你串成一条线记:矩阵既是数据表,也是线性变换,还是线性组合系数表。相乘要内侧对齐,[m,k]@[k,n]=[m,n],输出每个元素是行点列的结果。矩阵乘法不能交换顺序——顺序就是变换的先后,但可以结合;转置满足 (AB)ᵀ=BᵀAᵀ。矩阵乘向量,本质是按权重混合特征,对应全连接层的 Y=XW+b。算力大概是 2mnk,随维度三次方增长,是 AI 主要成本,也是并行硬件的核心优化方向;小批量计算时,还要警惕内存带宽墙。

资深工程师加餐

底层原理 · 大厂视角 · 工程经验,点卡片展开

信息熵度量一个分布的不确定程度,越随机熵越大。交叉熵衡量「用模型预测的分布去编码真实分布」所需的平均代价:模型预测越接近真实标签,交叉熵越小。因此多分类任务用交叉熵做损失不是拍脑袋,而是有严格信息论依据的最大似然等价形式。