· 线性代数 · 第 2 / 10 讲

2 · 矩阵与线性变换

一个矩阵就是一个动作。从列视角看换基,从行视角看批量内积,揭示深度学习前向传播与游戏引擎变换的底层逻辑。

上一节把数据表示成了向量。本节回答:怎么对一整个空间的向量做统一的操作? 答案是矩阵。理解本节的关键口号是——矩阵就是一个动作


一、矩阵(Matrix)是什么

表面上,矩阵是一个数的长方形表格,m×nm \times n 表示 m 行 n 列:

A=[a11a12a1na21a22a2nam1am2amn]\mathbf{A} = \begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} & a_{m2} & \cdots & a_{mn} \end{bmatrix}

但真正重要的是它的第二重身份:一个线性变换。一个 m×nm \times n 矩阵,是一台把 n 维向量「吃进去」、吐出 m 维向量的机器。

跨领域应用:神经网络的每一层就是一次矩阵乘法,即一次线性变换,把向量从一个维度空间映射到另一个。前向传播的完整过程就是一系列矩阵变换的串联。(→ 七节·案例一)

二、矩阵的基本运算

矩阵乘法因与变换复合深度绑定,单独放在第五节。其余四种基本运算如下。

2.1 加法与数乘

加法:两个同型矩阵(行列数相同)逐元素相加,(A+B)ij=aij+bij(\mathbf{A}+\mathbf{B})_{ij}=a_{ij}+b_{ij}。满足交换律与结合律。

数乘:标量 cc 与矩阵逐元素相乘,(cA)ij=caij(c\mathbf{A})_{ij}=c\cdot a_{ij}

2.2 转置

转置 A\mathbf{A}^\top:行列互换,(A)ij=Aji(\mathbf{A}^\top)_{ij}=\mathbf{A}_{ji}。在内积、协方差、最小二乘中无处不在;AA\mathbf{A}^\top\mathbf{A} 一定是对称矩阵。运算规律:

2.3 外积与投影矩阵

外积(outer product):列向量 × 行向量,结果是 n×mn\times m 矩阵

ab=[a1a2an][b1b2bm]=[a1b1a1b2a1bma2b1a2b2a2bmanb1anb2anbm]\mathbf{a}\mathbf{b}^\top = \begin{bmatrix}a_1\\a_2\\\vdots\\a_n\end{bmatrix}\begin{bmatrix}b_1 & b_2 & \cdots & b_m\end{bmatrix} = \begin{bmatrix}a_1 b_1 & a_1 b_2 & \cdots & a_1 b_m \\ a_2 b_1 & a_2 b_2 & \cdots & a_2 b_m \\ \vdots & \vdots & \ddots & \vdots \\ a_n b_1 & a_n b_2 & \cdots & a_n b_m\end{bmatrix}

ii 行第 jj 列元素为 aibja_i b_j

与内积(→ 一章·二节)相比:ab\mathbf{a}^\top\mathbf{b}(行×列)压缩为标量;ab\mathbf{a}\mathbf{b}^\top(列×行)展开为矩阵——符号几乎相同,结果维度截然不同。

投影矩阵:单位方向向量 u^\hat{u} 的外积 u^u^\hat{u}\hat{u}^\top 就是沿 u^\hat{u} 方向的投影矩阵。

对任意向量 x\mathbf{x}

(u^u^)x=u^(u^x)(\hat{u}\hat{u}^\top)\mathbf{x} = \hat{u}\,(\hat{u}^\top\mathbf{x})u^x\hat{u}^\top\mathbf{x} 是投影长度(标量),乘以方向 u^\hat{u} 得到投影向量

对矩阵 X\mathbf{X} 同理:u^u^X\hat{u}\hat{u}^\top\mathbf{X}X\mathbf{X} 的每一列都投影到 u^\hat{u} 方向上。(→ 七节·案例二推导)

2.4 迹(Trace)

tr(A)\text{tr}(\mathbf{A}):方阵对角元之和,tr(A)=iaii\text{tr}(\mathbf{A})=\sum_i a_{ii}。关键性质:tr(AB)=tr(BA)\text{tr}(\mathbf{AB})=\text{tr}(\mathbf{BA})——即使 ABBA\mathbf{AB}\neq\mathbf{BA},迹仍相等。Frobenius 范数 AF2=tr(AA)\|\mathbf{A}\|_F^2=\text{tr}(\mathbf{A}^\top\mathbf{A}) 由此而来。

