📺B站视频讲解(Bilibili):博主个人介绍
📘《Yocto项目实战教程》京东购买链接:Yocto项目实战教程
📘加博主微信,进技术交流群:jerrydev
线性代数学习笔记:从张量到矩阵乘法与范数(含例子与 PyTorch 代码)
目标:把我们聊过的线性代数核心概念,用最少的“抽象话”讲清楚:是什么、怎么算、形状怎么变、代码怎么写、为什么有用。
0. 常见符号与公式读法速查
这一节专门把常见符号“怎么读”讲清楚。遇到公式时,可以先按读法念一遍,再按含义理解一遍。
0.1 符号读法与含义(最常用)
| 符号/写法 | 常见读法(中文) | 含义/你应想到什么 | ||
|---|---|---|---|---|
Σ | 西格玛(sigma),也叫“求和符号” | 把一串项加起来 | ||
Σ_{i=1}^n | “从 i 等于 1 到 n 求和” | 索引 i 从 1 走到 n | ||
∈ | “属于” | 某个对象属于某个集合 | ||
ℝ | “实数集合”(或“实数域”) | 元素是实数 | ||
ℝ^{m×n} | “m 乘 n 的实矩阵” | m 行 n 列,元素为实数 | ||
× | “乘” | 维度里表示行列;运算里表示乘法 | ||
x^T/x^ op | “x 转置” | 行列互换;行向量↔列向量 | ||
a_i/b_j | “a 下标 i”“b 下标 j” | 第 i 个/第 j 个对象 | ||
c_{ij} | “c 下标 i j” | 矩阵 C 的第 i 行第 j 列元素 | ||
A_{i,:} | “A 下标 i 逗号冒号” | A 的第 i 行(整行) | ||
B_{:,j} | “B 下标冒号逗号 j” | B 的第 j 列(整列) | ||
‖x‖ | “x 的范数” | x 的大小(某种度量) | ||
‖x‖_2 | “x 的二范数” | 平方和开根号(像长度) | ||
‖x‖_1 | “x 的一范数” | 绝对值之和 | ||
‖X‖_F | “X 的弗罗贝尼乌斯范数” | 矩阵所有元素平方和开根号 | ||
| ` | x | ` | “x 的绝对值” | 距离 0 的大小 |
√ | “根号” | 开平方 | ||
≤ | “小于等于” | 不大于 | ||
α | “阿尔法” | 常用作缩放系数 |
0.2 形状(shape)的读法
(m, n):读作“m 行 n 列”。A ∈ ℝ^{m×n}:读作“A 属于 m 乘 n 的实矩阵”。x ∈ ℝ^{n}:读作“x 属于 n 维实向量”。
0.3 公式怎么念(把关键结构读出来)
1)点积:
公式:
x^T y = Σ_{i=1}^d x_i y_i读法:
- “x 转置乘 y,等于从 i 等于 1 到 d,对 x 下标 i 乘 y 下标 i 求和。”
含义:对应位置相乘再相加。
2)矩阵乘法单个元素:
公式:
c_{ij} = A_{i,:} · B_{:,j}读法:
- “c 下标 i j,等于 A 的第 i 行点乘 B 的第 j 列。”
含义:结果矩阵的每个格子,都是“行·列”的点积。
3)二范数:
公式:
‖x‖_2 = √(Σ_{i=1}^n x_i^2)读法:
- “x 的二范数,等于根号下从 i 等于 1 到 n,对 x 下标 i 的平方求和。”
0.4 代码参数的读法(你会经常看到)
axis=0:读作“沿 0 轴”。(对矩阵来说通常是按列汇总)axis=1:读作“沿 1 轴”。(对矩阵来说通常是按行汇总)keepdims=True:读作“保持维度为真”。(把被汇总的轴保留成长度 1)
1. 从“张量/形状”开始:你手里拿的到底是什么
在深度学习框架里(PyTorch、TensorFlow 等),很多对象都叫张量(tensor)。
- 标量(0 维):一个数,例如
3.14 - 向量(1 维):一串数,例如
x = [x1, x2, x3],形状([3]) - 矩阵(2 维):一个表格,例如
A有 m 行 n 列,形状([m, n]) - 更高维张量(≥3 维):例如图像 batch
N×C×H×W
**形状(shape)是所有计算的“交通规则”。**你看到的错误,80% 都是 shape 不匹配。
1.1 轴(axis)怎么理解
以矩阵A.shape = (m, n)为例:
axis=0:沿着“行方向”汇总(按列处理)axis=1:沿着“列方向”汇总(按行处理)
一个更直观的记法:
axis=0→跨行(把每一列的多个行元素汇总成一个)axis=1→跨列(把每一行的多个列元素汇总成一个)
2. 降维:sum / mean 让维度“少一截”
“降维”并不神秘:对某个轴做汇总,就把那一轴压没了。
2.1 求和符号 Σ 怎么读
Σ读作西格玛(sigma),通常也直接叫求和符号。
2.2sum():默认对所有轴求和
向量
x = [0,1,2,3]:x.sum() = 6(变成标量)
矩阵
A:A.sum()把所有元素加起来(变成标量)
2.3 指定轴axis:
以A.shape = (5, 4)为例:
A.sum(axis=0):按列求和 → 输出形状(4,)A.sum(axis=1):按行求和 → 输出形状(5,)A.sum(axis=[0,1]):行列都汇总 → 等价于A.sum()
一句话记忆:沿哪个
axis汇总,哪个axis在输出里消失。
2.4mean():平均值 = sum / 元素个数
A.mean()等价于A.sum() / A.numel()A.mean(axis=0)等价于A.sum(axis=0) / A.shape[0](除以行数)A.mean(axis=1)等价于A.sum(axis=1) / A.shape[1](除以列数)
3. 不降维求和:keepdims=True(为了广播更舒服)
有时候你希望“求和以后还保留轴”,这样后面做广播除法会更自然。
3.1keepdims=True是什么
A.sum(axis=1):形状(5,4)→(5,)
A.sum(axis=1, keepdims=True):形状(5,4)→(5,1)
也就是:被汇总的那一轴不消失,而是保留成长度 1。
3.2 为什么有用:按行归一化(一行除以这一行的和)
sum_A=A.sum(axis=1,keepdims=True)# (5,1)A_norm=A/sum_A# (5,4) / (5,1) 自动广播直观理解:每行都会除以自己的“行和”,得到“每行加起来为 1”的比例矩阵。
4. 累加不降维:cumsum(前缀和)
cumsum不是“汇总成一个数”,而是把累计过程保留下来。
A.cumsum(axis=0)axis=0:沿着行方向做累计- 输出形状不变:还是
(5,4)
可以把它想成:
- 第 1 行:原第 1 行
- 第 2 行:第 1 行 + 第 2 行
- 第 3 行:第 1 行 + 第 2 行 + 第 3 行
- ……
5. 点积 Dot Product:两个向量“对位相乘再求和”
5.1 定义
给两个向量x, y ∈ R^d:
[
x^T y = \sum_{i=1}^{d} x_i y_i
]
点积的结果是一个标量。
5.2 例子(为什么是 6)
x=torch.tensor([0.,1.,2.,3.])y=torch.ones(4)torch.dot(x,y)# = 0*1 + 1*1 + 2*1 + 3*1 = 6也可以写成:
torch.sum(x*y)因为点积本来就是“按元素乘再求和”。
5.3 点积的两个常用含义
加权求和:
x^T w = Σ x_i w_i(如果w还满足和为 1,就变成加权平均)相似程度:向量归一化后,点积与夹角余弦有关(越大越相似,越小越相反)。
6. 矩阵-向量积:Ax = “每一行和 x 做一次点积”
这是把点积扩展到矩阵的一步。
6.1 维度规则
A ∈ R^{m×n}x ∈ R^{n}Ax ∈ R^{m}
核心匹配条件:A 的列数 n = x 的长度 n。
6.2 计算方式(最重要的直观)
Ax的第 i 个元素:
[
(Ax)i = A{i,:} \cdot x
]
也就是:A 的第 i 行与 x 的点积。
6.3 一个算到最后的例子
[
A=\begin{bmatrix}
1&2&3
4&5&6
\end{bmatrix},
\quad
x=\begin{bmatrix}
10\20\30
\end{bmatrix}
]
- 第 1 行点积:
1*10 + 2*20 + 3*30 = 140 - 第 2 行点积:
4*10 + 5*20 + 6*30 = 320
所以:
[
Ax = \begin{bmatrix} 140\ 320 \end{bmatrix}
]
PyTorch:
A=torch.tensor([[1.,2.,3.],[4.,5.,6.]])x=torch.tensor([10.,20.,30.])y=torch.mv(A,x)# tensor([140., 320.])7. 矩阵-矩阵乘法:AB = “A 的行 与 B 的列做点积”
7.1 维度规则(你最容易卡的地方)
A形状(n, k)B形状(k, m)C = AB形状(n, m)
关键:左矩阵列数 = 右矩阵行数(k 必须相等)。
为什么必须相等?因为C的每个元素:
[
c_{ij} = A_{i,:} \cdot B_{:,j}
]
这本质是点积,点积要求两边长度相同。
7.2 形象图(“行×列”产生一个数)
A 的第 i 行 (长度 k) · B 的第 j 列 (长度 k) └────────────── 点积 ──────────────┘ 得到 c_{ij}7.3 PyTorch 例子为什么输出每行都重复
你看到的例子:
B=torch.ones(4,3)C=torch.mm(A,B)这里:
A是(5,4)B是(4,3),且每个元素都是 1- 结果
C是(5,3)
关键点:B 的每一列都是[1,1,1,1]^T。
所以:
C的第 i 行第 j 列 =A的第 i 行 ·B的第 j 列- 因为
B的列全是 1,这个点积就变成:
[
a_{i1}*1 + a_{i2}*1 + a_{i3}*1 + a_{i4}*1
]
也就是:A 第 i 行的行和。
由于 B 有 3 列且都一样,所以每行会被“复制”成 3 份:
[行和, 行和, 行和]这就是输出中:
[[ 6, 6, 6], [22, 22, 22], [38, 38, 38], [54, 54, 54], [70, 70, 70]]它恰好等于你之前A.sum(axis=1)的结果[6,22,38,54,70]复制成 3 列。
8. 范数 norm:衡量“有多大”的标准
范数可以理解为:把一个向量/矩阵映射成一个非负数,表示它的大小。
8.1 范数的三条“像长度一样靠谱”的规则
- 缩放:
||αx|| = |α| ||x|| - 三角不等式:
||x+y|| ≤ ||x|| + ||y|| - 非负且零向量唯一为 0:
||x|| ≥ 0,只有x=0时||x||=0
这些规则让它可以像“长度/距离”那样使用。
8.2 L2 范数:最像几何长度
[
|x|_2 = \sqrt{\sum_i x_i^2}
]
例子:x = [3, -4]
[
\sqrt{3^2 + (-4)^2} = \sqrt{9+16} = 5
]
8.3 L1 范数:绝对值之和
[
|x|_1 = \sum_i |x_i|
]
例子:[3,-4]→|3|+|−4|=7
8.4 Lp 范数:统一写法(了解口径即可)
[
|x|_p = \left(\sum_i |x_i|p\right){1/p}
]
p=2是 L2p=1是 L1
8.5 矩阵的 Frobenius 范数:矩阵版 L2
[
|X|F = \sqrt{\sum{i,j} x_{ij}^2}
]
例子:np.ones((4,9))
- 这是 4 行 9 列的矩阵
- 元素个数
4×9 = 36 - 每个元素都是 1
- 平方和 =
36×1^2 = 36 - 开根号 =
sqrt(36) = 6
所以np.linalg.norm(np.ones((4,9))) = 6。
9. 形状与操作速查表(建议常看)
| 操作 | 输入形状 | 参数 | 输出形状 | 直观含义 |
|---|---|---|---|---|
x.sum() | (n,) | 无 | () | 全部求和 |
A.sum() | (m,n) | 无 | () | 全部求和 |
A.sum(axis=0) | (m,n) | axis=0 | (n,) | 每列求和 |
A.sum(axis=1) | (m,n) | axis=1 | (m,) | 每行求和 |
A.sum(axis=1, keepdims=True) | (m,n) | keepdims | (m,1) | 每行求和但保留维度 |
A.cumsum(axis=0) | (m,n) | axis=0 | (m,n) | 行方向累计 |
torch.dot(x,y) | (n,),(n,) | 无 | () | 向量点积 |
torch.mv(A,x) | (m,n),(n,) | 无 | (m,) | 矩阵×向量 |
torch.mm(A,B) | (n,k),(k,m) | 无 | (n,m) | 矩阵×矩阵 |
10. 一张“计算流程图”:从点积到矩阵乘法
点积(向量×向量) x · y -> 标量 矩阵-向量(矩阵×向量) Ax -> 每一行与 x 点积 -> 向量 矩阵-矩阵(矩阵×矩阵) AB -> A 的每一行 与 B 的每一列点积 -> 矩阵你可以把矩阵乘法理解成:
- 点积是最小单元
- 矩阵-向量是“多次点积组成一列结果”
- 矩阵-矩阵是“多次点积组成一个二维表格”
11. 一组建议:怎么把这些概念真正“变熟”
先盯 shape,再写代码:看到
mv/mm/sum(axis=...)先把输入输出形状写在旁边。把每个公式翻译成一句话:
c_ij = 行·列Ax 是每行点积sum(axis=1) 是每行求和
遇到广播就问一句:谁是 1?
keepdims=True把被汇总的轴保留为 1,方便广播。
做一遍“手算第一行”
- 不需要手算全矩阵,手算
C[0,0]或y[0]往往就能打通理解。
- 不需要手算全矩阵,手算
12. 结尾小结:今天这套“最小骨架”
- Σ是求和符号
sum/mean沿某轴汇总会让那一轴消失(降维)keepdims=True让消失的轴保留为 1(方便广播)cumsum是累计,不降维- 点积是“对位相乘再求和”
- 矩阵-向量是“每一行与向量点积”
- 矩阵-矩阵是“行与列点积”
- 范数是“大小的度量”:L2 像长度,L1 像绝对值和,Frobenius 是矩阵版 L2
如果你愿意,我可以基于同一套数据(你书里那组 A 矩阵),把Ax、AB、sum(axis=...)、keepdims、norm串成一个完整小练习集(每题都带 shape 推导)。
📺B站视频讲解(Bilibili):博主个人介绍
📘《Yocto项目实战教程》京东购买链接:Yocto项目实战教程
📘加博主微信,进技术交流群:jerrydev