AI 数学课程 · 第 35 课,共 180

矩阵表示线性映射

了解变换后的基向量为何成为矩阵的列,如何根据基向量的响应重建映射,以及如何避免模型权重中的行列方向错误。

分享这篇文章

一个模型公开了线性投影,却隐藏了它的权重矩阵。能否用几个精心挑选的输入揭示整个变换?可以:输入坐标基向量并记录输出。这些响应恰好就是矩阵的各列,而线性性告诉我们如何组合它们来得到其他任意输入的输出。

学完本文后,你将能够根据映射对基向量的响应推导矩阵,根据输入坐标重建输出,并理解库中权重的排列方式与列向量约定之间的关系。

学习成果: 根据变换后的基向量推导映射矩阵。

第 19 课介绍了矩阵如何通过对各列进行加权求和来乘以输入。第 34 课说明了线性映射会保持线性组合。官方Mathematics for Machine Learning第 2.7 节将这些想法联系起来:选定一组基后,映射就由它对基向量的作用决定。下文的推导、投影示例、图示和问题均为原创内容。

矩阵的每一列记录一个基向量的响应

在 Rn\mathbb{R}^n 中,标准基向量为 e1=(1,0,…,0)e_1=(1,0,\ldots,0)、e2=(0,1,…,0)e_2=(0,1,\ldots,0),依此类推。任意输入 x=(x1,…,xn)x=(x_1,\ldots,x_n) 都可以由它们构成:

x=x1e1+x2e2+⋯+xnen.x=x_1e_1+x_2e_2+\cdots+x_ne_n.

设 T:Rn→RmT:\mathbb{R}^n\to\mathbb{R}^m 是线性映射。由于它保持求和和数乘,因此必有

T(x)=x1T(e1)+x2T(e2)+⋯+xnT(en).T(x)=x_1T(e_1)+x_2T(e_2)+\cdots+x_nT(e_n).

输出 T(ej)T(e_j) 都是 Rm\mathbb{R}^m 中的向量。把每个输出放入一列,就得到一个 m×nm\times n 矩阵:

这种构造适用于任意有限维空间:nn 个输入坐标对应 nn 列;每个响应有 mm 个输出坐标,因此贡献 mm 行。对任意有序输入基 B=(b1,…,bn)B=(b_1,\ldots,b_n) 和输出基 C=(c1,…,cm)C=(c_1,\ldots,c_m),也可以采用同样的思路。将每个输入基向量的响应写成输出坐标:

T(bj)=a1jc1+⋯+amjcm.T(b_j)=a_{1j}c_1+\cdots+a_{mj}c_m.

这些系数构成变换矩阵 AC←BA_{C\leftarrow B} 的第 jj 列:

AC←B=[[T(b1)]C⋯[T(bn)]C].A_{C\leftarrow B}=\begin{bmatrix}[T(b_1)]_C&\cdots&[T(b_n)]_C\end{bmatrix}.

若 [x]B[x]_B 是 xx 在基 BB 下的坐标向量,则 [T(x)]C=AC←B[x]B[T(x)]_C=A_{C\leftarrow B}[x]_B。因此,矩阵取决于所选的坐标系,而底层映射 TT 本身不变。

两个基向量的响应决定整个二维变换输入网格根据基向量箭头的像发生形变。每个单位方格都会映射成一个平行四边形。
从基向量到矩阵列左侧是标准基 e1=(1, 0) 和 e2=(0, 1),它们在原点周围构成由单位正方形组成的网格。右侧的矩阵以 (2, 1) 和 (1, 1) 为列,将基向量箭头映射到这些坐标,并把每个网格单元映射成平行四边形。除非用户请求减少动态效果,否则网格动画只播放一次。输入基映射后的基e₁e₂
  • T(e₁) = (2, 1) — 第 1 列
  • T(e₂) = (1, 1) — 第 2 列

因此 A 为2  11  1. 任意输入x = (x1,x2) maps tox1(2, 1) + x2(1, 1).

图示采用 T(e1)=(2,1)T(e_1)=(2,1) 和 T(e2)=(1,1)T(e_2)=(1,1)。每个输入箭头都成为矩阵的一列,单位正方形则变成由这两列张成的平行四边形。变换也可以写成 A=[2111]A=\begin{bmatrix}2&1\\1&1\end{bmatrix},因此即使没有动画或颜色,结论仍然清晰。

