跳转至

第 2 章:线性代数(Linear Algebra)

本章导言:为什么在讲深度学习之前先讲线性代数

作者开宗明义地指出:线性代数是数学的一个分支,在科学与工程领域有广泛应用。然而,线性代数属于连续数学而非离散数学,许多计算机科学家对此并不熟悉。良好的线性代数基础对于理解与使用许多机器学习算法(特别是深度学习算法)至关重要,因此作者在介绍深度学习之前,先以聚焦的方式呈现后续所必需的关键线性代数先修知识。

作者为不同背景的读者给出了阅读建议:若读者已经熟悉线性代数,可自由跳过本章;若对相关概念有经验但需要一份详细的参考手册来回顾关键公式,推荐 Petersen and Pedersen (2006) 的 The Matrix Cookbook;若读者对线性代数完全没有接触过,本章将提供足够用来阅读本书的内容,但作者强烈建议同时参考另一份专门讲授线性代数的资源,例如 Shilov (1977)。本章将完全略去对理解深度学习并非必要的诸多重要线性代数议题——这是一个明确的目标裁剪声明,读者不应期待这里成为线性代数的完整教程。

2.1 标量、向量、矩阵与张量(Scalars, Vectors, Matrices and Tensors)

线性代数研究涉及多种数学对象,作者逐一给出定义。

标量(scalar) 是一个单独的数,与线性代数中通常研究的、由多个数组成的数组形成对照。标量用斜体书写,变量名一般采用小写。引入时需明确其数的种类,例如"令 \(s \in \mathbb{R}\) 表示该直线的斜率"(实数标量),或"令 \(n \in \mathbb{N}\) 表示单元的数量"(自然数标量)。

向量(vector) 是按顺序排列的数的一维数组。可以借由其在排序中的下标识别每个单独的数。向量通常以加粗的小写字母命名,例如 \(\mathbf{x}\)。向量的元素以斜体加下标标识:\(\mathbf{x}\) 的第一个元素是 \(x_1\),第二个元素是 \(x_2\),依此类推。还需说明向量中存储的数属于哪一类集合:若每个元素都在 \(\mathbb{R}\) 中且向量共有 \(n\) 个元素,则该向量属于 \(\mathbb{R}\)\(n\) 次笛卡尔积,记作 \(\mathbb{R}^n\)。当需要显式给出向量元素时,写成方括号内一列的形式:

\[ \mathbf{x} = \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{bmatrix}. \]

向量可被视为空间中的点,每个元素给出沿不同轴的坐标。

有时需要索引向量元素的某个子集:定义一个包含下标的集合并把它作为下标写出。例如,要访问 \(x_1, x_3, x_6\),定义 \(S = \{1, 3, 6\}\),写作 \(x_S\)。作者用 \(-\) 号索引一个集合的补集:例如 \(x_{-1}\)\(\mathbf{x}\) 中除 \(x_1\) 外的所有元素组成的向量,\(x_{-S}\)\(\mathbf{x}\) 中除 \(x_1, x_3, x_6\) 之外的所有元素组成的向量。

矩阵(matrix) 是二维的数数组,每个元素由两个下标(而不是一个)标识。矩阵通常以加粗的大写字母命名,例如 \(\mathbf{A}\)。若一个实值矩阵 \(\mathbf{A}\) 的高为 \(m\)、宽为 \(n\),则称 \(\mathbf{A} \in \mathbb{R}^{m \times n}\)。矩阵元素以斜体非加粗的字母配合逗号分隔的下标标识:\(A_{1,1}\)\(\mathbf{A}\) 的左上元素,\(A_{m,n}\) 是右下元素。可以用冒号占据其中一个坐标来访问一行或一列:\(A_{i,:}\) 表示垂直坐标为 \(i\) 的水平横截面,称为 \(\mathbf{A}\) 的第 \(i\) 行;类似地,\(A_{:,i}\) 是第 \(i\) 列。当矩阵需要显式写出元素时,使用方括号包裹的二维数组形式。有时需要索引矩阵值表达式而非单个字母的某些元素:在这种情况下表达式后写下标而不改为小写,例如 \(f(\mathbf{A})_{i,j}\) 表示对 \(\mathbf{A}\) 应用函数 \(f\) 后所得矩阵的 \((i,j)\) 元素。

张量(tensor) 在一些情形下需要一个具有两个以上轴的数组。在一般情形下,按规则网格排列的、具有可变数量轴的数数组称为张量。命名为 "A" 的张量记作 \(\mathsf{A}\)(专门字体),其位于坐标 \((i, j, k)\) 的元素记为 \(A_{i, j, k}\)

矩阵上一个重要运算是转置(transpose)。转置的直观含义是:把矩阵沿主对角线(一条从左上角起、向右下方延伸的对角线)作镜像翻转。转置记作 \(\mathbf{A}^\top\),形式化定义为

\[ (\mathbf{A}^\top)_{i, j} = A_{j, i}. \]

向量可以视为只含一列的矩阵,因此向量的转置是只含一行的矩阵。有时在正文行内以行矩阵形式写出向量元素,再用转置算子转成标准列向量,例如 \(\mathbf{x} = [x_1, x_2, x_3]^\top\)。标量可视为只有一个元素的矩阵,由此标量等于其自身的转置:\(a = a^\top\)

矩阵可以相加(要求形状相同),方法是对应元素相加:\(C = A + B\) 其中 \(C_{i, j} = A_{i, j} + B_{i, j}\)。标量与矩阵也可以相加或相乘,方法是对矩阵的每个元素施加该运算:\(D = a \cdot B + c\) 其中 \(D_{i, j} = a \cdot B_{i, j} + c\)

深度学习语境下使用一些不那么传统的记号。允许矩阵与向量相加并得到另一个矩阵:\(C = A + b\) 其中 \(C_{i, j} = A_{i, j} + b_j\)。换言之,向量 \(\mathbf{b}\) 被加到矩阵的每一行上。这种简写消除了"先把 \(\mathbf{b}\) 复制到每一行再做加法"的显式构造。这种把 \(\mathbf{b}\) 隐式复制到多个位置的做法称为广播(broadcasting)

2.2 矩阵与向量的乘法(Multiplying Matrices and Vectors)

矩阵乘法是最重要的矩阵运算之一。矩阵 \(\mathbf{A}\)\(\mathbf{B}\) 的矩阵积是第三个矩阵 \(\mathbf{C}\)。要使该乘积有定义,\(\mathbf{A}\) 的列数必须等于 \(\mathbf{B}\) 的行数。若 \(\mathbf{A}\) 的形状为 \(m \times n\)\(\mathbf{B}\) 的形状为 \(n \times p\),则 \(\mathbf{C}\) 的形状为 \(m \times p\)。矩阵积可简单地以并置方式书写:

\[ \mathbf{C} = \mathbf{A}\mathbf{B}. \]

乘积运算定义为

\[ C_{i, j} = \sum_{k} A_{i, k} B_{k, j}. \]

注意,标准矩阵乘积并非"把两矩阵的对应元素相乘"的运算。这种对应元素相乘的运算确实存在,称为逐元素乘积Hadamard 乘积,记作 \(\mathbf{A} \odot \mathbf{B}\)