2.5 逆矩阵

逆矩阵 A1\mathbf{A}^{-1}:满足 A1A=AA1=I\mathbf{A}^{-1}\mathbf{A}=\mathbf{A}\mathbf{A}^{-1}=\mathbf{I} 的矩阵。几何直觉:A1\mathbf{A}^{-1} 是「撤销 A\mathbf{A} 这个变换」的操作。

存在条件A\mathbf{A} 必须是方阵,且 det(A)0\det(\mathbf{A})\neq 0——即变换没有把空间压缩到更低维度(行列式将在后续章节详述)。

求逆的两种方法

① 伴随矩阵法(理论推导):A1=adj(A)det(A)\mathbf{A}^{-1}=\dfrac{\mathrm{adj}(\mathbf{A})}{\det(\mathbf{A})},用代数余子式构造伴随矩阵再除以行列式。对 2×22\times2 矩阵 A=[abcd]\mathbf{A}=\begin{bmatrix}a&b\\c&d\end{bmatrix},结果为:

A1=1adbc[dbca]\mathbf{A}^{-1}=\dfrac{1}{ad-bc}\begin{bmatrix}d&-b\\-c&a\end{bmatrix}

理解这个结构即可,无需死记。3×33\times3 以上计算量急剧增大,不实用。

② 初等行变换法(实用):构造增广矩阵 [AI][\mathbf{A}\mid\mathbf{I}],对左侧施加行变换直到化为 I\mathbf{I},右侧自动变为 A1\mathbf{A}^{-1}。适用于任意维度,是实际计算的主流方法(详见后续章节方程组部分)。

运算规律

三、矩阵 × 向量 = 变换空间 / 测量输入

3.1 基(Basis)

理解变换之前,先明确坐标系。二维平面默认使用标准基(standard basis):

e1=[10],e2=[01]\mathbf{e}_1 = \begin{bmatrix}1\\0\end{bmatrix},\quad \mathbf{e}_2 = \begin{bmatrix}0\\1\end{bmatrix}

任意二维向量都是它们的线性组合——例如 [32]=3e1+2e2\begin{bmatrix}3\\2\end{bmatrix} = 3\mathbf{e}_1 + 2\mathbf{e}_2,其中 3 和 2 是该向量在标准基下的坐标。只要两个向量线性无关(不共线),就能构成平面的一组合法基;标准基只是最常用的一种。

3.2 列视角——换基:Ax 的本质

A 的每列是标准基变换后的落点——当各列线性无关时,它们构成一组新基;Ax 就是把 x 的各坐标在这组新基下展开,合成变换后的向量。

为什么叫”换基”?

变换前,x 在标准基下展开:

x=x1e1+x2e2\mathbf{x} = x_1 \mathbf{e}_1 + x_2 \mathbf{e}_2

矩阵 A 把标准基映射到新基(A 的两列):

e1a1,e2a2\mathbf{e}_1 \to \mathbf{a}_1,\quad \mathbf{e}_2 \to \mathbf{a}_2

x 的坐标 (x1,x2)(x_1, x_2) 不变,基换了:

Ax=x1a1+x2a2\mathbf{A}\mathbf{x} = x_1 \mathbf{a}_1 + x_2 \mathbf{a}_2

核心直觉:A 做的事不是「移动 x 这个点」,而是「重新定义坐标轴的方向」——数字没动,动的是那把尺子。列向量线性无关时,这就是真正的换基;列向量线性相关时,变换将空间压进更低维的子空间,即降维。

n 维一般形式

Am×n=[a11a12a1na21a22a2nam1am2amn],xn×1=[x1x2xn]\mathbf{A}_{m\times n} = \begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} & a_{m2} & \cdots & a_{mn} \end{bmatrix},\quad x_{n\times 1} = \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{bmatrix} Ax=x1[a11a21am1]+x2[a12a22am2]++xn[a1na2namn]Rm\mathbf{A}\mathbf{x} = x_1\begin{bmatrix}a_{11}\\a_{21}\\\vdots\\a_{m1}\end{bmatrix} + x_2\begin{bmatrix}a_{12}\\a_{22}\\\vdots\\a_{m2}\end{bmatrix} + \cdots + x_n\begin{bmatrix}a_{1n}\\a_{2n}\\\vdots\\a_{mn}\end{bmatrix} \in \mathbb{R}^m