根据两个响应还原映射规则

假设一个线性映射将两个标准基向量映射为

顺序很重要:如果把响应调换,矩阵的列也会调换,表示的映射随之改变。行则回答另一个问题:每一行列出一个输出坐标如何组合所有输入坐标。

用 NumPy 探查学得的投影

只要能向线性投影输入指定值,而且它确实是线性的,即使无法直接访问权重,也可以用同样的思路检查它。假设三个基向量输入分别产生 (1,2)(1,2)、(−2,1)(-2,1) 和 (0,3)(0,3)。这些坐标是 R2\mathbb{R}^2 中的输出,因此还原出的映射把三个输入特征映射到两个输出特征。NumPy 的 column_stack 会把一维响应放入矩阵的各列(NumPy 文档):

import numpy as np

responses = [
    np.array([1.0, 2.0]),
    np.array([-2.0, 1.0]),
    np.array([0.0, 3.0]),
]
A = np.column_stack(responses)  # shape (2 outputs, 3 inputs)
x = np.array([2.0, -1.0, 1.0])

print(A)
# [[ 1. -2.  0.]
#  [ 2.  1.  3.]]
print(A @ x)
# [4. 6.]

输出为 2(1,2)−(−2,1)+(0,3)=(4,6)2(1,2)-(-2,1)+(0,3)=(4,6)。对于按列存储的输入批次,应在左侧乘以 AA;如果样本按行存储,同一运算可写成在右侧乘以转置矩阵。

读取神经网络参数时,这种方向约定很有用。PyTorch 的 torch.nn.Linear 以 (out_features, in_features) 形状存储权重,并将按行存储的一批输入应用为 XWT+bXW^\mathsf{T}+b(PyTorch 文档)。当 bias=False 时,权重张量 WW 就是列向量方程 T(x)=AxT(x)=Ax 中的同一个矩阵 AA。如果启用了偏置,该模块实际计算 Ax+bAx+b:要把基向量输出作为列,需先减去零输入的响应 bb。如果层后面接了激活函数等非线性操作,整个映射就不再是线性的,因此仅凭该层的基向量响应无法确定每个输入的行为。

只有在线性映射中,基向量响应才足以重建映射

重建需要两个条件:基向量能够把每个输入表示为加权和;线性性则让映射把这些权重传递到求和中。两者结合,既说明矩阵为何能复现 TT,也说明为什么不存在另一个矩阵,既匹配所有相同的基向量响应,又对某个输入产生不同输出。

如果某个系统返回了每个输入基向量的 T(ej)T(e_j),这些响应就确定了它的矩阵。但测试这些输入并不能证明未知系统是线性的。例如,一个非线性系统可以匹配相同的基向量响应,却在 e1+e2e_1+e_2 处表现不同。留出一个线性组合进行测试可以检验这个假设:比较 T(e1+e2)T(e_1+e_2) 与 T(e1)+T(e2)T(e_1)+T(e_2)。下一课将借助矩阵继续探讨:哪些输入方向会消失,以及映射能够到达哪些输出。

检查理解情况

Question 1

一个线性映射将 e₁ 映射为 (4, −1),将 e₂ 映射为 (2, 3)。写出它在标准坐标下的矩阵,并指出输入和输出维数。

Show the step-by-step solution

两个输入向量构成 R2\mathbb{R}^2 的标准基,因此矩阵有两列。每个输出有两个坐标,因此矩阵有两行。把第一个响应放在第一列,第二个响应放在第二列:

A=[42−13].A=\begin{bmatrix}4&2\\-1&3\end{bmatrix}.

所以这个映射是 T:R2→R2T:\mathbb{R}^2\to\mathbb{R}^2。

Question 2

使用例题中的映射,根据它对基向量的响应计算 T(1, 2)。说明坐标如何决定线性组合。

Show the step-by-step solution

输入分解为 (1,2)=1e1+2e2(1,2)=1e_1+2e_2。根据线性性,系数作用于输出:

T(1,2)=T(e1)+2T(e2)=(3,1)+2(−1,2)=(3,1)+(−2,4)=(1,5).T(1,2)=T(e_1)+2T(e_2) =(3,1)+2(-1,2) =(3,1)+(-2,4) =(1,5).