两个维度相同的向量 \(\mathbf{x}\)\(\mathbf{y}\) 之间的点积(dot product)即矩阵积 \(\mathbf{x}^\top \mathbf{y}\)。可以将矩阵积 \(\mathbf{C} = \mathbf{A}\mathbf{B}\) 理解为:\(C_{i, j}\)\(\mathbf{A}\) 的第 \(i\) 行与 \(\mathbf{B}\) 的第 \(j\) 列之间的点积。

矩阵乘积运算具有若干便于数学分析的有用性质。例如,矩阵乘法满足分配律:

\[ \mathbf{A}(\mathbf{B} + \mathbf{C}) = \mathbf{A}\mathbf{B} + \mathbf{A}\mathbf{C}. \]

也满足结合律:

\[ \mathbf{A}(\mathbf{B}\mathbf{C}) = (\mathbf{A}\mathbf{B})\mathbf{C}. \]

与标量乘法不同的是,矩阵乘法不满足交换律(条件 \(\mathbf{A}\mathbf{B} = \mathbf{B}\mathbf{A}\) 并不总成立)。然而两个向量的点积满足交换律:

\[ \mathbf{x}^\top \mathbf{y} = \mathbf{y}^\top \mathbf{x}. \]

矩阵乘积的转置具有简单形式:

\[ (\mathbf{A}\mathbf{B})^\top = \mathbf{B}^\top \mathbf{A}^\top. \]

借助此式可证明上面的点积交换律:因该乘积的值是一个标量,所以等于其自身的转置:

\[ \mathbf{x}^\top \mathbf{y} = (\mathbf{x}^\top \mathbf{y})^\top = \mathbf{y}^\top \mathbf{x}. \]

由于本书重点不在线性代数,作者并不在此罗列矩阵乘积的全部有用性质,但读者应意识到更多性质确实存在。掌握了上述线性代数记号后,就可写下一个线性方程组:

\[ \mathbf{A}\mathbf{x} = \mathbf{b} \]

其中 \(\mathbf{A} \in \mathbb{R}^{m \times n}\) 是已知矩阵,\(\mathbf{b} \in \mathbb{R}^m\) 是已知向量,\(\mathbf{x} \in \mathbb{R}^n\) 是我们希望求解的未知变量向量。\(\mathbf{x}\) 的每个元素 \(x_i\) 都是一个这样的未知变量。\(\mathbf{A}\) 的每一行与 \(\mathbf{b}\) 的每个元素共同给出另一个约束。可以把上式改写为

\[ \mathbf{A}_{1, :} \mathbf{x} = b_1, \]
\[ \mathbf{A}_{2, :} \mathbf{x} = b_2, \]
\[ \cdots \]
\[ \mathbf{A}_{m, :} \mathbf{x} = b_m, \]

或者更显式地写成

\[ A_{1,1} x_1 + A_{1,2} x_2 + \cdots + A_{1,n} x_n = b_1, \]
\[ A_{2,1} x_1 + A_{2,2} x_2 + \cdots + A_{2,n} x_n = b_2, \]
\[ \cdots \]
\[ A_{m,1} x_1 + A_{m,2} x_2 + \cdots + A_{m,n} x_n = b_m. \]

矩阵—向量乘积记号为此类形式的方程提供了更紧凑的表示。

2.3 单位矩阵与逆矩阵(Identity and Inverse Matrices)

线性代数提供了一种被称为矩阵求逆的强大工具,可以对许多 \(\mathbf{A}\) 的取值解析地求解前述线性方程组。描述矩阵求逆之前,需先定义单位矩阵的概念。单位矩阵是指与某向量相乘后不会改变该向量的矩阵。保持 \(n\) 维向量的单位矩阵记为 \(\mathbf{I}_n\)。形式化地,\(\mathbf{I}_n \in \mathbb{R}^{n \times n}\),且

\[ \forall \mathbf{x} \in \mathbb{R}^n, \quad \mathbf{I}_n \mathbf{x} = \mathbf{x}. \]

单位矩阵的结构简单:主对角线上的所有元素都是 \(1\),其他所有元素都是 \(0\)

\(\mathbf{A}\) 的矩阵逆记作 \(\mathbf{A}^{-1}\),定义为满足下式的矩阵

\[ \mathbf{A}^{-1} \mathbf{A} = \mathbf{I}_n. \]

由此可以通过以下步骤求解前述方程组:

\[ \mathbf{A}\mathbf{x} = \mathbf{b}, \]
\[ \mathbf{A}^{-1} \mathbf{A} \mathbf{x} = \mathbf{A}^{-1} \mathbf{b}, \]
\[ \mathbf{I}_n \mathbf{x} = \mathbf{A}^{-1} \mathbf{b}, \]
\[ \mathbf{x} = \mathbf{A}^{-1} \mathbf{b}. \]

当然,这一求解过程以 \(\mathbf{A}^{-1}\) 存在为前提。\(\mathbf{A}^{-1}\) 存在的条件将在下节讨论。

\(\mathbf{A}^{-1}\) 存在时,存在多种不同的算法可用闭式求出它。理论上,相同的逆矩阵可以重复用于对不同 \(\mathbf{b}\) 求解该方程。然而,\(\mathbf{A}^{-1}\) 主要作为理论工具使用,在大多数软件应用中不应真的去用它。原因是数字计算机只能以有限精度表示 \(\mathbf{A}^{-1}\),直接利用 \(\mathbf{b}\) 的算法通常能获得对 \(\mathbf{x}\) 更精确的估计。

2.4 线性相关与生成空间(Linear Dependence and Span)

为使 \(\mathbf{A}^{-1}\) 存在,前述方程对每个 \(\mathbf{b}\) 值都必须恰好有一个解。然而方程组对某些 \(\mathbf{b}\) 值也可能无解或有无穷多解。对特定的 \(\mathbf{b}\) 不可能存在"多于一个但少于无穷多个"的解:若 \(\mathbf{x}\)\(\mathbf{y}\) 都是解,那么

\[ \mathbf{z} = \alpha \mathbf{x} + (1 - \alpha) \mathbf{y} \]

对任意实数 \(\alpha\) 也是解。

为分析方程有多少解,可以把 \(\mathbf{A}\) 的各列视为从原点(全零向量所代表的点)出发可以行进的不同方向,看有多少种方式能够到达 \(\mathbf{b}\)。按此观点,\(\mathbf{x}\) 的每个元素指定在每个方向上行进的距离,其中 \(x_i\) 指定沿第 \(i\) 列方向行进的距离:

\[ \mathbf{A} \mathbf{x} = \sum_i x_i \mathbf{A}_{:, i}. \]

一般地,这类运算称为线性组合。形式化地,向量集合 \(\{ \mathbf{v}^{(1)}, \ldots, \mathbf{v}^{(n)} \}\) 的一组线性组合是给每个向量 \(\mathbf{v}^{(i)}\) 乘以一个相应的标量系数后求和:

\[ \sum_i c_i \mathbf{v}^{(i)}. \]

一组向量的生成空间(span)是经由这些向量的线性组合所能获得的全部点的集合。

由此,判断 \(\mathbf{A}\mathbf{x} = \mathbf{b}\) 是否有解等价于判断 \(\mathbf{b}\) 是否在 \(\mathbf{A}\) 列向量的生成空间之内。该生成空间特别地被称为 \(\mathbf{A}\)列空间(column space)值域(range)

