Skip to content

矩阵属性

矩阵是存储数据集、编码变换以及定义每个神经网络层的数据结构。本文将涵盖矩阵的维度、元素、转置、迹、行列式、逆、秩和零空间——这些贯穿线性代数和机器学习的基础性质。

  • 从核心来看,矩阵是一个由数字排列成的矩形网格,分为行和列。如果说向量是一个数字列表,那么矩阵就是一张数字表格。
\[ A = \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{bmatrix} \]
  • 你也可以把矩阵看作是一堆向量的堆叠。

  • 如果单个人用向量 \([\text{年龄}, \text{身高}, \text{体重}]\) 来描述,那么三个人就形成一个矩阵,其中每一行代表一个人:

\[ \begin{bmatrix} 25 & 170 & 65 \\ 30 & 180 & 80 \\ 22 & 160 & 55 \end{bmatrix} \]
  • 这个矩阵有 3 行 3 列,因此我们称它为 \(3 \times 3\) 矩阵。

  • 网格中的每个数字称为一个元素条目,用其行和列来标识:\(A_{ij}\) 表示第 \(i\) 行、第 \(j\) 列的元素。

  • 矩阵的转置将其沿对角线翻转,将行变成列、列变成行。如果 \(A\)\(m \times n\) 的,那么 \(A^T\) 就是 \(n \times m\) 的。

\[ A = \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{bmatrix} \quad \Rightarrow \quad A^T = \begin{bmatrix} 1 & 4 \\ 2 & 5 \\ 3 & 6 \end{bmatrix} \]
  • 矩阵与其转置相乘总是得到一个方阵:\(AA^T\)\(m \times m\)\(A^TA\)\(n \times n\)

  • 方阵的是其对角线元素之和:\(\text{tr}(A) = A_{11} + A_{22} + \cdots + A_{nn}\)。迹等于特征值之和(我们稍后会看到)。

迹:对角线元素之和

  • 对于上面的矩阵,\(\text{tr}(A) = 1 + 4 + 9 = 14\)。只有高亮的对角线元素起作用。

  • 如果两个矩阵在不同基下表示同一个线性变换,它们的迹相同。迹是“与基无关”的。

  • 矩阵的是线性无关的行(或等价地,列)的个数。它告诉你矩阵携带了多少“有用信息”。

  • 例如,下面的矩阵秩为 2,因为两行不成倍数关系:

\[ \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix} \]

但这个矩阵的秩为 1,因为第二行只是第一行的两倍,没有增加新信息:

\[ \begin{bmatrix} 1 & 2 \\ 2 & 4 \end{bmatrix} \]
  • 一个 \(5 \times 3\) 的矩阵的秩最多为 3。如果某些行只是其他行的缩放或线性组合,秩就会降低。具有最大可能秩的矩阵称为满秩矩阵。

秩:独立行张成整个空间 vs. 相关行只张成一个子空间

  • 方阵可逆(有逆矩阵)当且仅当它是满秩的。

  • 秩与零空间(矩阵映射到零的向量集合)通过秩—零化度定理联系在一起:\(\text{rank}(A) + \text{nullity}(A) = \text{矩阵 } A \text{ 的列数}\)。矩阵保留的(秩)加上它摧毁的(零化度)等于总维度。

  • 矩阵的列空间是当你将矩阵乘以任意向量时所有可能输出构成的集合。它由矩阵的列张成。如果一个矩阵有 3 列但只有 2 列是独立的,那么列空间是一个二维平面,而不是整个三维空间。

列空间:独立列张成一个平面,相关列只能张成一条直线

  • 行空间的概念相同,只是从行的角度出发。秩等于列空间的维数,也等于行空间的维数,因此它们总是相等的。

  • 列空间告诉你“这个矩阵能产生哪些输出?”,而零空间告诉你“哪些输入会被映射到零?”这两个空间共同完整描述了矩阵的作用。

  • 方阵的行列式是一个数,它刻画了矩阵对空间的缩放效果。可以把一个 \(2 \times 2\) 矩阵想象成将单位正方形变换成一个平行四边形。行列式就是这个平行四边形的面积(带符号)。

\[ \det\begin{bmatrix} a & b \\ c & d \end{bmatrix} = ad - bc \]

行列式:线性变换的面积缩放因子

  • 例如:
\[ \det\begin{bmatrix} 2 & 1 \\ 0 & 3 \end{bmatrix} = 2 \cdot 3 - 1 \cdot 0 = 6 \]

这个变换将单位正方形拉伸成一个面积为 6 的平行四边形。

  • 如果行列式为正,变换保持定向(事物不会被“翻转”)。如果为负,则会翻转定向(如同镜像反射)。如果为零,矩阵将空间压缩到更低维度,将平行四边形压缩成一条线或一个点。

  • 行列式为零的矩阵称为奇异矩阵。它没有逆矩阵,并且永久地丢失了信息。

  • 对于大于 \(2 \times 2\) 的矩阵,行列式通过子式代数余子式计算。子式 \(M_{ij}\) 是删除第 \(i\) 行和第 \(j\) 列后得到的小矩阵的行列式。

