MIT 18:S096 – 1 矩阵微积分导论

写在开始

其实这门课很早就想看看了,感觉和 MIT 的另一门公开课 The Missing Semester of Your CS Education (这门也强推٩(ˊ〇ˋ*)و)类似,属于是入门的前置课。

另一个驱动的原因说来难绷,上手 ML 和 DL 之后对于基本原理的推导不可避免地要涉及到矩阵求导,典中典的 Gradient Descend 、 Least Squares 、 PCA 、 Multivariate Gaussian Distribution 等等此类。不是天才不会矩阵求导和微积分书倒也不是推导不出相关结论,只是缺少系统化的知识构建极其容易犯错陷困,而国内大部分高校涉及这方面的课程也寥寥可数,所以只能倒逼学生自学。

扯远了咳,lec 01 主要是导论,涉及的的部分并不复杂,主要先对课程进行了概述和开课动机说明;此外介绍了一下矩阵微积分的应用领域;最后就是导数的重定义和相关法则的说明和延伸。

课程概述、动机和应用

和国内大部分高校一样,传统微积分课程中主要关注标量和向量函数,但许多现实问题涉及矩阵的输入/输出(例如,神经网络中的权重矩阵、物理模拟中的参数矩阵)。最简单的例子:

对于矩阵函数 $f(A) = A^2$,导数 $\frac{d}{dA} A^2$ 并不简单的是 $2A$(除非 $A$ 是标量),因为矩阵乘法不可交换。这就需要更一般的导数定义。

传统微积分对此无能为力,而引入矩阵微积分这一工具,使得我们能够处理这些高阶对象。

讲义这块对矩阵微积分做了一个粗略的总括,具体来说:

  • 矩阵是高阶张量(二阶张量)的特例。在更一般的设置中,微积分可以扩展到任意阶张量,这在物理和工程中很常见(如应力张量、相对论中的度规张量)。
  • 矩阵微积分可以看作是在向量空间(如 $\mathbb{R}^{m \times n}$)上的微积分。导数被定义为线性映射(Fréchet 导数),即函数在一点的最佳线性近似。

讲义还提及了矩阵微积分在多个领域的应用,包括机器学习、物理建模、数据科学和自动微分,不过这不是重点,在此大部分略过不表,提一下自动微分(AD):

  • AD 是一种计算机科学技术,通过编译程序代码计算导数,不同于符号微分或数值微分。它基于链式法则和计算图。
  • AD 有两种模式:前向模式(适用于输入维度低)和反向模式(适用于输出维度低,如机器学习中的损失函数)。反向模式即反向传播(Forward)。

一阶导数和线性化

在这块讲义介绍了导数的线性化本质,并扩展到向量和矩阵函数。

对于函数 $f: \mathbb{R}^m \to \mathbb{R}^n$,导数是一个线性映射,具体形式取决于输入/输出的维度(如标量、向量、矩阵),更具体一点:

对于标量和向量函数,我们知道导数 $f'(x_0)$ 表示函数 $f$ 在点 $x_0$ 的最佳线性近似,即满足$$f(x) – f(x_0) \approx f'(x_0)(x – x_0)$$

那么推广到矩阵,对于矩阵函数,其导数为$f'(X) = f(X) – f(X_0) \approx Df(X_0)[X – X_0]$,其中 $Df$ 是导数算子

$\downarrow$ Input\Output $\rightarrow$标量向量矩阵
标量标量向量矩阵
向量梯度向量(列向量)矩阵(雅可比矩阵)高阶数组
矩阵矩阵(梯度矩阵)高阶数组高阶数组

举个很简单的例子:对于 $f(x) = x^T x$(向量输入、标量输出),梯度是 $2x$,微分是 $d(x^T x) = 2x^T dx$

更严格一点,上述其实是泛函分析中的 Fréchet 导数的相关定义:

如果存在线性算子 $A$ 使得 $\lim_{h \to 0} \frac{\|f(x+h) – f(x) – A h\|}{\|h\|} = 0$,则 $A$ 是导数

这里 $h$ 是一个扰动矩阵(或向量),$\| \cdot \|$ 是适当的范数(如 Frobenius 范数对于矩阵)。线性算子 $A$ 捕获了 $f$ 在 $x$ 附近的线性近似。

而对于矩阵函数而言,理解起来需要涉及到 Kronecker 乘积和向量化。因为对于矩阵函数,线性算子 $A$ 本身可能很复杂。为了数值计算或表示,我们经常需要将 $A$ 表示为一个矩阵,而不是一个抽象算子。这是因为矩阵空间是有限维的,我们可以通过向量化 (vectorization)将矩阵转换为向量。向量化操作(记为 $\text{vec}$)用于将矩阵堆叠成一个列向量。而一旦向量化,线性算子 $A$ 就可以表示为一个矩阵 $D$ 作用在 $\text{vec}(H)$ 上,即:

$$\text{vec}(A(H)) = D \, \text{vec}(H).$$

Kronecker 乘积(记为 $\otimes$)是一种矩阵运算,允许我们在 $A$ 涉及矩阵乘法时构造 $D$ 。具体而言,涉及到了如下性质:

$$\text{vec}(A H B) = (B^T \otimes A) \text{vec}(H),$$

举个栗子来说明一下,考虑以下矩阵函数:

$$f(X)=AXB$$

假设 $f: \mathbb{R}^{m \times n} \to \mathbb{R}^{p \times q}$ 定义为 $f(X) = A X B$,其中 $A$ 是 $p \times m$ 矩阵,$B$ 是 $n \times q$ 矩阵,都是常数。我们想求 $f$ 在点 $X$ 的导数。

首先计算变化量:记扰动矩阵为 $H$ (与 $X$ 同维),则有:

$$f(X+H) – f(X) = A(X+H) B – AXB = AHB$$

这里,$A H B$ 是线性的 in $H$,所以线性算子 $A$ 定义为 $A(H) = A H B$.

“in $H$”是常用的简略说法,意思是“关于变量 $H$ 是线性的”或者“将 $H$ 视为变量时,这个表达式是线性的”。

那么接下来验证 Fréchet 导数,检查极限有:

$$\lim_{H \to 0} \frac{\|f(X+H) – f(X) – A(H)\|}{\|H\|} = \lim_{H \to 0} \frac{\|A H B – A H B\|}{\|H\|} = 0.$$

显然成立,所以 $A(H) = A H B$ 是导数

现在对矩阵进行向量化:

  • $\text{vec}(H)$ 是 $mn \times 1$ 向量。
  • $\text{vec}(A(H)) = \text{vec}(A H B)$.

使用 Kronecker 乘积性质:

$$\text{vec}(A H B) = (B^T \otimes A) \text{vec}(H).$$

因此,导数算子 $A$ 在向量化后对应矩阵 $D = B^T \otimes A$,这是一个 $pq \times mn$ 矩阵。也就是说:

$$\text{vec}(A(H)) = D \, \text{vec}(H).$$

考虑一个稍微复杂点的例子:

假设 $f: \mathbb{R}^{n \times n} \to \mathbb{R}^{n \times n}$ 定义为 $f(X) = X^T X$。那么:

  • $f(X + H) – f(X) = (X + H)^T (X + H) – X^T X = X^T H + H^T X + H^T H$.
  • 线性部分为 $X^T H + H^T X$,所以 $A(H) = X^T H + H^T X$.

向量化后:

$$\text{vec}(A(H)) = \text{vec}(X^T H) + \text{vec}(H^T X).$$

使用 Kronecker 乘积:

  • $\text{vec}(X^T H) = (I_n \otimes X^T) \text{vec}(H)$(因为 $X^T H = X^T H I_n$)。
  • $(H^T X)$ 注意:有公式 $\text{vec}(H^T X) = (X^T \otimes I_n) K_{nn} \text{vec}(H)$,其中 $K_{nn}$ 是 $n^2 \times n^2$ 的交换矩阵(commutation matrix),用于将 $\text{vec}(H)$ 转换为 $\text{vec}(H^T)$。

综上所述:

$$\text{vec}(A(H)) = \left[ (I_n \otimes X^T) + (X^T \otimes I_n) K_{nn} \right] \text{vec}(H).$$

这里,导数矩阵 $D = (I_n \otimes X^T) + (X^T \otimes I_n) K_{nn}$ 涉及 Kronecker 乘积和交换矩阵。

ok那么回到正题,除了基本的导数定义外,讲义还介绍了矩阵微积分的乘积法则:

  • 对于矩阵 $A$ 和 $B$,有 $d(AB) = (dA)B + A(dB)$
  • 对于向量点积,有 $d(x^T x) = 2x^T dx$
  • 对于矩阵乘积 $AB$,元素级计算显示 $d(AB)_{ij} = \sum_k (dA_{ik} B_{kj} + A_{ik} dB_{kj})$,这等价于 $d(AB) = (dA)B + A(dB)$。注意顺序重要,因为矩阵乘法不可交换。
  • 对于张量乘积,乘积法则类似,但需要索引 notation。例如在 Einstein 求和约定中,微分遵循类似规则。
  • 矩阵微积分中的链式法则也成立,但需注意维度匹配。例如,如果 $y = f(u)$ 和 $u = g(x)$,则 $\frac{dy}{dx} = \frac{dy}{du} \frac{du}{dx}$
  • 矩阵形式需确保乘法顺序,确保乘法顺序,确保乘法顺序,重要的事情说三遍

以上便是 lec 01 涉及的相关内容,当然还提及了有限差分法和 Julia 相关的自动微分库,不过有限差分都看到这了我觉得不说应该都能理解,至于 Julia 我常用的是 Python 所以这个有空(咕咕)再看(咕咕)。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注