为使方程 \(\mathbf{A}\mathbf{x} = \mathbf{b}\) 对所有 \(\mathbf{b} \in \mathbb{R}^m\) 都有解,要求 \(\mathbf{A}\) 的列空间等于整个 \(\mathbb{R}^m\)。若 \(\mathbb{R}^m\) 中有任何点不在列空间内,该点就是一个无解的 \(\mathbf{b}\)\(\mathbf{A}\) 的列空间等于整个 \(\mathbb{R}^m\) 这一要求立即蕴含 \(\mathbf{A}\) 至少需要 \(m\) 列,即 \(n \ge m\);否则列空间的维度将小于 \(m\)。例如,考虑一个 \(3 \times 2\) 矩阵:目标 \(\mathbf{b}\) 是 3 维的,但 \(\mathbf{x}\) 只有 2 维,因此改变 \(\mathbf{x}\) 的值最多只能在 \(\mathbb{R}^3\) 中描出一个 2 维平面;方程有解当且仅当 \(\mathbf{b}\) 落在这个平面上。

\(n \ge m\) 仅是"每个点都有解"的必要条件,并不是充分条件,因为可能存在某些列是冗余的。考虑一个 \(2 \times 2\) 矩阵,其两列相同:它的列空间与一个 \(2 \times 1\) 矩阵(只含一份该重复列)相同。换言之,列空间仍只是一条线,并不能覆盖整个 \(\mathbb{R}^2\),尽管矩阵有两列。

这种冗余在形式上称为线性相关。一个向量集合线性无关指集合中没有哪个向量可以由其他向量线性组合而成。若往集合中再添加一个本身就是其他向量线性组合的向量,则新向量没有为集合的生成空间增加任何点。因此,为使 \(\mathbf{A}\) 的列空间涵盖整个 \(\mathbb{R}^m\),矩阵必须至少包含 \(m\) 个线性无关的列。该条件对"方程对每个 \(\mathbf{b}\) 值都有解"既是必要也是充分的。值得注意:该要求是"恰好有 \(m\) 个线性无关的列",而不是"至少 \(m\) 个"。任何 \(m\) 维向量的集合都不可能具有多于 \(m\) 个互相线性无关的列,但列数多于 \(m\) 的矩阵可能拥有多个这样的线性无关列组。

为使矩阵有逆,还需保证方程对每个 \(\mathbf{b}\) 至多有一个解。为此需要矩阵至多有 \(m\) 列,否则对每个解存在多于一种参数化方式。

综合起来,矩阵必须是方阵,即 \(m = n\),且所有列都线性无关。列线性相关的方阵称为奇异(singular)

\(\mathbf{A}\) 不是方阵或是奇异方阵,仍可能解出方程,但不能使用矩阵求逆的方法来求解。

至此我们讨论的矩阵逆都是左乘的逆。也可以定义一个右乘的逆:

\[ \mathbf{A} \mathbf{A}^{-1} = \mathbf{I}. \]

对方阵而言,左逆与右逆相等。

2.5 范数(Norms)

有时需要衡量向量的大小。在机器学习中,通常用一种称为范数(norm) 的函数来度量向量的大小。形式化地,\(L^p\) 范数定义为

\[ \|\mathbf{x}\|_p = \left( \sum_i |x_i|^p \right)^{1/p} \]

其中 \(p \in \mathbb{R}, p \ge 1\)

范数(包括 \(L^p\) 范数)是将向量映射到非负值的函数。直观上,向量 \(\mathbf{x}\) 的范数量度从原点到点 \(\mathbf{x}\) 的距离。更严格地说,范数是满足下列性质的任意函数 \(f\)

  • \(f(\mathbf{x}) = 0 \Rightarrow \mathbf{x} = \mathbf{0}\)
  • \(f(\mathbf{x} + \mathbf{y}) \le f(\mathbf{x}) + f(\mathbf{y})\)(三角不等式);
  • \(\forall \alpha \in \mathbb{R}, \; f(\alpha \mathbf{x}) = |\alpha| f(\mathbf{x})\)

\(L^2\) 范数(\(p = 2\))称为欧几里得范数,就是从原点到 \(\mathbf{x}\) 所标识点的欧几里得距离。\(L^2\) 范数在机器学习中使用极频繁,常省略下标直接写作 \(\|\mathbf{x}\|\)。用 \(L_2\) 范数的平方(即 \(\mathbf{x}^\top \mathbf{x}\))来衡量向量大小也很常见。

平方 \(L^2\) 范数在数学与计算上比 \(L^2\) 范数本身更便利。例如,平方 \(L^2\) 范数对 \(\mathbf{x}\) 各元素的导数只依赖于对应元素本身,而 \(L^2\) 范数对 \(\mathbf{x}\) 各元素的导数则依赖于整个向量。在许多情境下平方 \(L^2\) 范数并不理想,因为它在原点附近增长极慢。在若干机器学习应用中,区分"恰好为零"与"小但非零"的元素很重要,此时应改用在各处增长速率相同且数学上仍简洁的函数:\(L^1\) 范数。\(L^1\) 范数可以简化为

\[ \|\mathbf{x}\|_1 = \sum_i |x_i|. \]

当"零与非零元素的区别"非常重要时,\(L^1\) 范数在机器学习中很常用。每当 \(\mathbf{x}\) 的某个元素从 \(0\) 移开 \(\epsilon\)\(L^1\) 范数就增加 \(\epsilon\)

有时也通过统计向量中非零元素的数量来衡量向量大小。一些作者称此函数为 "\(L^0\) 范数",但这是不正确的术语——向量中非零元素的个数并不是范数,因为把向量按 \(\alpha\) 缩放并不会改变非零元素的数量。\(L^1\) 范数常被用作非零元素个数的替代。

机器学习中另一个常见的范数是 \(L^\infty\) 范数,也称为最大范数。它简化为向量中绝对值最大的那个元素的绝对值:

\[ \|\mathbf{x}\|_\infty = \max_i |x_i|. \]

有时也需要衡量矩阵的大小。在深度学习中,最常用的做法是Frobenius 范数

\[ \|\mathbf{A}\|_F = \sqrt{\sum_{i, j} A_{i, j}^2}, \]

它类似于向量的 \(L^2\) 范数。

两个向量的点积可借助范数改写。具体地,

\[ \mathbf{x}^\top \mathbf{y} = \|\mathbf{x}\|_2 \|\mathbf{y}\|_2 \cos \theta \]

其中 \(\theta\)\(\mathbf{x}\)\(\mathbf{y}\) 之间的夹角。

2.6 特殊类型的矩阵与向量(Special Kinds of Matrices and Vectors)

有几类特殊矩阵与向量尤为常用。