A 的第 j 列(m×1 向量)被 xjx_j 缩放后求和,结果从 n 维变换到 m 维。

变换前,x 在标准基 {e1,e2,,en}\{e_1, e_2, \ldots, e_n\} 下展开:

x=x1e1+x2e2++xnen\mathbf{x} = x_1 \mathbf{e}_1 + x_2 \mathbf{e}_2 + \cdots + x_n \mathbf{e}_n

A 把每个标准基映射到 A 的对应列(新基,m 维):

e1a1,e2a2,,enan\mathbf{e}_1 \to \mathbf{a}_1,\quad \mathbf{e}_2 \to \mathbf{a}_2,\quad \ldots,\quad \mathbf{e}_n \to \mathbf{a}_n

x 的坐标 (x1,x2,,xn)(x_1, x_2, \ldots, x_n) 不变,基换了:

Ax=x1a1+x2a2++xnanRm\mathbf{A}\mathbf{x} = x_1 \mathbf{a}_1 + x_2 \mathbf{a}_2 + \cdots + x_n \mathbf{a}_n \in \mathbb{R}^m

3.3 行视角——批量内积:Ax 的另一种描述

本节大标题「矩阵 × 向量 = 变换空间 / 测量输入」概括了两种视角。3.2 从列视角展开了前半句——A 的列定义新基,变换空间。本节从行视角展开后半句:A 的每一行是一个「探测器」,AxA\mathbf{x} 的每个分量衡量输入与该探测器的匹配程度。

把 A 按切开,第 ii 行记为 ai\mathbf{a}_i^\top1×n1 \times n 行向量),则 AxA\mathbf{x} 的第 ii 个分量为:

(Ax)i=aix=k=1naikxk(A\mathbf{x})_i = \mathbf{a}_i^\top \mathbf{x} = \sum_{k=1}^{n} a_{ik}\, x_k

这正是内积——A 的第 ii 行与 x\mathbf{x} 逐元素相乘再求和。把 mm 个分量叠在一起:

Ax=[a1xa2xamx]A\mathbf{x} = \begin{bmatrix} \mathbf{a}_1^\top \mathbf{x} \\ \mathbf{a}_2^\top \mathbf{x} \\ \vdots \\ \mathbf{a}_m^\top \mathbf{x} \end{bmatrix}

矩阵乘列向量 = mm 个内积打包成一列。每一行是一个「探测器」,内积衡量 x\mathbf{x} 与该探测器的匹配程度。

两种视角的对照

两种视角是同一件事的两面:列视角看到「空间被变换」,行视角看到「输入被测量」——前者改变空间,后者测量输入。更深的统一:A 的列定义了输出空间的结构(怎么合成),A 的行定义了输入空间的测量方式(怎么读数)——同一组数字,竖着读是「造」,横着读是「测」。

神经网络的权重矩阵(→ 七节·案例一)、协方差矩阵、注意力机制中的 QKQK^\top,本质上都是「矩阵的每一行是一个探测器,对输入做内积」这个结构。

这也解释了为什么约定把矩阵写在左边、列向量写在右边:这种写法天然对应「一堆探测器(行)各自测量同一个输入」——如果反过来写成 xA\mathbf{x}^\top A,含义就变成了「同一个探测器和一堆不同的东西比」,视角完全不同。进一步到矩阵乘矩阵 ABAB,每个元素 cijc_{ij} 也是一次内积(A 的第 ii 行 · B 的第 jj 列)——整个矩阵乘法就是所有行与所有列的两两内积,排成一张表(→ 5.1·视角三)。

跨领域应用:图形渲染的本质就是矩阵乘向量——每个顶点坐标(x, y)是一个向量,乘以变换矩阵就得到新坐标。旋转、缩放、投影都是换基。而且每个像素的变换彼此独立,天然适合并行。GPU 每帧对数百万顶点并行执行矩阵乘法,才能实时渲染旋转、缩放、3D 投影等效果。(→ 七节·案例二)

四、常见线性变换与雅可比矩阵

4.1 常见变换矩阵

常见变换对应的矩阵:

4.2 雅可比矩阵:推导方法

以上矩阵都可以用同一套方法推导:对变换 T 的每个输出分量分别对各输入变量求偏导、按行排成矩阵,即雅可比矩阵(Jacobian)

