LOADING

加载过慢请开启缓存 浏览器默认开启

矩阵论:矩阵函数和矩阵求导

矩阵函数介绍

矩阵函数与通常的函数类似,但是因变量和自变量都为 \(n\) 阶矩阵。定义如下:

定义

设一元函数 \(f(z)\) 能展开为 \(z\) 的幂级数:
\[ f(z) = \sum_{k = 0}^{\infty} c_k z^k, \quad (|z| < r) \]
其中 \(r > 0\) 表示该幂级数的收敛半径。当 \(n\) 阶矩阵 \(A\) 的谱半径 \(\rho (A) < r\) 时,把收敛矩阵幂级数 \(\sum_{k = 0}^{\infty} c_k A^k\) 的和称为 矩阵函数,记为 \(f(A)\),即:
\[ f(A) = \sum_{k = 0}^{\infty} c_k A^k \]

通过以上定义和一些基本函数,可以导出 矩阵指数函数矩阵三角函数,并推得一系列等式。


函数矩阵对矩阵的导数

我们已经在上一节中引入了矩阵函数的概念,类似地,也有微分和导数的定义。相较于标量导数,对矩阵函数的求导和微分较为复杂。在具体应用中,如梯度下降等算法,这部分内容具有重要意义,因此需要深入理解。

首先,我们将标量求导拓展到向量,对于 \(\frac{\partial y}{\partial x}\),存在以下几种情况:

  1. \(y\) 是标量:
    • \(x\) 是标量
    • \(\boldsymbol{x}\) 是向量(默认为列向量,即 \(\boldsymbol{x} = (x_1, x_2, x_3)^\top\)
    • \(\boldsymbol{X}\) 是矩阵
  2. \(\boldsymbol{y}\) 是向量,例如 \(f_{3\times 1}(x) = (f_1, f_2, f_3)^\top\)
    • 标量变元
    • 向量变元
    • 矩阵变元
  3. \(\boldsymbol{Y}\) 是矩阵,同样有三种变元。

简单理解:
- 分子布局:分子是列向量形式,分母是行向量形式
- 分母布局:分子是行向量形式,分母是列向量形式

向量化操作

在具体分析之前,先介绍矩阵的 向量化操作。例如,对矩阵 \(\boldsymbol{X} \in \mathbb{R}^{m \times n}\) 进行列优先展开:
\[ \text{vec}(\boldsymbol{X}) = \begin{bmatrix} x_{11} & x_{21} & \dots & x_{m1} & \dots & x_{1n} & x_{2n} & \dots & x_{mn} \end{bmatrix}^\top \]

向量变元的实值标量函数

  1. 行向量偏导(分子布局)
    \[ \boldsymbol{D}_{\boldsymbol{x}} f = \frac{\partial f}{\partial \boldsymbol{x}^\top} = \begin{bmatrix} \frac{\partial f}{\partial x_1} & \frac{\partial f}{\partial x_2} & \dots & \frac{\partial f}{\partial x_n} \end{bmatrix} \]
  2. 梯度向量偏导(分母布局)
    \[ \nabla_{\boldsymbol{x}} f = \frac{\partial f}{\partial \boldsymbol{x}} = \begin{bmatrix} \frac{\partial f}{\partial x_1} \\ \frac{\partial f}{\partial x_2} \\ \vdots \\ \frac{\partial f}{\partial x_n} \end{bmatrix} \]

矩阵变元的实值标量函数

从标量求导到矩阵求导,就是分子的 转置、向量化 和分母的 转置、向量化 的各种组合。

对于 分子布局
- 分子:标量、列向量、矩阵向量化后的列向量
- 分母:标量、列向量转置后的行向量、矩阵的转置矩阵、矩阵向量化后的列向量转置后的行向量

对于 分母布局
- 分子:标量、列向量转置后的行向量、矩阵向量化后的列向量转置后的行向量
- 分母:标量、列向量、矩阵自身、矩阵向量化后的列向量

在机器学习领域,常见的主要有以下三种形式:

  1. 梯度
    \[ \nabla_{\boldsymbol{x}} \overset{\mathrm{def}}{=} \left[\frac{\partial}{\partial x_{1}},\frac{\partial}{\partial x_{2}},\cdots,\frac{\partial}{\partial x_{n}}\right]^{T}=\frac{\partial}{\partial\boldsymbol{x}} \]
  2. Hesse矩阵
    \[ H(f) = \begin{bmatrix} \frac{\partial^2f}{\partial x_1^2} & \frac{\partial^2f}{\partial x_1\partial x_2} & \cdots & \frac{\partial^2f}{\partial x_1\partial x_n} \\ \frac{\partial^2f}{\partial x_2\partial x_1} & \frac{\partial^2f}{\partial x_2^2} & \cdots & \frac{\partial^2f}{\partial x_2\partial x_n} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial^2f}{\partial x_n\partial x_1} & \frac{\partial^2f}{\partial x_n\partial x_2} & \cdots & \frac{\partial^2f}{\partial x_n^2} \end{bmatrix} \]
  3. Jacobi矩阵
    \[ \begin{bmatrix} \frac{\partial y_1}{\partial x_1} & \cdots & \frac{\partial y_1}{\partial x_n} \\ \vdots & \ddots & \vdots \\ \frac{\partial y_m}{\partial x_1} & \cdots & \frac{\partial y_m}{\partial x_n} \end{bmatrix} \]