对角矩阵 绝大多数元素为零,只在主对角线上有非零元素。形式化地,矩阵 \(\mathbf{D}\) 是对角的当且仅当对所有 \(i \ne j\) 都有 \(D_{i, j} = 0\)。前文已见过一个对角矩阵的例子——单位矩阵,其对角线元素全为 \(1\)。作者用 \(\mathrm{diag}(\mathbf{v})\) 表示一个主对角元素由向量 \(\mathbf{v}\) 的各元素给定的方阵对角矩阵。对角矩阵值得关注的部分原因在于:与对角矩阵相乘的计算效率极高。计算 \(\mathrm{diag}(\mathbf{v}) \mathbf{x}\) 只需将每个元素 \(x_i\) 乘以 \(v_i\);换言之,\(\mathrm{diag}(\mathbf{v}) \mathbf{x} = \mathbf{v} \odot \mathbf{x}\)。方阵对角矩阵的求逆也是高效的:逆存在的条件是每个对角元素非零,在这种情况下 \(\mathrm{diag}(\mathbf{v})^{-1} = \mathrm{diag}([1/v_1, \ldots, 1/v_n]^\top)\)。许多情况下,可以先以任意矩阵为对象推导一个非常通用的机器学习算法,再通过限制某些矩阵为对角矩阵来获得一个更廉价(但描述力也较弱)的算法。

对角矩阵不一定是方阵,可以构造一个长方形的对角矩阵。非方阵对角矩阵没有逆,但仍可廉价地相乘。对一个非方阵对角矩阵 \(\mathbf{D}\),乘积 \(\mathbf{D}\mathbf{x}\) 涉及对 \(\mathbf{x}\) 各元素的缩放,并在结果中拼接若干零(若 \(\mathbf{D}\) 比宽更高),或丢弃向量的最后若干元素(若 \(\mathbf{D}\) 比高更宽)。

对称矩阵 是等于其自身转置的任意矩阵:

\[ \mathbf{A} = \mathbf{A}^\top. \]

当矩阵元素由某个对两参数对称(即不依赖参数顺序)的函数产生时,对称矩阵经常出现。例如,若 \(\mathbf{A}\) 是一个距离度量矩阵,\(A_{i, j}\) 表示点 \(i\) 到点 \(j\) 的距离,则 \(A_{i, j} = A_{j, i}\),因为距离函数是对称的。

单位向量 是范数等于 \(1\) 的向量:

\[ \|\mathbf{x}\|_2 = 1. \]

向量 \(\mathbf{x}\) 与向量 \(\mathbf{y}\) 相互正交当且仅当 \(\mathbf{x}^\top \mathbf{y} = 0\)。若两向量范数都非零,则它们彼此成 90°。在 \(\mathbb{R}^n\) 中,至多 \(n\) 个向量可以互相正交且范数非零。若向量之间不仅两两正交而且范数都等于 \(1\),则称之为标准正交

正交矩阵 是行向量彼此标准正交、列向量也彼此标准正交的方阵:

\[ \mathbf{A}^\top \mathbf{A} = \mathbf{A} \mathbf{A}^\top = \mathbf{I}. \]

由此可得

\[ \mathbf{A}^{-1} = \mathbf{A}^\top, \]

正交矩阵受到关注的原因是其逆极容易计算。注意正交矩阵的精确定义:出乎直觉的是,其行不仅是正交的,而且是标准正交的;矩阵的行或列正交但非标准正交的情形没有专门术语。

2.7 特征分解(Eigendecomposition)

许多数学对象可以通过分解为组成部分,或找到某些与具体表示方式无关的普遍性质来更好地理解。

例如,整数可以分解为素因子。数字 12 的具体表示随十进制或二进制的不同而变化,但始终有 \(12 = 2 \times 2 \times 3\)。借由该表示可推出有用的性质,如 12 不被 5 整除,或 12 的任何整数倍都被 3 整除。

正如可以通过把整数分解为素因子来发现其内在性质,也可以用类似方式分解矩阵,从而揭示一些从"把矩阵视作元素数组"的视角看不明显的函数性质。

最广泛使用的一类矩阵分解称为特征分解(eigendecomposition),它将矩阵分解为一组特征向量与特征值。

方阵 \(\mathbf{A}\)特征向量是一个非零向量 \(\mathbf{v}\),使得与 \(\mathbf{A}\) 相乘只改变 \(\mathbf{v}\) 的尺度(即仅发生伸缩,不旋转):

\[ \mathbf{A} \mathbf{v} = \lambda \mathbf{v}. \]

标量 \(\lambda\) 称为与该特征向量对应的特征值。也可以找到满足 \(\mathbf{v}^\top \mathbf{A} = \lambda \mathbf{v}^\top\) 的左特征向量,但通常关心的是右特征向量。

\(\mathbf{v}\)\(\mathbf{A}\) 的特征向量,则对任何 \(s \in \mathbb{R}, s \ne 0\),缩放后的向量 \(s \mathbf{v}\) 也是 \(\mathbf{A}\) 的特征向量,且具有相同的特征值。出于这个原因,通常只寻找单位特征向量——特征向量的方向比绝对长度更本质。

假设矩阵 \(\mathbf{A}\)\(n\) 个线性无关的特征向量 \(\{ \mathbf{v}^{(1)}, \ldots, \mathbf{v}^{(n)} \}\),相应的特征值为 \(\{ \lambda_1, \ldots, \lambda_n \}\)。可以将所有特征向量拼接起来组成一个矩阵 \(\mathbf{V}\),每列一个特征向量:\(\mathbf{V} = [\mathbf{v}^{(1)}, \ldots, \mathbf{v}^{(n)}]\)。同样地,可以把特征值拼接成向量 \(\boldsymbol{\lambda} = [\lambda_1, \ldots, \lambda_n]^\top\)。于是 \(\mathbf{A}\) 的特征分解可以写为

\[ \mathbf{A} = \mathbf{V} \mathrm{diag}(\boldsymbol{\lambda}) \mathbf{V}^{-1}. \]

我们已经看到,构造具有特定特征值与特征向量的矩阵使我们能沿所期望的方向拉伸空间。然而通常希望把已有矩阵分解为它的特征值与特征向量。这样做有助于分析矩阵的某些性质,正如把整数分解为素因子有助于理解该整数的行为。

并非每个矩阵都可以分解为特征值与特征向量。某些情形下分解虽存在,但可能涉及复数而非实数。幸运的是,本书通常只需分解一类具有简单分解的特定矩阵。具体地,每个实对称矩阵都可以仅借助实值特征向量与特征值分解为以下形式

\[ \mathbf{A} = \mathbf{Q} \boldsymbol{\Lambda} \mathbf{Q}^\top, \]

其中 \(\mathbf{Q}\) 是由 \(\mathbf{A}\) 的特征向量组成的正交矩阵,\(\boldsymbol{\Lambda}\) 是对角矩阵。\(\Lambda_{i, i}\)\(\mathbf{Q}\)\(i\) 列所代表的特征向量相关联,记作 \(\mathbf{Q}_{:, i}\)。因 \(\mathbf{Q}\) 是正交矩阵,可以将 \(\mathbf{A}\) 视为在 \(\mathbf{v}^{(i)}\) 方向上按 \(\lambda_i\) 缩放空间——这与 2.6 节"正交矩阵使求逆变便宜"形成对比,正交矩阵在特征分解中的作用是"用单位正交基表示矩阵的伸缩方向"。

虽然任何实对称矩阵 \(\mathbf{A}\) 一定具有特征分解,但特征分解并不一定唯一。若有两个或更多特征向量共享相同的特征值,则其生成空间中任何一组正交向量也是具有该特征值的特征向量,可以等价地选择使用那些特征向量的 \(\mathbf{Q}\)。按惯例,通常将 \(\boldsymbol{\Lambda}\) 的元素按降序排列。依此惯例,特征分解仅在所有特征值互不相同时才是唯一的。