J=[T1/xT1/yT2/xT2/y]J = \begin{bmatrix} \partial T_1/\partial x & \partial T_1/\partial y \\ \partial T_2/\partial x & \partial T_2/\partial y \end{bmatrix}

以旋转变换 T(x,y)=(xcosθysinθ,  xsinθ+ycosθ)T(x, y) = (x\cos\theta - y\sin\theta,\; x\sin\theta + y\cos\theta) 为例:

T1x=cosθ,T1y=sinθ,T2x=sinθ,T2y=cosθ\frac{\partial T_1}{\partial x} = \cos\theta,\quad \frac{\partial T_1}{\partial y} = -\sin\theta,\quad \frac{\partial T_2}{\partial x} = \sin\theta,\quad \frac{\partial T_2}{\partial y} = \cos\theta

四个偏导按行排列,正好是旋转矩阵。

4.3 线性变换——雅可比全局一致

以一般线性变换 T(x,y)=(ax+by,  cx+dy)T(x, y) = (ax + by,\; cx + dy) 为例,每个偏导均为常数:

T1x=a,T1y=b,T2x=c,T2y=d\frac{\partial T_1}{\partial x} = a,\quad \frac{\partial T_1}{\partial y} = b,\quad \frac{\partial T_2}{\partial x} = c,\quad \frac{\partial T_2}{\partial y} = d

J=[abcd]J = \begin{bmatrix} a & b \\ c & d \end{bmatrix}——无论在哪个点求雅可比,结果都是同一个矩阵。这正是「线性」的含义:输出对输入的响应在全局一致。

4.4 非线性变换——雅可比随点变化

以变换 T(x,y)=(x2, y)T(x, y) = (x^2,\ y) 为例——把 x 方向按平方「弯曲」,y 方向不动。

计算雅可比:

J=[T1/xT1/yT2/xT2/y]=[2x001]J = \begin{bmatrix} \partial T_1/\partial x & \partial T_1/\partial y \\ \partial T_2/\partial x & \partial T_2/\partial y \end{bmatrix} = \begin{bmatrix} 2x & 0 \\ 0 & 1 \end{bmatrix}

J 含有 x,在不同点处结果不同:

对比 4.3 节:线性变换的 Jacobian 是常数(全局一致);非线性变换的 Jacobian 随坐标变化——每个点都有自己的「局部线性近似」,描述在该点极小邻域内空间如何被拉伸或压缩。

五、矩阵乘法 = 变换的复合 / 行列内积排表

前几节我们确立了一个观点:矩阵就是线性变换,它的每一列装着标准基向量的落点,每一行是一个探测器。顺着这个观点,两个矩阵相乘有三种自然的读法。

C=AB\mathbf{C} = \mathbf{A}\mathbf{B} 不是数字的机械搬运——整体看是变换的复合,从列看是逐列施以变换,从行看是两两内积排成表。三种视角给出同一个矩阵。

5.1 三种视角

视角一:变换的复合(整体地看)

矩阵的本职是作用在向量上。对 x\mathbf{x} 先施加 B 得到 Bx\mathbf{B}\mathbf{x},再施加 A 得到 A(Bx)\mathbf{A}(\mathbf{B}\mathbf{x})。我们希望有一个矩阵一步到位:

Cx=A(Bx)\mathbf{C}\mathbf{x} = \mathbf{A}(\mathbf{B}\mathbf{x}) 对所有 x\mathbf{x} 成立

这个 C 就定义为 AB。所以 AB 的含义是「先 B 后 A」的合成变换。也正因为最先作用于 x\mathbf{x} 的 B 紧贴着向量写在右边,AB\mathbf{A}\mathbf{B}从右往左读。

视角二:逐列施以变换 A(列视角)

定义有了,这个合成矩阵具体怎么算?回到「列」的视角。关键回忆(3.2 节):任何矩阵的第 j 列,就是它作用在第 j 个标准基向量 ej\mathbf{e}_j 上的结果。 所以要知道 AB 的第 j 列,只需看它把 ej\mathbf{e}_j 送到哪:

(AB)ej=A(Bej)=Abj(\mathbf{A}\mathbf{B})\mathbf{e}_j = \mathbf{A}(\mathbf{B}\mathbf{e}_j) = \mathbf{A}\mathbf{b}_j

