在前一讲的笔记中我们主要对矩阵导数的定义做出了梳理,并简述了部分矩阵微积分的乘积法则。在这一讲中,讲义将从线性算子的角度去理解导数,并将导数的概念从单变量函数推广到任意向量空间(尤其是矩阵空间)中的函数,事实上,这部分可以理解为对第一讲的补充细化。
线性化 – 导数的本质
导数的核心思想是线性逼近。对于一个函数 $f(x)$,在点 $x$ 附近,函数值的变化 $\delta f$ 可以由一个关于输入变化 $\delta x$ 的线性函数来预测,高阶项可以被忽略。
$\delta f = f(x + \delta x) – f(x) = f'(x) \delta x + o(\delta x)$
这里的 $o(\delta x)$ 是“小o”记号,代表比 $\delta x$ 更快趋于零的高阶项。
看上去很抽象?这其实是基本高数内容。不过我们也可以换一种更直观的理解方式:
- 在单变量情况下,这就是切线近似
- 在多变量情况下,这就是切平面近似
为什么选择这个定义?
这个定义避免了“除法”操作(即 $\frac{df}{dx}$),使得它可以推广到无法进行除法的对象上(比如矩阵、向量)。导数 $f'(x)$ 不再是一个“数”或“斜率”,而是一个线性算子,它“吃掉”一个小的变化量 $\delta x$,并“吐出”对应的线性变化量 $\delta f$。
讲义在此引入了微分记号 $df = f'(x)[dx]$,这更清晰地表达了“线性算子作用于输入微分”这一观点。$dx$ 代表输入空间中的一个任意微小向量(方向),$df$ 代表输出空间中对应的微小变化向量。
而如果将导数视为线性算子(Linear Operator),那么它满足:
$$L[v_1 + v_2] = Lv_1 + Lv_2$\\L[\alpha v] = \alpha L[v]$$
也就是说,对于函数 $f$,其导数 $f'(x)$ 就是一个将任意方向向量 $v$ 映射到方向导数 $f'(x)[v]$ 的线性算子。
什么是线性算子?
不仅仅是矩阵乘法。事实上,任何满足上述线性条件的映射都是线性算子。例如:
矩阵乘法: $L(v) = A v$
矩阵转置: $L(X) = X^T$
求迹: $L(X) = \text{tr}(X)$
甚至函数求导: $L(g) = \frac{dg}{dx}$ (将函数 $g$ 映射到其导函数)
但我们同样需要注意,$f'(x)$ 是在点 $x$ 的导数,它是一个线性算子。而求导操作本身(如 $\frac{d}{dx}$)是一个将函数 $f$ 映射到其导数函数 $f’$ 的“高阶”线性算子,二者并不等价。
在吧啦吧啦说完定义后,讲义分别以标量值函数、向量值函数为例,说明了其导数并最终衍生至矩阵导数。
标量值函数的导数与梯度 (Scalar-valued Functions and the Gradient)
对于函数 $f: \mathbb{R}^n \to \mathbb{R}$,其微分 $df$ 是一个标量。根据线性代数的对偶性,任何将向量($dx$)映射到标量($df$)的线性算子,都可以用一个行向量来表示(即 $df = (\text{row vector}) \cdot dx$)。这个行向量就是导数 $f'(x)$。而我们更习惯使用其转置——列向量,并称之为梯度 $\nabla f$。
$$df = f'(x)[dx] = (\nabla f)^T dx$$
其中 $\nabla f = \begin{pmatrix} \frac{\partial f}{\partial x_1} & \frac{\partial f}{\partial x_2} & \cdots & \frac{\partial f}{\partial x_n} \end{pmatrix}^T$。
它的意义很明显:梯度 $\nabla f$ 指向函数值增长最快的方向,垂直于等高线。
考虑一个简单的例子:
对于二次型 $f(x) = x^T A x$,通过微分计算:
$$df = dx^T A x + x^T A dx = x^T(A + A^T) dx$$
因此,导数 $f'(x) = x^T(A + A^T)$(行向量),梯度 $\nabla f = (A + A^T)x$(列向量)。当 $A$ 对称时,简化为 $\nabla f = 2Ax$。
方法虽然简单,但这其实是直接对整体进行微分运算(如上例),而不是先展开成分量形式再求偏导。这种方法更优雅,更不易出错,并且能直接推广到矩阵。
向量值函数的导数与雅可比矩阵 (Vector-valued Functions and the Jacobian)
对于函数 $f: \mathbb{R}^n \to \mathbb{R}^m$,其微分 $df$ 是一个 $m$ 维向量。此时的导数线性算子 $f'(x)$ 必须是一个能将 $n$ 维向量 $dx$ 映射为 $m$ 维向量 $df$ 的 $m \times n$ 矩阵。这个矩阵就是雅可比矩阵(Jacobian Matrix) $J$。
$$df = J dx$$
其中 $J_{ij} = \frac{\partial f_i}{\partial x_j}$。
这块没啥好说的,现代和高数都有涉及
还是一个老生长谈的点:矩阵微积分中的乘积法则需要特别注意顺序,因为矩阵乘法不可交换。
$d(gh) = (dg)h + g(dh)$ 中 $dg$ 和 $h$ 可能都是矩阵,它们的乘法顺序不能颠倒
链式法则及其计算考量 (The Chain Rule and Computational Considerations)
结论很简单:链式法则在微分 notation 下表现为线性算子的复合(矩阵乘法)。若 $f(x) = g(h(x))$,则 $f'(x) = g'(h(x)) \circ h'(x)$。用矩阵表示即为:
$$J_f = J_g \cdot J_h$$
讲义在这块不止给出了基础内容,还对计算方式做出了一些延伸,因为虽然矩阵乘法满足结合律 $(AB)C = A(BC)$,但计算顺序会导致巨大的计算成本差异,因而合理选择计算模式是合理且必要的
计算模式在前文有所提及,即前向传播(Forward Mode)和反向(Backpropagation),此处不再赘述
矩阵的导数 (Beyond Multi-Variable: Derivatives of Matrix Functions)
千呼万唤始出来(
我们将上述框架应用于输入和输出便可得到矩阵的函数,最经典的便在于矩阵逆的推导:
利用 $AA^{-1} = I$ 且 $dI = 0$,两边微分:
$$d(AA^{-1}) = (dA)A^{-1} + A d(A^{-1}) = 0$$
解得:
$$d(A^{-1}) = -A^{-1} (dA) A^{-1}$$
参比一下前面不难发现,这里的导数是一个线性算子,它将输入扰动 $dA$ 映射到输出变化 $-A^{-1} (dA) A^{-1}$。这个结果无法简单地用一个“大矩阵”形式的雅可比来表示,但用微分形式表达却非常简洁和强大。
因此对于矩阵函数微分形式 $df = f'(A)[dA]$ 是表示导数的最通用和清晰的方式。如果需要将其向量化以进行计算,才会用到 Kronecker 积等工具。
什么?你说你不知道 Kronecker 积?去看上一篇文章
发表回复