矩阵的特征分解揭示了关于矩阵的许多有用事实。矩阵是奇异的当且仅当其任一特征值为零。实对称矩阵的特征分解还可用于优化约束 \(\|\mathbf{x}\|_2 = 1\) 之下的二次型 \(f(\mathbf{x}) = \mathbf{x}^\top \mathbf{A} \mathbf{x}\)。每当 \(\mathbf{x}\) 等于 \(\mathbf{A}\) 的某个特征向量,\(f\) 取到对应特征值的值;约束域中 \(f\) 的最大值就是最大特征值,最小值就是最小特征值。

特征值全为正的矩阵称为正定(positive definite)。特征值全为正或零的矩阵称为半正定(positive semidefinite)。类似地,特征值全为负的矩阵称为负定(negative definite),特征值全为负或零的矩阵称为半负定(negative semidefinite)。半正定矩阵值得关注,因为它们保证 \(\forall \mathbf{x}, \mathbf{x}^\top \mathbf{A} \mathbf{x} \ge 0\);正定矩阵则进一步保证 \(\mathbf{x}^\top \mathbf{A} \mathbf{x} = 0 \Rightarrow \mathbf{x} = \mathbf{0}\)

2.8 奇异值分解(Singular Value Decomposition)

上一节中我们看到如何把矩阵分解为特征向量与特征值。奇异值分解(SVD) 提供了另一种矩阵分解方式,将其分解为奇异向量与奇异值。SVD 让我们得以发现与特征分解同类的一些信息,但 SVD 的适用性更广。每个实矩阵都有奇异值分解,但特征分解则不然。例如,若矩阵不是方阵,特征分解便没有定义,必须改用奇异值分解。

回顾特征分解:将矩阵 \(\mathbf{A}\) 分析为特征向量矩阵 \(\mathbf{V}\) 与特征值向量 \(\boldsymbol{\lambda}\),使得 \(\mathbf{A}\) 可重写为

\[ \mathbf{A} = \mathbf{V} \mathrm{diag}(\boldsymbol{\lambda}) \mathbf{V}^{-1}. \]

奇异值分解与之类似,但此时将 \(\mathbf{A}\) 写成三个矩阵的乘积:

\[ \mathbf{A} = \mathbf{U} \mathbf{D} \mathbf{V}^\top. \]

\(\mathbf{A}\) 是一个 \(m \times n\) 矩阵,则 \(\mathbf{U}\) 被定义为 \(m \times m\) 矩阵,\(\mathbf{D}\) 被定义为 \(m \times n\) 矩阵,\(\mathbf{V}\) 被定义为 \(n \times n\) 矩阵。这些矩阵各自具有特殊结构:\(\mathbf{U}\)\(\mathbf{V}\) 都定义为正交矩阵,\(\mathbf{D}\) 定义为对角矩阵。注意 \(\mathbf{D}\) 不一定为方阵——它的形状与 \(\mathbf{A}\) 一致。

\(\mathbf{D}\) 对角线上的元素称为矩阵 \(\mathbf{A}\)奇异值\(\mathbf{U}\) 的列称为左奇异向量\(\mathbf{V}\) 的列称为右奇异向量

可以借助 \(\mathbf{A}\) 的某些函数的特征分解来解读 \(\mathbf{A}\) 的奇异值分解。具体地,\(\mathbf{A}\) 的左奇异向量是 \(\mathbf{A} \mathbf{A}^\top\) 的特征向量;\(\mathbf{A}\) 的右奇异向量是 \(\mathbf{A}^\top \mathbf{A}\) 的特征向量。\(\mathbf{A}\) 的非零奇异值是 \(\mathbf{A}^\top \mathbf{A}\) 特征值的平方根;对 \(\mathbf{A} \mathbf{A}^\top\) 同样成立。

SVD 也许最有用的特性是它可以部分地把矩阵求逆推广到非方阵,这将在下一节看到。

2.9 Moore-Penrose 伪逆(The Moore-Penrose Pseudoinverse)

矩阵求逆对非方阵没有定义。假设希望构造一个矩阵 \(\mathbf{A}\) 的左逆 \(\mathbf{B}\),使得可以通过左乘两边求解线性方程

\[ \mathbf{A} \mathbf{x} = \mathbf{y}, \]

得到

\[ \mathbf{x} = \mathbf{B} \mathbf{y}. \]

依问题的结构,从 \(\mathbf{A}\)\(\mathbf{B}\) 的映射未必唯一。若 \(\mathbf{A}\) 的高大于宽(行数多于列数),则方程有可能无解——因为需要用一个低维的参数去拟合高维的 \(\mathbf{y}\),所有 \(\mathbf{y}\) 不一定都能被精确表示。若 \(\mathbf{A}\) 的宽大于高(列数多于行数),则方程可能有多个解——因为参数空间比约束空间更高维。

Moore-Penrose 伪逆 允许在这些情形下取得一些进展。\(\mathbf{A}\) 的伪逆定义为矩阵

\[ \mathbf{A}^+ = \lim_{\alpha \to 0} (\mathbf{A}^\top \mathbf{A} + \alpha \mathbf{I})^{-1} \mathbf{A}^\top. \]

实际计算伪逆的算法并不基于此定义,而是基于公式

\[ \mathbf{A}^+ = \mathbf{V} \mathbf{D}^+ \mathbf{U}^\top, \]

其中 \(\mathbf{U}, \mathbf{D}, \mathbf{V}\)\(\mathbf{A}\) 的奇异值分解,对角矩阵 \(\mathbf{D}\) 的伪逆 \(\mathbf{D}^+\) 由取其非零元素的倒数再对所得矩阵取转置得到。

伪逆在两类情形下分别给出"某种意义下最优"的解。当 \(\mathbf{A}\) 的列数多于行数时,用伪逆求解线性方程给出多个可能解中的特定一个。具体而言,它给出在所有可能解中欧几里得范数 \(\|\mathbf{x}\|_2\) 最小的那一个,即 \(\mathbf{x} = \mathbf{A}^+ \mathbf{y}\)。当 \(\mathbf{A}\) 的行数多于列数时,可能无解。在这种情况下,使用伪逆给出使 \(\mathbf{A}\mathbf{x}\) 在欧几里得范数 \(\|\mathbf{A}\mathbf{x} - \mathbf{y}\|_2\) 下尽可能接近 \(\mathbf{y}\)\(\mathbf{x}\)——即最小二乘意义下的最优近似解。

2.10 迹算子(The Trace Operator)

迹算子 给出一个矩阵对角元素之和:

\[ \mathrm{Tr}(\mathbf{A}) = \sum_i A_{i, i}. \]

迹算子有多种用途。某些若不借助求和记号就难以表达的运算,可以借助矩阵乘积与迹算子表达。例如,迹算子提供了矩阵 Frobenius 范数的另一种紧凑表达:

\[ \|\mathbf{A}\|_F = \sqrt{\mathrm{Tr}(\mathbf{A} \mathbf{A}^\top)}. \]

用迹算子书写表达式为利用多种有用的恒等式提供了可能。例如,迹算子关于转置不变:

\[ \mathrm{Tr}(\mathbf{A}) = \mathrm{Tr}(\mathbf{A}^\top). \]