其中 bj\mathbf{b}_j 正是 B 的第 j 列。把所有列拼起来:

AB=[Ab1Ab2Abn]\mathbf{A}\mathbf{B} = [\mathbf{A}\mathbf{b}_1 \mid \mathbf{A}\mathbf{b}_2 \mid \cdots \mid \mathbf{A}\mathbf{b}_n]

矩阵乘矩阵 = A 对 B 的每一列逐一施以变换,再把结果拼回去。

视角三:行×列内积排成表(行视角)

3.3 节从行视角理解了矩阵乘向量——A 的每一行与 x\mathbf{x} 做内积。矩阵乘矩阵只是再进一步:B 有 p 列,A 有 m 行,每对(行, 列)做一次内积,结果排成 m×pm \times p 的表。

cij=aibj=k=1naikbkjc_{ij} = \mathbf{a}_i^\top \mathbf{b}_j = \sum_{k=1}^{n} a_{ik} b_{kj}

A 的第 ii 行(1×n1 \times n)与 B 的第 jj 列(n×1n \times 1)做内积,得到标量 cijc_{ij}。所有 m×pm \times p 个组合排完,就是 AB。A 的每行是一个探测器,B 的每列是一个被测对象——AB 就是一张「所有探测器测量所有对象」的得分表。

视角三还有另一种等价写法:**AB 的第 i 行 = **aiB\mathbf{a}_i^\top B,即 A 的第 i 行(一个 1×n1 \times n 的行向量)独立地对 B 做一次「行×矩阵」变换——它分别与 B 的每列做内积,产出一整行结果。所以矩阵乘法不仅是「逐列施以变换」(视角二),也可以是「逐行施以变换」——A 的每行作为一个独立的探测器,扫描 B 的所有列,产出一行得分。这与列视角对称:列视角说「B 的每列被 A 整体变换」,行视角说「A 的每行独立扫描 B 的全部列」。

三种视角为何是同一件事

视角一把目光放在任意向量 x\mathbf{x} 的去向,视角二把它落实到 n 个标准基上——基的去向定了,变换就定了。视角三换到行看:A 的行 i 与 bj\mathbf{b}_j 的内积,恰好是 Abj\mathbf{A}\mathbf{b}_j(视角二的结果)的第 i 个分量。一个按列推进(A 变换 B 的每列),一个按行列交叉推进(A 的每行测量 B 的每列),排出来的表一模一样。

维度匹配(m×n)(n×p)=(m×p)(m \times n)(n \times p) = (m \times p),中间的 n 要相等——A 的每行有 n 个分量,B 的每列也有 n 个分量,内积要求长度匹配。

5.2 为什么不可交换

ABBA\mathbf{AB} \neq \mathbf{BA} 是常态,可交换是例外。

原因:每个变换都会重塑整个空间,第二个变换作用的是已经被第一个变换改造过的空间——顺序不同,第二步「看到」的东西完全不同,自然得到不同结果。

以 R(旋转 90°)和 S(x 轴放大 2 倍)为例:先旋转再放大,被拉长的是「转过之后」的横向;先放大再旋转,被转走的是「已经拉长」的横向——两条路径把同一个点送到不同位置(完整数值见七节·案例二)。

满足 AB=BA\mathbf{AB} = \mathbf{BA} 的矩阵对,称为可交换矩阵。常见情形:其中一个是单位矩阵 I、两者都是缩放矩阵、或同一矩阵的不同幂次(如 A2\mathbf{A}^2A3\mathbf{A}^3)。

虽然不可交换,但结合律始终成立:(AB)C=A(BC)(\mathbf{AB})\mathbf{C} = \mathbf{A}(\mathbf{BC})——因为「先 C 后 B 后 A」的执行顺序固定,无论怎么分组结果都一样。这是矩阵乘法最重要的代数性质之一,也是深度网络能多层串联的理论基础。

分配律同样成立:A(B+C)=AB+AC\mathbf{A}(\mathbf{B}+\mathbf{C}) = \mathbf{AB}+\mathbf{AC}(A+B)C=AC+BC(\mathbf{A}+\mathbf{B})\mathbf{C} = \mathbf{AC}+\mathbf{BC}——变换可以「先合并再作用」,也可以「分别作用再相加」,两者等价。结合律管的是嵌套(怎么分组),分配律管的是并联(怎么拆分),两者共同构成矩阵代数的运算骨架。