子式:删除一行和一列得到一个更小的矩阵

  • 代数余子式 \(C_{ij} = (-1)^{i+j} M_{ij}\) 为每个子式附加了一个符号(正负交替,像棋盘一样:\(+, -, +, \ldots\))。整个矩阵的行列式等于按任意一行或一列求和:\(\det(A) = \sum_j A_{1j} \cdot C_{1j}\)。这称为代数余子式展开

  • 方阵 \(A\),记作 \(A^{-1}\),是能够撤销 \(A\) 作用的矩阵:\(AA^{-1} = A^{-1}A = I\)(单位矩阵)。只有非奇异矩阵才有逆矩阵。

  • 对于 \(2 \times 2\) 矩阵,逆矩阵有直接公式:

\[ \begin{bmatrix} a & b \\ c & d \end{bmatrix}^{-1} = \frac{1}{ad - bc}\begin{bmatrix} d & -b \\ -c & a \end{bmatrix} \]

注意分母中的行列式,这就是奇异矩阵(行列式为零)没有逆的原因。

  • 条件数衡量矩阵对其输入微小变化的敏感程度。定义是 \(\kappa(A) = \|A\| \cdot \|A^{-1}\|\)

  • 条件数接近 1 意味着矩阵是良态的:小的输入变化产生小的输出变化。大的条件数意味着矩阵是病态的:微小的误差会被极度放大。正交矩阵和单位矩阵的条件数为 1,而奇异矩阵的条件数为无穷大。

  • 例如,下面矩阵的条件数为 \(10^8\)。一个方向被正常缩放,而另一个方向几乎被压缩到零,因此沿该方向的微小扰动会被极度扭曲:

\[ \begin{bmatrix} 1 & 0 \\ 0 & 10^{-8} \end{bmatrix} \]
  • 正如向量有范数(长度),矩阵也有范数来衡量其“大小”。最常用的是Frobenius 范数,它将矩阵视为一个长向量并计算其长度:
\[ \|A\|_F = \sqrt{\sum_{i}\sum_{j} A_{ij}^2} \]
  • 例如:
\[ \left\|\begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix}\right\|_F = \sqrt{1 + 4 + 9 + 16} = \sqrt{30} \approx 5.48 \]
  • 谱范数 \(\|A\|_2\)\(A\) 的最大奇异值。它衡量矩阵能够拉伸任何单位向量的最大幅度。在机器学习中,矩阵范数用于权重正则化(惩罚大的权重)以及监控训练稳定性。

  • 对称矩阵 \(A\)正定的,如果对于每一个非零向量 \(\mathbf{x}\) 都有:\(\mathbf{x}^T A \mathbf{x} > 0\)。这个二次型总是产生正数。

  • 例如,下面矩阵是正定的:

\[ A = \begin{bmatrix} 2 & 1 \\ 1 & 3 \end{bmatrix} \]

任选一个向量,比如 \(\mathbf{x} = [1, -1]^T\)\(\mathbf{x}^T A \mathbf{x} = 2 - 1 - 1 + 3 = 3 > 0\)。无论你尝试哪个非零 \(\mathbf{x}\),结果总是正数。

  • 正定矩阵很重要,因为它们保证优化问题具有唯一的最小值。

  • 如果条件放宽为 \(\mathbf{x}^T A \mathbf{x} \geq 0\)(允许为零),则矩阵是半正定的。半正定矩阵经常出现:协方差矩阵、支持向量机中的核矩阵、以及局部极小值处的 Hessian 矩阵都是半正定的。区别在于半正定允许某些方向是“平坦的”(零曲率),而不是严格向上弯曲。

编程任务(使用 CoLab 或 notebook)

  1. 计算矩阵的迹、秩和行列式。尝试使某一行成为另一行的倍数,观察秩和行列式如何变化。

    import jax.numpy as jnp
    
    A = jnp.array([[1.0, 2.0],
                   [3.0, 4.0]])
    
    print(f"迹: {jnp.trace(A)}")
    print(f"秩: {jnp.linalg.matrix_rank(A)}")
    print(f"行列式: {jnp.linalg.det(A):.2f}")
    

  2. 计算矩阵的逆,与原矩阵相乘,验证得到单位矩阵。然后尝试一个奇异矩阵,观察会发生什么。

    import jax.numpy as jnp
    
    A = jnp.array([[1.0, 2.0],
                   [3.0, 4.0]])
    
    A_inv = jnp.linalg.inv(A)
    print(f"A * A_inv:\n{A @ A_inv}")