不难发现:
- 若 \(f(x)\) 是一个标量函数,则 Jacobi矩阵是一个向量,等于 \(f(x)\) 的梯度,Hesse矩阵是一个二维矩阵
- 若 \(f(x)\) 是一个向量值函数,则 Jacobi矩阵是一个二维矩阵,Hesse矩阵是一个三维矩阵
- 梯度是 Jacobi 矩阵的特例,梯度的 Jacobi 矩阵就是 Hesse 矩阵,这其实就是 一阶偏导与二阶偏导的关系


自动求导与链式法则

在实际应用问题中,标量求导中的 链式法则 也可以拓展到向量乃至矩阵。在使用程序计算时,库函数一般采用 自动求导 方式,而不是一般的符号求导或数值求导。自动求导应用了链式法则,并将整个计算过程表示成一个 无环图,其中包括两种模式:

  1. 正向积累
    \[ \frac{\partial \boldsymbol{z}^{(i)}}{\partial \boldsymbol{x}} = \frac{\partial \boldsymbol{z}^{(i-1)}}{\partial \boldsymbol{x}} \cdot \frac{\partial \boldsymbol{z}^{(i)}}{\partial \boldsymbol{z}^{(i-1)}} \]
  2. 反向传递
    \[ \frac{\partial f}{\partial \boldsymbol{z}^{(i-1)}} = \frac{\partial f}{\partial \boldsymbol{z}^{(i)}} \cdot \frac{\partial \boldsymbol{z}^{(i)}}{\partial \boldsymbol{z}^{(i-1)}} \]

反向传递过程需要存储中间变量,导致内存复杂度比正向积累高。

其在实际场景中的主要应用就是神经网络,在神经网络的正向传播中,我们将输入数据通过网络层逐层传递,计算出最终的输出值。我们的目标是计算神经网络的输出\(\hat{y}\)和损失函数\(\mathcal{L}\)的值。而反向传播用于计算损失函数对所有网络参数的梯度。

在实际应用问题中,由于反向传播的链路过长,涉及到多次激活函数关于净输入的偏导数矩阵、当前层输入关于净输入的偏导数矩阵的连乘,如果这个矩阵的谱半径小于一,那么随着反向传播的进行,回传的梯度信号衰减地越厉害,这使得越是网络浅层的参数地梯度越微弱,那么其越难得到很好地更新。这就是梯度消失问题。