跨领域应用:深度网络的前向传播就是矩阵连乘的复合——第 L 层输出 = WLW2W1xW_L \cdots W_2 W_1 x,从右往左作用对应数据从输入层逐层流向输出层。Transformer 的注意力机制 softmax(QK/dk)V\text{softmax}(QK^\top / \sqrt{d_k})V 整体也是矩阵乘法串联,GPU 做的正是这些大规模矩阵运算。(→ 七节·案例一)

六、几个关键特殊矩阵

有几类矩阵因为结构特殊、性质特别好,在理论和计算里反复出现。下面仍按「它代表什么变换」来理解它们。

七、跨领域应用案例

以下两个案例来自两个不同领域,展示矩阵变换在真实系统中的直接应用。


案例一:AI / 深度学习 — 神经网络的前向传播

背景:给网络一张 28×28 的手写数字图片,让它判断写的是 0–9 中哪个数字。全连接网络的核心计算是 z=Wx+bz = Wx + b

3.3 节说过:WW 的每一行是一个探测器,zi=wixz_i = \mathbf{w}_i^\top \mathbf{x} 衡量输入与该探测器的匹配程度。在神经网络里,这些探测器不是手工设定的,而是从训练数据中学出来的——训练过程就是在寻找「对识别数字最有用的那组探测器」。学成之后,WW 的每一行就固化成一个特征模板:权重值编码了「关注哪些像素、忽略哪些像素」。比如某一行学到的权重在图片顶部几个像素位置取较大正值,其余为零或负——它就是「顶部横线检测器」,输入「7」时响应强烈,输入「1」时几乎无响应。另一行可能是「右侧竖线检测器」,还有的可能捕捉左下角的弧度。WxW\mathbf{x} 一次输出 mm 个得分,就是 mm 个模板各自测量的结果。多层串联就把笔画、边缘这些低级特征组合成完整的数字形状。

下面用 MNIST 标准尺寸还原完整流程。

以「顶部横线检测器」为例:数字「7」顶行有笔画经过,内积得分高;数字「1」的笔画只在中间一列,与顶行几乎无重叠,得分接近零。反过来,「中心竖线检测器」对「1」得分远高于「7」——「7」的笔画从右上往左下走,与中心列重叠很少。z=Wx\mathbf{z} = W\mathbf{x} 输出的得分向量就像每个数字的「指纹」,分类器据此区分不同数字。实际网络第一层有 256 个探测器(W1W_1 的 256 行),远不止三个,但原理相同。

数值演算:手写数字「7」的前向传播

输入:把 28×28 灰度图按行拉平,得到 xR784×1\mathbf{x} \in \mathbb{R}^{784 \times 1}

第一层(特征提取):W1W_1256×784256 \times 784 的权重矩阵。计算

z1=W1x+b1R256\mathbf{z}_1 = W_1 \mathbf{x} + \mathbf{b}_1 \in \mathbb{R}^{256}

W1W_1 的 256 行就是 256 个探测器(3.3 节),各自识别不同笔画模式。经 ReLU 激活后,256 维向量就是这张图片的「特征指纹」。

第二层(分类打分):W2W_210×25610 \times 256 的权重矩阵。计算

z2=W2ReLU(z1)+b2R10\mathbf{z}_2 = W_2 \,\text{ReLU}(\mathbf{z}_1) + \mathbf{b}_2 \in \mathbb{R}^{10}

10 行对应 0–9 十个类别,输出各数字的置信度得分。

预测argmax(z2)\arg\max(\mathbf{z}_2) 取得分最高的类别。若第 7 个分量最大 → 预测「7」。

维度变换链:784W1256W210784 \xrightarrow{W_1} 256 \xrightarrow{W_2} 10

进阶:为什么需要非线性激活?

5.2 节提到,结合律 (AB)C=A(BC)(\mathbf{AB})\mathbf{C} = \mathbf{A}(\mathbf{BC}) 是深度网络多层串联的理论基础。但反过来想:如果只有矩阵乘法、没有非线性,会怎样?

z2=W2(W1x)=(W2W1)x=Weqx\mathbf{z}_2 = W_2(W_1 \mathbf{x}) = (W_2 W_1)\mathbf{x} = W_{\text{eq}}\mathbf{x}