由若干因子构成的方阵的迹,在"将最后一个因子移到首位"的操作下也不变,只要相关矩阵的形状允许所得乘积有定义:

\[ \mathrm{Tr}(\mathbf{A}\mathbf{B}\mathbf{C}) = \mathrm{Tr}(\mathbf{C}\mathbf{A}\mathbf{B}) = \mathrm{Tr}(\mathbf{B}\mathbf{C}\mathbf{A}), \]

或更一般地

\[ \mathrm{Tr}\left( \prod_{i=1}^{n} \mathbf{F}^{(i)} \right) = \mathrm{Tr}\left( \mathbf{F}^{(n)} \prod_{i=1}^{n-1} \mathbf{F}^{(i)} \right). \]

这一循环置换不变性即使所得乘积具有不同的形状也成立。例如,对 \(\mathbf{A} \in \mathbb{R}^{m \times n}\)\(\mathbf{B} \in \mathbb{R}^{n \times m}\)

\[ \mathrm{Tr}(\mathbf{A}\mathbf{B}) = \mathrm{Tr}(\mathbf{B}\mathbf{A}) \]

尽管 \(\mathbf{A}\mathbf{B} \in \mathbb{R}^{m \times m}\)\(\mathbf{B}\mathbf{A} \in \mathbb{R}^{n \times n}\)——两者形状不同但迹相等。这一性质使得在迹内做因子重排时不必担心形状匹配问题。

另一个值得记住的事实是,标量等于其自身的迹:\(a = \mathrm{Tr}(a)\)

2.11 行列式(The Determinant)

方阵的行列式 记为 \(\mathrm{det}(\mathbf{A})\),是将矩阵映射到实标量的函数。行列式等于矩阵所有特征值的乘积。行列式的绝对值可以视为矩阵乘法在多大程度上扩张或收缩空间的度量。若行列式为 \(0\),则空间至少在某一维度上被完全收缩,丢失所有体积。若行列式为 \(1\),则变换保持体积不变。

2.12 示例:主成分分析(Example: Principal Components Analysis)

一种简单的机器学习算法——主成分分析(PCA)——可以仅借助基础线性代数知识推导得出。

假设在 \(\mathbb{R}^n\) 中有 \(m\) 个点的集合 \(\{ \mathbf{x}^{(1)}, \ldots, \mathbf{x}^{(m)} \}\)。希望对这些点施加有损压缩:有损压缩意味着以占用更少内存的方式存储这些点,但可能损失一些精度,目标是以尽可能小的精度损失完成存储。

编码这些点的一种方式是表示其低维版本。对每个点 \(\mathbf{x}^{(i)} \in \mathbb{R}^n\),将找到相应的编码向量 \(\mathbf{c}^{(i)} \in \mathbb{R}^l\)。若 \(l\) 小于 \(n\),存储编码点比存储原始数据占用更少内存。目标是找到某种编码函数 \(f(\mathbf{x}) = \mathbf{c}\),以及给定编码后能产生重构输入的解码函数 \(\mathbf{x} \approx g(f(\mathbf{x}))\)

PCA 由所选择的解码函数定义。具体地,为使解码器非常简单,选择用矩阵乘法将编码映射回 \(\mathbb{R}^n\)。令 \(g(\mathbf{c}) = \mathbf{D}\mathbf{c}\),其中 \(\mathbf{D} \in \mathbb{R}^{n \times l}\) 是定义解码的矩阵。

为这个解码器计算最优编码可能是一个困难问题。为使编码问题简单,PCA 约束 \(\mathbf{D}\) 的列彼此正交(注意,若 \(l = n\),则 \(\mathbf{D}\) 严格来说才"是正交矩阵")。

按目前描述的问题,可以有多种解——因为若对所有点按比例缩小 \(c_i\),就可以增大 \(\mathbf{D}_{:, i}\) 的尺度。为给出唯一解,约束 \(\mathbf{D}\) 的所有列都有单位范数。

为把这一基本想法转化为可实现的算法,首先需要弄清楚如何为每个输入点 \(\mathbf{x}\) 生成最优编码点 \(\mathbf{c}^*\)。一种做法是最小化输入点 \(\mathbf{x}\) 与其重构 \(g(\mathbf{c}^*)\) 之间的距离。可以用范数衡量该距离。在主成分算法中,使用 \(L^2\) 范数:

\[ \mathbf{c}^* = \arg\min_{\mathbf{c}} \|\mathbf{x} - g(\mathbf{c})\|_2. \]

由于 \(L^2\) 范数非负且平方操作对非负参数单调递增,对 \(L^2\) 范数与其平方的最小化由相同的 \(\mathbf{c}\) 实现,因此可以改用平方 \(L^2\) 范数:

\[ \mathbf{c}^* = \arg\min_{\mathbf{c}} \|\mathbf{x} - g(\mathbf{c})\|_2^2. \]

被最小化的函数可化简为

\[ (\mathbf{x} - g(\mathbf{c}))^\top (\mathbf{x} - g(\mathbf{c})) \]

(由 \(L^2\) 范数的定义式 2.30)

\[ = \mathbf{x}^\top \mathbf{x} - \mathbf{x}^\top g(\mathbf{c}) - g(\mathbf{c})^\top \mathbf{x} + g(\mathbf{c})^\top g(\mathbf{c}) \]

(由分配律)

\[ = \mathbf{x}^\top \mathbf{x} - 2 \mathbf{x}^\top g(\mathbf{c}) + g(\mathbf{c})^\top g(\mathbf{c}) \]

(因为标量 \(g(\mathbf{c})^\top \mathbf{x}\) 等于其自身的转置)。

由于第一项不依赖于 \(\mathbf{c}\),可再次改写被最小化的函数,省略该项:

\[ \mathbf{c}^* = \arg\min_{\mathbf{c}} -2 \mathbf{x}^\top g(\mathbf{c}) + g(\mathbf{c})^\top g(\mathbf{c}). \]

为取得进一步进展,需代入 \(g(\mathbf{c})\) 的定义:

\[ \mathbf{c}^* = \arg\min_{\mathbf{c}} -2 \mathbf{x}^\top \mathbf{D}\mathbf{c} + \mathbf{c}^\top \mathbf{D}^\top \mathbf{D} \mathbf{c} \]
\[ = \arg\min_{\mathbf{c}} -2 \mathbf{x}^\top \mathbf{D} \mathbf{c} + \mathbf{c}^\top \mathbf{I}_l \mathbf{c} \]

(由 \(\mathbf{D}\) 上的正交与单位范数约束)

\[ = \arg\min_{\mathbf{c}} -2 \mathbf{x}^\top \mathbf{D} \mathbf{c} + \mathbf{c}^\top \mathbf{c}. \]

可以借助向量微积分求解该优化问题(若不知如何求解,参见 4.3 节):

\[ \nabla_{\mathbf{c}} (-2 \mathbf{x}^\top \mathbf{D} \mathbf{c} + \mathbf{c}^\top \mathbf{c}) = 0, \]
\[ -2 \mathbf{D}^\top \mathbf{x} + 2 \mathbf{c} = 0, \]
\[ \mathbf{c} = \mathbf{D}^\top \mathbf{x}. \]

这使算法高效:只需一个矩阵—向量运算即可最优地编码 \(\mathbf{x}\)。对向量进行编码时,应用编码函数

