讲解稿 · 第02章 第03节 · 矩阵运算¶
口播时长:约 15–20 分钟|建议语速:中速偏慢,公式处停顿两拍|字数:约 4000 字
开场钩子(约 1 分钟)¶
你打开 ChatGPT,敲下一句话,屏幕上一个字一个字往外蹦。你有没有想过,在这几秒之内,机房里那块 GPU 到底在算啥?
答案很朴素:它在做矩阵乘法。一层接一层,一次接一次,成千上万次。前向传播的每一层是 \(A\mathbf{x} + \mathbf{b}\),反向传播算梯度也是矩阵乘。你把 GPU 拆开看,里面的 tensor core 就是为一件事而生——把两个矩阵尽快乘出来。
所以这一节讲什么,你大概能猜到了:矩阵怎么加、怎么乘、怎么解方程组。听起来像大一课本,但里面藏着两个坑,是你在 Ch01 §05 基变换那节没跳完的:
第一,\(P\) 的列到底是啥?第二,\(P^{-1}\) 具体怎么算?
上一节讲了"\(P\) 的列是新基向量在旧基下的坐标",那个约定我们记住了。可上一节留了个尾巴——\(P^{-1}\) 你还没自己动手算过。今天就把这条尾巴补上。
准备好了吗?我们进正题。
复习与预告(约 45 秒)¶
上一节 Ch02 §02 你学了七八种矩阵——单位、对角、对称、三角、正交、稀疏——这些结构本身不产生新东西,得配上运算才能干活。矩阵乘对角,就是缩放;矩阵乘三角,就是"一路代下去";矩阵乘正交,就是不改长度地转一转。
下节我们要把这些运算抬到几何层面看——线性变换:矩阵到底把空间变成了啥样?秩、核、像空间都从那节展开。今天这节,是给下节铺计算肌肉。
核心概念一:加法与标量乘——像素级的两条基本操作(约 2 分钟)🟢¶
先说最简单的两个。矩阵加法要求两个矩阵尺寸完全相同,然后逐位置相加。数字例子:
黑板上画什么?两个 \(2\times 2\) 方格并排画,箭头指到中间的和格子——位置对位置。
标量乘法就是把矩阵里每个元素都乘以那个数:
一句话总结:加法是像素级堆叠,标量乘是像素级放大。图像相加 = 图像混合,图像乘 2 = 图像调亮——这话不是比喻,直接对应像素点在做的事。
反例给你一个:\(2\times 3\) 加 \(3\times 2\),加得起来吗?加不起来。尺寸不一致,位置对不上。这个是常错点,尤其在 NumPy 里你写 A + B 有时不报错——那是 broadcasting 在偷偷补位,不是矩阵加法本身合法。
核心概念二:矩阵-向量乘——一次列的线性组合(约 2.5 分钟)🟢¶
现在到今天的第一根主梁:矩阵乘向量 \(A\mathbf{x}\)。
课本上你可能背过"逐行点积"的公式:\(A\) 的第 \(i\) 行和 \(\mathbf{x}\) 做点积,得到结果的第 \(i\) 个分量。这个视角能算对,但会让你看不懂为啥矩阵乘法这么有用。
换一个视角:\(A\mathbf{x}\) 是把 \(A\) 的列,按 \(\mathbf{x}\) 的分量做线性组合。
看例子:
看到没?\(\mathbf{x}=(5,6)^\top\) 里的 \(5\) 和 \(6\),本质是权重——你要把 \(A\) 的第一列取 \(5\) 份、第二列取 \(6\) 份,加起来。
这个视角一旦立住,你会发现 Ch01 §05 讲的基变换根本是同一件事:\(P\mathbf{v}_{新} = \mathbf{v}_{旧}\),把"新坐标"当作权重,去线性组合 \(P\) 的列(也就是新基向量),结果就是旧坐标下的向量。这就是那句口诀:
"\(P\) 的列是新基,\(P\) 把新坐标搬回旧描述。"
在神经网络里,每一层做的事都是 \(A\mathbf{x} + \mathbf{b}\)——把输入向量按 \(A\) 的列作线性组合,再加个偏置。所以你可以把 \(A\) 的每一列想成一个"提问方向",\(\mathbf{x}\) 里每个分量控制"这个方向问多深"。
黑板动作:画 \(A\) 的两根列向量,标上 \(\mathbf{a}_1, \mathbf{a}_2\);再画一根合成箭头,写 \(5\mathbf{a}_1 + 6\mathbf{a}_2\)。学生看到几何,就明白权重和向量的关系了。
⏸️ 暂停思考 · 第一次
请你把矩阵 $$ A = \begin{pmatrix}1 & 0 \ 0 & 1\end{pmatrix} $$ 换成 $$ A = \begin{pmatrix}2 & 0 \ 0 & 3\end{pmatrix} $$,然后计算 \(A\mathbf{x}\),\(\mathbf{x}=(4,5)^\top\)。你会发现结果就是 \((8, 15)^\top\)——每个分量独立缩放。这个"独立缩放"就是对角矩阵的魂,你之后在 SVD 里会天天见到。
核心概念三:矩阵乘法与它的三条规则(约 3 分钟)🟢🟡¶
把矩阵-向量乘再抬一层,就是矩阵乘矩阵。
\(A\) 是 \(m\times n\),\(B\) 是 \(n\times p\),乘积 \(C = AB\) 是 \(m\times p\)。规则:
内维必须相配(两个 \(n\)),外维保留。数字例子(\(2\times 3\) 乘 \(3\times 2\)):
\(C_{11}\) 怎么算的?\(A\) 第一行 \((1,2,3)\) 和 \(B\) 第一列 \((1,2,3)^\top\) 做点积,\(1+4+9=14\)。你看,乘积的每一格都是一次点积。
另一个视角我要专门强调,因为这直接对应 Ch01 §05:乘积 \(C\) 的第 \(j\) 列 = \(A\) 的各列按 \(B\) 的第 \(j\) 列作线性组合。所以 \(AB\) 你可以理解为"用 \(B\) 的每一列当权重向量,去搅拌 \(A\) 的列"。基变换本质就是这个动作。
三条规则记牢:
- 不满足交换律:一般 \(AB \ne BA\)。这一步坑最多。\(2\times 3\) 乘 \(3\times 2\) 得 \(2\times 2\),反过来 \(3\times 2\) 乘 \(2\times 3\) 得 \(3\times 3\)——连尺寸都不一样。
- 满足结合律:\((AB)C = A(BC)\)。你想先算 \(AB\) 还是先算 \(BC\) 都行。这条在深度学习里省钱——比如三个矩阵 \(A(m\times n), B(n\times p), C(p\times 1)\),先算 \(BC\) 得到 \(n\times 1\) 向量,再让 \(A\) 乘它,总代价 \(O(np + mn)\);反过来先算 \(AB\) 是 \(O(mnp)\)。乘法顺序不同,成本能差好几个数量级。
- 满足分配律:\(A(B+C) = AB + AC\)。展开括号跟小学乘法一样。
- 单位元:\(AI = IA = A\)。\(I\) 是那个 "什么也不干" 的对角 1 矩阵。
反例检验交换律:
\(AB \ne BA\)。这里容易踩坑。
一句话总结:矩阵乘法是"行·列点积",也是"用右侧列加权左侧列",两个视角看同一件事。
核心概念四:Hadamard 积与外积——两个别名(约 2 分钟)🟢🟡¶
矩阵还有两个乘法长得像但完全不同。
Hadamard 积 \(A \odot B\):同尺寸矩阵逐位置相乘。
\(A \odot B\) 是满足交换律的(因为逐位置乘就是标量乘,标量乘可交换)。它在 ML 里的核心场景叫门控 (gating):你造一个取值在 \([0,1]\) 的"掩码"矩阵 \(M\),\(M \odot X\) 就相当于让 \(X\) 里每个位置按 \(M\) 的比例"通过"。LSTM 里的遗忘门、Transformer 里的 dropout mask,用的都是它。
⭐ 进阶提示:Hadamard 积和普通矩阵乘完全是两种运算,尺寸约束、性质、几何意义都不一样,考试和面试常拿这个混淆你。
外积 \(\mathbf{u}\mathbf{v}^\top\):两个向量的一种特殊乘法,一列乘一行,结果是一个秩 1 矩阵。
秩为什么是 1?看结果——每一行都是 \((4, 5)\) 的倍数:第一行 \(1\) 倍,第二行 \(2\) 倍,第三行 \(3\) 倍。所有行共线,所以秩是 1。这个"外积生秩 1 矩阵"的事实在下下节 SVD 里会变成主角——任何矩阵都能写成一堆秩 1 外积的和。
一句话总结:Hadamard 积是像素级门控,外积是秩 1 积木。
核心概念五:逆矩阵,以及 P⁻¹ 到底怎么算(约 3 分钟)🟡¶
现在补 Ch01 §05 留下的最大一个坑:\(P^{-1}\) 怎么算。
先给定义。方阵 \(A\) 的逆矩阵 \(A^{-1}\),是那个满足 \(A A^{-1} = A^{-1} A = I\) 的方阵。用生活语言说,\(A\) 把向量搬到某处,\(A^{-1}\) 就是把它搬回来的那个矩阵。不是每个矩阵都有逆——只有行列式非零的方阵才可逆。
先给 \(2\times 2\) 手算公式,这个必须记住:
口诀四步:主对角对调、副对角变号、整体除以行列式 \(ad-bc\)。
现在用 Ch01 §05 咖啡馆那组基验证。新基 \(\mathbf{b}_1=(1,1)\),\(\mathbf{b}_2=(-1,1)\)。按约定"\(P\) 的列是新基向量在旧基下的坐标":
行列式 \(\det P = 1\cdot 1 - (-1)\cdot 1 = 2\)。主对角对调(本例对称,1 换 1 没变化),副对角变号(\(-1\) 变 \(1\),\(1\) 变 \(-1\)):
验一下——旧坐标 \((3, 2)^\top\) 翻成新坐标:
跟 Ch01 §05 咖啡馆的朋友坐标对上了。相似变换的写法也别搞错——\(\tilde A = P^{-1} A P\),"新 = P⁻¹ · 旧 · P",这个公式下节讲线性变换会正式用上。
"\(P\) 的列是新基,\(P\) 把新坐标搬回旧描述。" 这句话你现在应该已经彻底吃透了。
⏸️ 暂停思考 · 第二次
我给你一个新基 \(\mathbf{b}_1=(2,0)\),\(\mathbf{b}_2=(0,3)\),请你手算 \(P\) 和 \(P^{-1}\),然后把旧坐标 \((6, 12)^\top\) 翻成新坐标。答案:\(P=\mathrm{diag}(2,3)\),\(P^{-1}=\mathrm{diag}(1/2, 1/3)\),新坐标 \((3, 4)^\top\)。对角矩阵的逆特别简单,主对角元素直接取倒数。
⭐ 进阶:\(3\times 3\) 及以上的逆矩阵手算很累,实际里用分解做——Ch02 §05 会讲 LU 分解、QR 分解。你以后代码里写 np.linalg.solve(A, b),底层跑的都是分解,不是直接求逆。
核心概念六:线性映射三公理——从矩阵到抽象变换(约 2.5 分钟)🟡¶
这一段是本节的桥梁,把矩阵运算和下一节的"线性变换"接上。
线性映射 (linear map) 是一种从向量空间 \(V\) 到向量空间 \(W\) 的函数 \(T: V \to W\),它必须同时满足三条公理。这三条你会背,但必须理解为什么。
公理一 · 加性 (Additivity):\(T(\mathbf{u} + \mathbf{v}) = T(\mathbf{u}) + T(\mathbf{v})\)。
- 大白话:先加再变,跟先各自变再加,结果一样。
- 反例:函数 \(T(x) = x^2\),取 \(u=1, v=2\),\(T(1+2)=9\),但 \(T(1)+T(2)=1+4=5\),\(9\ne 5\),违反了。所以 \(x^2\) 不是线性映射。
公理二 · 齐次 (Homogeneity):\(T(c\mathbf{v}) = c\, T(\mathbf{v})\)。
- 大白话:先放大再变,跟先变再放大,结果一样。
- 反例:\(T(x) = x + 1\),取 \(c=2, v=3\),\(T(6)=7\),但 \(2T(3)=8\),\(7\ne 8\)。所以带常数项的"线性函数"(高中说法)在数学上不是线性映射,是仿射映射。
公理三 · 零到零 (Zero preserved):\(T(\mathbf{0}) = \mathbf{0}\)。
- 大白话:原点必须打到原点,不能有平移。
- 反例:\(T(\mathbf{v}) = \mathbf{v} + (1, 0)\),\(T(\mathbf{0}) = (1, 0) \ne \mathbf{0}\)。违反。这也是为啥"过原点"在 Ch01 §01 反复强调——子空间必须过原点,线性映射必须把零打到零,一脉相承。
关键结论:每一个 \(m\times n\) 矩阵 \(A\),都对应一个 \(\mathbb{R}^n \to \mathbb{R}^m\) 的线性映射 \(\mathbf{x} \mapsto A\mathbf{x}\);反过来,每一个 \(\mathbb{R}^n\) 上的线性映射,都能用一个矩阵唯一表示。矩阵和线性映射,本质是一件事。
这就是为啥 Ch01 §05 的基变换,Ch02 §04 的线性变换,Ch02 §05 的矩阵分解,都在讨论同一个东西——只是站的角度不一样。
一个走完全程的例子:买水果解方程(约 2.5 分钟)🟢¶
现在把今天所有概念串起来。回到课本那个买水果的例子。
场景:苹果 \(x_1\) 元一个,香蕉 \(x_2\) 元一根。你买 2 个苹果加 1 根香蕉花了 5 元,买 1 个苹果加 3 根香蕉花了 10 元。求单价。
第一步 · 写成矩阵形式(矩阵-向量乘视角):
用"\(A\mathbf{x}\) 是 \(A\) 的列的线性组合"视角读:\(x_1\) 份苹果价的列 \((2,1)^\top\),加上 \(x_2\) 份香蕉价的列 \((1, 3)^\top\),得到总账单 \((5, 10)^\top\)。这个读法比逐行点积更直观——你在问:"要把 \(A\) 的两列各取几份,才能凑出 \(\mathbf{b}\)?"
第二步 · 手算 \(A^{-1}\)(逆矩阵四步口诀):
第三步 · 求解 \(\mathbf{x} = A^{-1}\mathbf{b}\):
苹果 1 元,香蕉 3 元。
第四步 · 反向验证(矩阵-向量乘再走一遍):
一个例子走完了矩阵-向量乘、矩阵乘、逆矩阵、线性方程组求解——这就是今天讲的所有主线。
⭐ 补一句实战:真去写代码求解,别 np.linalg.inv(A) @ b——数值不稳定还慢。要用 np.linalg.solve(A, b),底层是分解法,Ch02 §05 会讲。
易错点回头看(约 90 秒)¶
三条最常见的坑,我逐条讲。
易错点 1:很多人以为矩阵乘法满足交换律,其实不满足,因为 \(AB\) 和 \(BA\) 尺寸都可能对不上。
- \(A\) 是 \(2\times 3\),\(B\) 是 \(3\times 2\),\(AB\) 是 \(2\times 2\),\(BA\) 是 \(3\times 3\),连结果都不是同一类东西。就算 \(A, B\) 都是同尺寸方阵,一般也 \(AB \ne BA\)——上文那个 \(2\times 2\) 的例子就是反例。
易错点 2:很多人以为 \(A\mathbf{x}\) 是"\(A\) 的行乘 \(\mathbf{x}\)",其实更本质的是"\(A\) 的列按 \(\mathbf{x}\) 加权组合",因为这个列视角直接对应 Ch01 §05 的基变换 \(P\mathbf{v}_{新} = \mathbf{v}_{旧}\)——新坐标做权重,\(P\) 的列(新基向量)被组合出旧描述。两个视角结果一样,但列视角能让基变换、SVD、注意力机制在你脑子里连成一条线。
易错点 3:很多人以为 Hadamard 积 \(A \odot B\) 就是"简化版矩阵乘",其实两者尺寸约束和几何含义都完全不同,因为矩阵乘要求 \(A\) 的列数 = \(B\) 的行数,Hadamard 要求两者尺寸完全一致;矩阵乘代表线性变换的复合,Hadamard 代表逐元素门控。这两个别在写代码时用 * 和 @ 搞混了——NumPy 里 A * B 是 Hadamard,A @ B 才是矩阵乘。
下节钩子(约 30 秒)¶
今天你已经掌握了矩阵怎么算。可我想留个问题给你——
一个矩阵到底把空间变成了啥样?
$$ \begin{pmatrix}2 & 0 \ 0 & 1\end{pmatrix} $$ 把 \(\mathbb{R}^2\) 里的一个正方形,变成一个横向拉长两倍的长方形——这叫"拉伸";$$ \begin{pmatrix}0 & -1 \ 1 & 0\end{pmatrix} $$ 把它旋转 90 度;$$ \begin{pmatrix}1 & 1 \ 1 & 1\end{pmatrix} $$ 把整个平面压扁到一条直线上——一整个维度没了。
矩阵乘不仅是数字游戏,更是几何动作。下一节 §04 线性变换,我们就把每个矩阵还原成"它到底对空间干了啥"——拉伸、旋转、投影、压缩,全部拆开看。到时候秩、核、像空间这些看起来吓人的名词,会变成一张张几何图。
带着今天买水果那个例子里的 \(A\),你先想一下:它把 \(\mathbf{x}=(1,0)^\top\) 打到哪里去了?把 \((0,1)^\top\) 打到哪里去了? 答案就在这两列里——下节见。