两层矩阵乘法的乘积 W2W1W_2 W_1 仍然是一个矩阵——无论叠多少层,都等价于单层线性变换,网络无法学到非线性关系。

解决方法是在每层矩阵乘法之后加一个非线性激活函数,最常用的是 ReLU:ReLU(z)=max(0,z)\text{ReLU}(z) = \max(0, z)。完整的一层计算变为:

a1=ReLU(W1x+b1)\mathbf{a}_1 = \text{ReLU}(W_1 \mathbf{x} + \mathbf{b}_1)

ReLU 把负值截为 0——这个简单操作打破了线性叠加的封闭性,使多层网络能逼近任意连续函数(万能近似定理)。真正的深度网络计算是:

xW1,ReLUa1W2,ReLUa2W3输出\mathbf{x} \xrightarrow{W_1,\,\text{ReLU}} \mathbf{a}_1 \xrightarrow{W_2,\,\text{ReLU}} \mathbf{a}_2 \xrightarrow{W_3} \text{输出}

矩阵乘法负责线性组合,激活函数负责引入非线性——两者交替,构成深度学习的核心计算。

小结:矩阵乘法把高维原始数据逐层压缩为有意义的低维表示,最终输出对每个类别的置信度得分。神经网络学习的本质,就是找到最有用的线性组合方向——训练出权重矩阵 WW 的每一行。


案例二:游戏引擎 — 为什么变换顺序不能乱

1. 案例:变换顺序的后果

背景:3D 游戏引擎(Unity、Unreal)对每个物体固定按「缩放→旋转→平移」顺序执行,并且写死在引擎里。为什么不能调换?以下用 2D 场景还原这个问题。

场景:角色手持一把剑,初始竖直朝上,剑尖在 (0,2)(0, 2)。目标:将剑拉长到 3 倍、再旋转 45° 斜持。

缩放矩阵 S=(1003)\mathbf{S} = \begin{pmatrix}1 & 0 \\ 0 & 3\end{pmatrix}(纵向×3),旋转矩阵 R(0.710.710.710.71)\mathbf{R} \approx \begin{pmatrix}0.71 & -0.71 \\ 0.71 & 0.71\end{pmatrix}(45°)

方案 A(先缩放 S,再旋转 R,整体矩阵 RS)——正确

S(02)=(06)\mathbf{S} \cdot \begin{pmatrix}0\\2\end{pmatrix} = \begin{pmatrix}0\\6\end{pmatrix}——剑变为 6 单位长,仍竖直

R(06)(4.244.24)\mathbf{R} \cdot \begin{pmatrix}0\\6\end{pmatrix} \approx \begin{pmatrix}-4.24\\4.24\end{pmatrix}——整把长剑斜持

剑长 =4.242+4.242=6= \sqrt{4.24^2+4.24^2} = 6 ✓ 形状完整,只是方向改变。

方案 B(先旋转 R,再缩放 S,整体矩阵 SR)——错误

R(02)(1.411.41)\mathbf{R} \cdot \begin{pmatrix}0\\2\end{pmatrix} \approx \begin{pmatrix}-1.41\\1.41\end{pmatrix}——剑已倾斜,仍 2 单位长

S(1.411.41)=(1.414.24)\mathbf{S} \cdot \begin{pmatrix}-1.41\\1.41\end{pmatrix} = \begin{pmatrix}-1.41\\4.24\end{pmatrix}——只拉伸了世界坐标 y 轴分量,x 分量原封不动

剑长 =1.412+4.2424.56= \sqrt{1.41^2+4.24^2} \approx 4.5 \neq 6,且剑被拉歪——这不是「长剑斜持」,而是剑的形状变形了。

方案 B 的根本问题:「先旋转后缩放」让缩放作用在世界坐标轴上,而非物体的本地轴上。剑已倾斜 45°之后,S 还是沿世界 y 轴拉,自然把斜剑拉成了形状错误的东西。

小结:游戏引擎固定「先缩放后旋转」(TRS 中的 S→R),就是为了确保缩放在物体本地坐标系内完成,旋转再把整体搞到目标朝向——符合「先把剑磨长,再斜着拿」的直觉。顺序调换,资产必然变形。

2. 进阶:构造正确矩阵的两种方法

案例二回答的是「顺序错误会怎样」;这里回答另一个问题:若确实需要「沿旋转后的方向拉伸」,有两种等价方法构造正确的 M。