\[ f(\mathbf{x}) = \mathbf{D}^\top \mathbf{x}. \]

再借助一次矩阵乘法,可定义 PCA 的重构运算:

\[ \mathbf{r}(\mathbf{x}) = g(f(\mathbf{x})) = \mathbf{D} \mathbf{D}^\top \mathbf{x}. \]

接下来需要选择编码矩阵 \(\mathbf{D}\)。为做到这一点,重新审视最小化输入与重构之间 \(L^2\) 距离的想法。由于将用同一矩阵 \(\mathbf{D}\) 解码所有点,无法再将各点孤立考虑,而必须最小化覆盖所有维度与所有点的误差矩阵的 Frobenius 范数:

\[ \mathbf{D}^* = \arg\min_{\mathbf{D}} \sqrt{ \sum_{i, j} \left( x_j^{(i)} - \mathbf{r}(\mathbf{x}^{(i)})_j \right)^2 } \quad \text{subject to } \mathbf{D}^\top \mathbf{D} = \mathbf{I}_l. \]

为推导求 \(\mathbf{D}^*\) 的算法,先考虑 \(l = 1\) 的情形。此时 \(\mathbf{D}\) 退化为单个向量 \(\mathbf{d}\)。将式 2.67 代入式 2.68 并把 \(\mathbf{D}\) 化为 \(\mathbf{d}\),问题化为

\[ \mathbf{d}^* = \arg\min_{\mathbf{d}} \sum_i \left\| \mathbf{x}^{(i)} - \mathbf{d} \mathbf{d}^\top \mathbf{x}^{(i)} \right\|_2^2 \quad \text{subject to } \|\mathbf{d}\|_2 = 1. \]

上式是代入的最直接写法,但并不是最优雅的写法。它把标量 \(\mathbf{d}^\top \mathbf{x}^{(i)}\) 放在向量 \(\mathbf{d}\) 的右侧。更常规的做法是把标量系数写在它们所作用向量的左侧,因此通常将上述公式写为

\[ \mathbf{d}^* = \arg\min_{\mathbf{d}} \sum_i \left\| \mathbf{x}^{(i)} - \mathbf{d}^\top \mathbf{x}^{(i)} \mathbf{d} \right\|_2^2 \quad \text{subject to } \|\mathbf{d}\|_2 = 1, \]

或者利用"标量等于其自身的转置"这一事实,写成

\[ \mathbf{d}^* = \arg\min_{\mathbf{d}} \sum_i \left\| \mathbf{x}^{(i)} - \mathbf{x}^{(i)\top} \mathbf{d} \mathbf{d} \right\|_2^2 \quad \text{subject to } \|\mathbf{d}\|_2 = 1. \]

读者应努力熟悉这类纯排版意义上的重排。

此时,把问题改写为"以单个示例设计矩阵"的形式(而不是对单独示例向量求和)会带来便利。这允许使用更紧凑的记号。令 \(\mathbf{X} \in \mathbb{R}^{m \times n}\) 是把所有描述点的向量堆叠起来得到的矩阵,使 \(\mathbf{X}_{i, :} = \mathbf{x}^{(i)\top}\)。问题可重写为

\[ \mathbf{d}^* = \arg\min_{\mathbf{d}} \left\| \mathbf{X} - \mathbf{X} \mathbf{d} \mathbf{d}^\top \right\|_F^2 \quad \text{subject to } \mathbf{d}^\top \mathbf{d} = 1. \]

暂时忽略约束,Frobenius 范数部分可如下化简:

\[ \arg\min_{\mathbf{d}} \left\| \mathbf{X} - \mathbf{X} \mathbf{d} \mathbf{d}^\top \right\|_F^2 \]
\[ = \arg\min_{\mathbf{d}} \mathrm{Tr} \left( \left( \mathbf{X} - \mathbf{X} \mathbf{d} \mathbf{d}^\top \right)^\top \left( \mathbf{X} - \mathbf{X} \mathbf{d} \mathbf{d}^\top \right) \right) \]

(由式 2.49)

\[ = \arg\min_{\mathbf{d}} \mathrm{Tr}\left( \mathbf{X}^\top \mathbf{X} - \mathbf{X}^\top \mathbf{X} \mathbf{d} \mathbf{d}^\top - \mathbf{d} \mathbf{d}^\top \mathbf{X}^\top \mathbf{X} + \mathbf{d} \mathbf{d}^\top \mathbf{X}^\top \mathbf{X} \mathbf{d} \mathbf{d}^\top \right) \]
\[ = \arg\min_{\mathbf{d}} \mathrm{Tr}(\mathbf{X}^\top \mathbf{X}) - \mathrm{Tr}(\mathbf{X}^\top \mathbf{X} \mathbf{d} \mathbf{d}^\top) - \mathrm{Tr}(\mathbf{d} \mathbf{d}^\top \mathbf{X}^\top \mathbf{X}) + \mathrm{Tr}(\mathbf{d} \mathbf{d}^\top \mathbf{X}^\top \mathbf{X} \mathbf{d} \mathbf{d}^\top) \]
\[ = \arg\min_{\mathbf{d}} -\mathrm{Tr}(\mathbf{X}^\top \mathbf{X} \mathbf{d} \mathbf{d}^\top) - \mathrm{Tr}(\mathbf{d} \mathbf{d}^\top \mathbf{X}^\top \mathbf{X}) + \mathrm{Tr}(\mathbf{d} \mathbf{d}^\top \mathbf{X}^\top \mathbf{X} \mathbf{d} \mathbf{d}^\top) \]