用矩阵进行相同的验证: [3−112][12]=[15]\begin{bmatrix}3&-1\\1&2\end{bmatrix}\begin{bmatrix}1\\2\end{bmatrix} =\begin{bmatrix}1\\5\end{bmatrix}。

Question 3

一个从 ℝ³ 到 ℝ² 的映射将 e₁ 映射为 (1, 0)、将 e₂ 映射为 (0, 2)、将 e₃ 映射为 (−1, 1)。构造它的矩阵,并计算 (2, −1, 3) 的像。

Show the step-by-step solution

输入基向量有三个,因此把它们的响应放入三列:

A=[10−1021].A=\begin{bmatrix}1&0&-1\\0&2&1\end{bmatrix}.

将矩阵应用于输入,或按输入坐标组合这些响应:

T(2,−1,3)=2(1,0)−1(0,2)+3(−1,1)=(2,0)+(0,−2)+(−3,3)=(−1,1).T(2,-1,3)=2(1,0)-1(0,2)+3(-1,1) =(2,0)+(0,-2)+(-3,3)=(-1,1).

输出有两个坐标,这与映射的目标空间 R2\mathbb{R}^2 一致。

Question 4

响应 T(e₁) = (2, 1) 和 T(e₂) = (−1, 3) 被当作行而非列放入矩阵。得到的矩阵是什么?它作用于 (1, 0) 时会产生什么结果?

Show the step-by-step solution

将给定响应放为行,得到 B=[21−13]B=\begin{bmatrix}2&1\\-1&3\end{bmatrix}。乘以 (1,0)(1,0) 会选出第一列,因此 B(1,0)=(2,−1)B(1,0)=(2,-1)。实际响应应为 T(e1)=(2,1)T(e_1)=(2,1),两者不同。把输出放入行改变了映射;一般规则是将 T(ej)T(e_j) 放在第 jj 列。

Question 5

一个投影模块返回 f(0) = (5, −2)、f(e₁) = (7, 1) 和 f(e₂) = (4, 0)。若它是仿射映射,求出它的线性矩阵部分和偏置向量。

Show the step-by-step solution

对于仿射映射 f(x)=Ax+bf(x)=Ax+b,零输入的输出就是 f(0)=bf(0)=b,因此 b=(5,−2)b=(5,-2)。第一个线性响应是从第一个基向量的输出减去偏置:f(e1)−b=(7,1)−(5,−2)=(2,3)f(e_1)-b=(7,1)-(5,-2)=(2,3)。同理,f(e2)−b=(4,0)−(5,−2)=(−1,2)f(e_2)-b=(4,0)-(5,-2)=(-1,2)。将修正后的响应放入各列:

A=[2−132],b=[5−2].A=\begin{bmatrix}2&-1\\3&2\end{bmatrix},\qquad b=\begin{bmatrix}5\\-2\end{bmatrix}.

Question 6

当 T 是线性映射时,为什么标准基向量的响应能够确定任意 x 的 T(x)?请说明结论成立所依赖的假设。

Show the step-by-step solution

任意 x=(x1,…,xn)x=(x_1,\ldots,x_n) 都可以分解为 x=∑j=1nxjejx=\sum_{j=1}^n x_j e_j。根据线性性,T(x)=T(∑jxjej)=∑jxjT(ej)T(x)=T(\sum_j x_j e_j)=\sum_j x_jT(e_j)。因此,记录下来的基向量响应提供了计算任意输出所需的每一项。结论依赖于 TT 保持求和和数乘;若没有线性性,其他输入即使基向量响应相同,也可能表现不同。

Question 7

一个黑盒函数在所有标准基向量上的输出都与某个线性映射一致。这能否证明该函数是线性的?请给出二维空间中的一个额外测试。

Show the step-by-step solution

不能。有限个响应一致,并不能排除其他位置的非线性行为。在二维空间中,可以测试 e1+e2e_1+e_2 这样的输入组合:线性性要求 T(e1+e2)=T(e1)+T(e2)T(e_1+e_2)=T(e_1)+T(e_2)。若结果不一致,就能否定线性性。若一致,这对该组合是有用的证据,但单凭这一点不能证明所有可能输入都遵循同一规则。

资料来源

  1. Mathematics for Machine Learning book PDF, Section 2.7
  2. NumPy documentation: numpy.column_stack
  3. PyTorch documentation: torch.nn.Linear