方法一:换基法 M=RSRM = \mathbf{R}\mathbf{S}\mathbf{R}^\top

S 只能沿世界 y 轴拉伸。利用正交矩阵 R1=R\mathbf{R}^{-1} = \mathbf{R}^\top 这一性质,可先把剑「转回」竖直(乘 R\mathbf{R}^\top),再用 S 拉伸,最后用 R 转回 45°——三步合一,等效于沿剑的本地轴拉伸。

M=RSR=(0.710.710.710.71)(1003)(0.710.710.710.71)=(2112)M = \mathbf{R}\mathbf{S}\mathbf{R}^\top = \begin{pmatrix}0.71&-0.71\\0.71&0.71\end{pmatrix}\begin{pmatrix}1&0\\0&3\end{pmatrix}\begin{pmatrix}0.71&0.71\\-0.71&0.71\end{pmatrix} = \begin{pmatrix}2&-1\\-1&2\end{pmatrix}

方法二:投影公式 M=I+(k1)u^u^M = I + (k-1)\hat{u}\hat{u}^\top

不需要知道目标方向由哪些旋转组成,直接用方向向量 u^\hat{u} 和倍数 k 构造(推导见下方)。

M=I+2(0.50.50.50.5)=(2112)M = I + 2\begin{pmatrix}0.5&-0.5\\-0.5&0.5\end{pmatrix} = \begin{pmatrix}2&-1\\-1&2\end{pmatrix}

两种方法给出同一矩阵。验证:(2112)(1.411.41)=(4.244.24)\begin{pmatrix}2&-1\\-1&2\end{pmatrix}\begin{pmatrix}-1.41\\1.41\end{pmatrix} = \begin{pmatrix}-4.24\\4.24\end{pmatrix} ✓ 剑长 = 6,方向正确。

方法一需要知道目标方向是由哪个 R 产生的;方法二只要知道 u^\hat{u} 和 k,更通用。

3. 数学推导:投影公式 M=I+(k1)u^u^M = I + (k-1)\hat{u}\hat{u}^\top

目标:构造矩阵 MM,使 MxM\mathbf{x} 沿 u^\hat{u} 拉伸 kk 倍,垂直方向不变。

1. 投影

根据2.3,x\mathbf{x}u^\hat{u} 上的投影为(u^u^)x(\hat{u}\hat{u}^\top)\,\mathbf{x}

**2. 分解 **x\mathbf{x}

x=u^u^xu^+(Iu^u^)xu^\mathbf{x} = \underbrace{\hat{u}\hat{u}^\top\mathbf{x}}_{\parallel\,\hat{u}} + \underbrace{(I-\hat{u}\hat{u}^\top)\mathbf{x}}_{\perp\,\hat{u}}

验证:u^u^x+(Iu^u^)x=x\hat{u}\hat{u}^\top\mathbf{x} + (I-\hat{u}\hat{u}^\top)\mathbf{x} = \mathbf{x}

**3. 构造 **MM

x 已拆成两个正交部分,分别处理:

Mx=k(u^u^x)+1(Iu^u^)xM\mathbf{x} = k\,(\hat{u}\hat{u}^\top\mathbf{x}) + 1\cdot(I-\hat{u}\hat{u}^\top)\mathbf{x}

=ku^u^x+xu^u^x= k\hat{u}\hat{u}^\top\mathbf{x} + \mathbf{x} - \hat{u}\hat{u}^\top\mathbf{x}

=x+(k1)u^u^x= \mathbf{x} + (k-1)\hat{u}\hat{u}^\top\mathbf{x}

=[I+(k1)u^u^]x= \bigl[I+(k-1)\hat{u}\hat{u}^\top\bigr]\mathbf{x}

M=I+(k1)u^u^\therefore\quad M = I + (k-1)\hat{u}\hat{u}^\top

八、小结

概念一句话理解
矩阵一个线性变换(动作)
矩阵 × 向量列视角:新基下的坐标组合;行视角:各方向上的投影读数;二者展开后逐分量完全一致
矩阵乘法列视角:逐列变换,拼回完整矩阵;行视角:逐行扫描,每行独立产出;行列交叉 = 内积排表
不可交换动作顺序不同结果不同
单位矩阵什么都不做

下一节:变换能不能「撤销」?什么时候方程有唯一解?这就引出线性方程组、行列式与逆