(不含 \(\mathbf{d}\) 的项不影响 \(\arg\min\)

\[ = \arg\min_{\mathbf{d}} -2 \mathrm{Tr}(\mathbf{X}^\top \mathbf{X} \mathbf{d} \mathbf{d}^\top) + \mathrm{Tr}(\mathbf{d} \mathbf{d}^\top \mathbf{X}^\top \mathbf{X} \mathbf{d} \mathbf{d}^\top) \]

(因为可在迹内循环矩阵顺序,由式 2.52)

\[ = \arg\min_{\mathbf{d}} -2 \mathrm{Tr}(\mathbf{X}^\top \mathbf{X} \mathbf{d} \mathbf{d}^\top) + \mathrm{Tr}(\mathbf{X}^\top \mathbf{X} \mathbf{d} \mathbf{d}^\top \mathbf{d} \mathbf{d}^\top) \]

(再次使用同一性质)

此时重新引入约束:

\[ \arg\min_{\mathbf{d}} -2 \mathrm{Tr}(\mathbf{X}^\top \mathbf{X} \mathbf{d} \mathbf{d}^\top) + \mathrm{Tr}(\mathbf{X}^\top \mathbf{X} \mathbf{d} \mathbf{d}^\top \mathbf{d} \mathbf{d}^\top) \quad \text{subject to } \mathbf{d}^\top \mathbf{d} = 1 \]
\[ = \arg\min_{\mathbf{d}} -2 \mathrm{Tr}(\mathbf{X}^\top \mathbf{X} \mathbf{d} \mathbf{d}^\top) + \mathrm{Tr}(\mathbf{X}^\top \mathbf{X} \mathbf{d} \mathbf{d}^\top) \quad \text{subject to } \mathbf{d}^\top \mathbf{d} = 1 \]

(由约束)

\[ = \arg\min_{\mathbf{d}} -\mathrm{Tr}(\mathbf{X}^\top \mathbf{X} \mathbf{d} \mathbf{d}^\top) \quad \text{subject to } \mathbf{d}^\top \mathbf{d} = 1 \]
\[ = \arg\max_{\mathbf{d}} \mathrm{Tr}(\mathbf{X}^\top \mathbf{X} \mathbf{d} \mathbf{d}^\top) \quad \text{subject to } \mathbf{d}^\top \mathbf{d} = 1 \]
\[ = \arg\max_{\mathbf{d}} \mathrm{Tr}(\mathbf{d}^\top \mathbf{X}^\top \mathbf{X} \mathbf{d}) \quad \text{subject to } \mathbf{d}^\top \mathbf{d} = 1. \]

该优化问题可借助特征分解求解。具体地,最优 \(\mathbf{d}\)\(\mathbf{X}^\top \mathbf{X}\) 的最大特征值对应的特征向量给出。

该推导仅在 \(l = 1\) 时成立,只恢复出第一个主成分。更一般地,当希望恢复出一组主成分的基时,矩阵 \(\mathbf{D}\) 由与最大 \(l\) 个特征值对应的 \(l\) 个特征向量给出。这可借助数学归纳法证明,作者建议读者把该证明作为练习写出。

线性代数是理解深度学习所必需的基础数学学科之一。机器学习中同样无处不在的另一关键数学领域是概率论,将在下章介绍。

本章个人批注

本章是全书第一部分"数学与机器学习基础"的第一章,专门为后续深度学习章节做线性代数准备。作者开篇就把定位讲得很清楚——这不是一份线性代数教程,而是一份针对深度学习读者的"聚焦式先修包",并明确略去了许多对深度学习并非必要的内容(例如若把本章作为教材读会期待看到的大量线性方程组理论细节)。这种"目标裁剪"是本书的总体风格,整章都在为后续章节节省认知成本。

逐节来看,最值得关注的是作者对几个数学概念的"机器学习视角"再解释。范数一节(2.5)最具代表性:除了定义 \(L^p\) 范数,还专门把 \(L^2\) 范数与其平方、\(L^1\) 范数、\(L^0\)"伪范数"、\(L^\infty\) 范数并置,明确给出每种范数适合什么场景——"在原点附近增长慢"(指 \(L^2\))vs"区分零与非零重要"(指 \(L^1\))vs"统计非零元素"(\(L^0\) 是误称)。这种"在何种情况下使用哪种范数"的工程化讨论在纯数学教材里是看不到的,它直接对应深度学习中正则化、稀疏编码、约束优化的具体选择。

特征分解(2.7)与 SVD(2.8)的关系是本章的另一条隐线:特征分解只对实对称矩阵"保证存在 + 实值",SVD 对任何实矩阵都存在,因此非方阵、奇异阵只能求 SVD。这一点直接导向下一节的伪逆——伪逆 \(\mathbf{A}^+ = \mathbf{V}\mathbf{D}^+\mathbf{U}^\top\) 本质上就是 SVD 公式 \(\mathbf{A} = \mathbf{U}\mathbf{D}\mathbf{V}^\top\) 的"广义逆"自然延伸。伪逆在过定/欠定情形下的最优性结论(列多于行时给出最小范数解;行多于列时给出最小二乘意义下的近似解)是非常实用的内容,对应着深度学习中"非方阵权重 → 求最小范数参数"与"超定线性系统 → 最小二乘回归"两类问题。

PCA 推导(2.12)虽以数学展开为主,但隐含着机器学习算法的几个通用工程模式:把目标函数展开、丢弃与优化变量无关的项、引入 trace 配合循环不变性化简、把"对所有点的求和"改写为"设计矩阵"的矩阵记号。每一步都对应一个"对后续章节有用"的具体技巧。值得注意的是,作者把"多个 \(\mathbf{d}\) 的情形"的归纳证明留作练习——这是本书反复出现的"基础情形自己推、扩展情形读者自证"的教学策略。

迹算子的循环不变性(2.10,\(\mathrm{Tr}(\mathbf{ABC}) = \mathrm{Tr}(\mathbf{CAB}) = \mathrm{Tr}(\mathbf{BCA})\))在 PCA 推导中扮演关键角色,但它的"即使乘积形状变化也成立"这一性质(式 2.53)是全章最容易被低估的恒等式——它意味着对形状做"维度对齐"的分析时不必再考虑迹本身对换位带来的麻烦。这一点在后续矩阵微积分章节、KL 散度对 softmax 的梯度推导中都会反复出现。

最后,整章有一处对"该不该用逆矩阵"的实用提醒(2.3 末段):作者明确说 \(\mathbf{A}^{-1}\) 主要是"理论工具",软件应用里通常应避免直接使用,因为浮点精度有限。后续章节凡涉及"解线性系统"时几乎都默认走"\(\mathbf{A}^{-1}\mathbf{b}\)"记号,但作者在这里提前打了预防针,提醒读者在实现时一般应使用 LU/SVD/QR 等更稳定的算法,而不是真的去算 \(\mathbf{A}^{-1}\) 再乘以 \(\mathbf{b}\)

与上下章的衔接(一段话)

作为全书"第一部分:数学与机器学习基础"的第二章,本章承担着为后续深度学习章节建立线性代数语汇的任务。本章的论证线索是"标量/向量/矩阵/张量四类对象 → 矩阵乘法的定义与代数性质 → 单位矩阵与逆矩阵 → 列空间与线性相关 → 范数 → 特殊矩阵/向量 → 特征分解 → SVD → 伪逆 → 迹算子 → 行列式 → PCA 实例"——由"最基础的代数对象"逐步过渡到"对深度学习至关重要的矩阵分解与实例算法"。其中 2.1–2.4 是支撑全书所有章节的基础设施;2.5–2.6 提供深度学习目标函数与优化中的常用度量与约束形式;2.7–2.11 集中讨论矩阵分解与算子(特征分解、SVD、伪逆、迹、行列式),为后续 PCA、Spectral Embedding、矩阵微积分等主题做工具准备;2.12 以 PCA 作为"线性代数大综合",将前面所有定义、记号、性质串联到同一个具体算法上,这一节也预告了"用矩阵微积分求最优参数"的模式(具体放在第 4 章 4.3 节)。

向前衔接:第一章的导言明确给出"全书第一部分是数学工具与机器学习基础"的结构图,2.1 节开始的线性代数是其中第一项;本章末段明示"另一关键领域是概率论,将在下章介绍",自然过渡到第三章概率与信息论。向后衔接:第 4 章数值计算的 4.3 节(基于梯度的优化)会重新调用本章 2.12 中被搁置的"求 \(\nabla_{\mathbf{c}}(-2 \mathbf{x}^\top \mathbf{D}\mathbf{c} + \mathbf{c}^\top \mathbf{c}) = 0\)"这一步的细节;第 5 章机器学习基础会用到 2.5 的范数与 2.12 的 PCA 思想;进入第二部分后,2.7 的特征分解会直接出现在权重矩阵的谱分析讨论中,2.8 的 SVD 会出现在权重初始化与谱归一化、推荐系统嵌入、低秩近似等场景,2.9 的伪逆会在过定/欠定系统的最小范数解与最小二乘解中反复出现。