news 2026/2/24 17:07:28

线性代数学习笔记:从张量到矩阵乘法与范数(含例子与 PyTorch 代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
线性代数学习笔记:从张量到矩阵乘法与范数(含例子与 PyTorch 代码)

📺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 维):例如图像 batchN×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 点积的两个常用含义

  1. 加权求和x^T w = Σ x_i w_i(如果w还满足和为 1,就变成加权平均)

  2. 相似程度:向量归一化后,点积与夹角余弦有关(越大越相似,越小越相反)。


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 范数的三条“像长度一样靠谱”的规则

  1. 缩放:||αx|| = |α| ||x||
  2. 三角不等式:||x+y|| ≤ ||x|| + ||y||
  3. 非负且零向量唯一为 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是 L2
  • p=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. 一组建议:怎么把这些概念真正“变熟”

  1. 先盯 shape,再写代码:看到mv/mm/sum(axis=...)先把输入输出形状写在旁边。

  2. 把每个公式翻译成一句话

    • c_ij = 行·列
    • Ax 是每行点积
    • sum(axis=1) 是每行求和
  3. 遇到广播就问一句:谁是 1?

    • keepdims=True把被汇总的轴保留为 1,方便广播。
  4. 做一遍“手算第一行”

    • 不需要手算全矩阵,手算C[0,0]y[0]往往就能打通理解。

12. 结尾小结:今天这套“最小骨架”

  • Σ是求和符号
  • sum/mean沿某轴汇总会让那一轴消失(降维)
  • keepdims=True让消失的轴保留为 1(方便广播)
  • cumsum是累计,不降维
  • 点积是“对位相乘再求和”
  • 矩阵-向量是“每一行与向量点积”
  • 矩阵-矩阵是“行与列点积”
  • 范数是“大小的度量”:L2 像长度,L1 像绝对值和,Frobenius 是矩阵版 L2

如果你愿意,我可以基于同一套数据(你书里那组 A 矩阵),把AxABsum(axis=...)keepdimsnorm串成一个完整小练习集(每题都带 shape 推导)。


📺B站视频讲解(Bilibili):博主个人介绍

📘《Yocto项目实战教程》京东购买链接:Yocto项目实战教程

📘加博主微信,进技术交流群jerrydev


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/24 5:30:51

人脸识别OOD模型效果展示:高精度特征提取案例集

人脸识别OOD模型效果展示:高精度特征提取案例集 1. 为什么需要OOD质量评估的人脸识别模型? 你有没有遇到过这样的情况:门禁系统突然认不出自己,考勤打卡时反复提示“人脸不清晰”,或者安防系统在低光照环境下频繁误报…

作者头像 李华
网站建设 2026/2/20 17:49:44

Clawdbot+Qwen3-32B实战教程:接入企业微信/飞书机器人,打造内部AI助理

ClawdbotQwen3-32B实战教程:接入企业微信/飞书机器人,打造内部AI助理 1. 为什么需要一个内部AI助理? 你有没有遇到过这些情况: 新员工入职要反复问“流程怎么走”“文档在哪找”“审批找谁批”,HR和主管每天重复回答…

作者头像 李华
网站建设 2026/2/20 5:18:23

YOLOE Gradio界面搭建,三步实现Web交互

YOLOE Gradio界面搭建,三步实现Web交互 YOLOE不是又一个“更快的YOLO”,而是一次对目标感知范式的重新定义。当大多数模型还在为封闭词汇表内的几十个类别反复调优时,YOLOE已经能对着一张街景照片,准确圈出“穿荧光绿雨衣的外卖骑…

作者头像 李华
网站建设 2026/2/23 6:13:45

电商设计神器!用Z-Image-Turbo快速生成产品海报

电商设计神器!用Z-Image-Turbo快速生成产品海报 1. 为什么电商设计师都在悄悄换工具? 你有没有遇到过这些场景: 大促前夜,运营突然甩来10款新品,要求2小时内出3套不同风格的主图;美工请假,临…

作者头像 李华
网站建设 2026/2/19 21:12:45

非算法人员的AI突围:从后端/大数据到AI高薪岗位的实战攻略

文章指出普通程序员无需成为算法专家即可切入AI领域。应避开AI创业、项目负责人和算法岗位,转而成为"AI转型者",专注于AI项目的工程角色。面试时应强调复杂系统稳定性、数据管理和业务规则构建能力。普通程序员的核心价值在于确保AI系统稳定运…

作者头像 李华
网站建设 2026/2/23 10:21:34

动手试了gpt-oss-20b-WEBUI,网页交互体验很流畅

动手试了gpt-oss-20b-WEBUI,网页交互体验很流畅 最近在本地部署了一个叫 gpt-oss-20b-WEBUI 的镜像,不是命令行跑模型,也不是写脚本调 API,而是直接点开浏览器就能对话——整个过程没改一行配置、没敲一条 pip 命令,从…

作者头像 李华