- 介绍
- 核心原理
- 矢量求导
- 矩阵求导
- 链式法则
这篇博文推导了矢量情形下, 标量函数对矢量进行求导的微分法则,从定义出发推导了链式法则的形式。
核心原理核心原理: 标量情形下, 由中学的标量求导知识可知,忽略泰勒展开高次项,有: Δ f ( x ) = f ′ ( x ) Δ x \Delta f(x) = {f^{'}}(x) \Delta x Δf(x)=f′(x)Δx 即, 函数变化量 = 导数 * 变量变化量。
拓展到多变量情形下,显然有类似的: Δ f ( x , y ) = f ′ ( x ) Δ x + f ′ ( y ) Δ y \Delta f(x,y) = {f^{'}}(x)\Delta x + {f^{'}}(y)\Delta y Δf(x,y)=f′(x)Δx+f′(y)Δy。
矢量求导而一个矢量,可以看做多个标量的组合,如有矢量 x = [ x 1 x 2 ] \mathbf{x}=\left[\begin{array}{l}{x_{1}} \\ {x_{2}}\end{array}\right] x=[x1x2] f ( x ) f(\mathbf{x}) f(x)是以矢量 x \mathbf{x} x为变量的标量函数, 那么根据上面的知识,有:
Δ f ( x ) = f ′ ( x 1 ) Δ x 1 + f ′ ( x 2 ) Δ x 2 \Delta f(\mathbf{x}) = {f^{'}}(x_1)\Delta x_1 + {f^{'}}(x_2)\Delta x_2 Δf(x)=f′(x1)Δx1+f′(x2)Δx2
利用线性代数知识,可以将其写为矩阵形式: Δ f ( x ) = [ f ′ ( x 1 ) f ′ ( x 2 ) ] × [ Δ x 1 Δ x 2 ] \Delta f(\mathbf{x}) = \left[\begin{array}{ll}{{f^{'}}(x_1)} & {{f^{'}}(x_2)}\end{array}\right] \times \left[\begin{array}{l}{\Delta x_{1}} \\ {\Delta x_{2}}\end{array}\right] Δf(x)=[f′(x1)f′(x2)]×[Δx1Δx2]
其中, f ′ ( x 1 ) {f^{'}}(x_1) f′(x1)是一个多变量函数对单变量求导的结果,也被称为偏微分, 可写为: f ′ ( x 1 ) = ∂ f ( x ) ∂ x 1 {{f^{'}}(x_1)}=\frac{{\partial f({\bf{x}})}}{{\partial {x_1}}} f′(x1)=∂x1∂f(x) 同理, f ′ ( x 2 ) = ∂ f ( x ) ∂ x 2 {{f^{'}}(x_2)}=\frac{{\partial f({\bf{x}})}}{{\partial {x_2}}} f′(x2)=∂x2∂f(x) 变化量的 Δ \Delta Δ符号往往用 d \mathbf{d} d代替,利用这些表示,式子可以改写为:
d f ( x ) = [ ∂ f ( x ) ∂ x 1 ∂ f ( x ) ∂ x 2 ] × [ d x 1 d x 2 ] \mathbf{d} f(\mathbf{x}) = \left[\begin{array}{ll}{\frac{{\partial f({\bf{x}})}}{{\partial {x_1}}}} & {\frac{{\partial f({\bf{x}})}}{{\partial {x_2}}}}\end{array}\right] \times \left[\begin{array}{l}{\mathbf{d}x_{1}} \\ {\mathbf{d} x_{2}}\end{array}\right] df(x)=[∂x1∂f(x)∂x2∂f(x)]×[dx1dx2].
注意到,根据矢量微分的定义,标量函数对一个矢量求导的结果可表示为: ∇ x f ( x ) = [ ∂ f ( x ) ∂ x 1 ∂ f ( x ) ∂ x 2 ] \nabla_{\mathbf{x}}f(\mathbf{x})= \left[\begin{array}{l}{\frac{{\partial f({\bf{x}})}}{{\partial {x_1}}}} \\ {\frac{{\partial f({\bf{x}})}}{{\partial {x_2}}}}\end{array}\right] ∇xf(x)=[∂x1∂f(x)∂x2∂f(x)]
上式也被称为函数 f ( x ) f(\mathbf{x}) f(x)对于 x \mathbf{x} x的梯度。 利用这一定义,可以进一步的: d f ( x ) = ∇ x f ( x ) T d x \mathbf{d} f(\mathbf{x}) =\nabla_{\mathbf{x}}f(\mathbf{x})^T\mathbf{d} \mathbf{x} df(x)=∇xf(x)Tdx. 其中, d x = [ d x 1 d x 2 ] \mathbf{d} \mathbf{x}=\left[\begin{array}{l}{\mathbf{d}x_{1}} \\ {\mathbf{d} x_{2}}\end{array}\right] dx=[dx1dx2], 上式也被称为对矢量 x \mathbf{x} x的全微分。
注意,为了便于理解,笔者以一个 2 × 1 2\times1 2×1的矢量举例,但无疑,类似的过程可以推导出N维矢量的结论,从而统一为上式的表示。
矩阵求导严格来说,矩阵也是矢量的一种。在许多时候,对于一个变量为 x × y x\times y x×y的矩阵的求导问题,我们常用的处理方式是可以将其列化为 x y ∗ 1 xy*1 xy∗1的向量,再对其进行求导。为了便于理解,笔者同样以一个最简单的 2 × 2 2\times2 2×2矩阵 X \mathbf{X} X举例了: X = [ x 1 x 3 x 2 x 4 ] \mathbf{X}=\left[\begin{array}{ll}{x_1} & {x_3} \\ {x_2} & {x_4}\end{array}\right] X=[x1x2x3x4] 根据定义(可以搜索维基百科),矩阵的求导(梯度)可以表示为: ∇ X f ( X ) = [ ∂ f ∂ x 1 ∂ f ∂ x 3 ∂ f ∂ x 2 ∂ f ∂ x 4 ] \nabla_{\mathbf{X}}f(\mathbf{X})=\left[\begin{array}{ll}{\frac{\partial f}{\partial x_{1}}} & {\frac{\partial f}{\partial x_{3}}} \\ {\frac{\partial f}{\partial x_{2}}} & {\frac{\partial f}{\partial x_{4}}}\end{array}\right] ∇Xf(X)=[∂x1∂f∂x2∂f∂x3∂f∂x4∂f]. 而如果对 X \mathbf{X} X进行列化的话,求得的向量梯度中包含的元素,刚好对应了矩阵梯度的元素。 也就是说,一种解决的思路是:
- 将矩阵变量列化为向量
- 利用向量求导的结论,求出梯度
- 将向量梯度矩阵化,就是所求的矩阵梯度。
这个方法非常有效,但有些时候,矩阵变量不容易向量化,如目标函数是矩阵的逆的时候。那么,我们可以按照上节的写法,推广到矩阵的形式,有:
d f ( X ) = t r ( ∇ X f ( X ) T d X ) \mathbf{d} f(\mathbf{X}) =\mathrm{tr}(\nabla_{\mathbf{X}}f(\mathbf{X})^T\mathbf{d} \mathbf{X}) df(X)=tr(∇Xf(X)TdX). 这个读者可以自己推导一下,和上节的原理一致,由于线性代数的原因,在矩阵情况下会多一个tr(trace)。
链式法则先讨论实数的情况: 标量情形下,我们知道,若 f ( x ) = f ( g ( x ) ) f(x) =f(g(x)) f(x)=f(g(x)), 那么 f ′ ( x ) = f ′ ( g ) × g ′ ( x ) f^{'}(x)=f^{'}(g)\times g^{'}(x) f′(x)=f′(g)×g′(x). 多维情况下,根据之前的类似思想,也可以推导结果,但这里我们使用上面讲述的方法
假设标量函数 f ( x ) f(x) f(x), 中间变量矢量 g \mathbf{g} g, 变量 x \mathbf{x} x. 根据上面推导:
d f ( g ) = ∇ g f ( g ) T d g \mathbf{d} f(\mathbf{g}) =\nabla_{\mathbf{g}}f(\mathbf{g})^T\mathbf{d} \mathbf{g} df(g)=∇gf(g)Tdg. d g = ∇ x T g ( x ) d x \mathbf{d} \mathbf{g} = \nabla_{\mathbf{x^T}}\mathbf{g}(\mathbf{x})\mathbf{d} \mathbf{x} dg=∇xTg(x)dx (之前没有讨论矢量对矢量微分的情形,但显然很容易从标量函数情形推广) 因此有: d f ( g ) = ∇ g f ( g ) T ∇ x T g ( x ) d x \mathbf{d} f(\mathbf{g}) =\nabla_{\mathbf{g}}f(\mathbf{g})^T \nabla_{\mathbf{x^T}}\mathbf{g}(\mathbf{x})\mathbf{d} \mathbf{x} df(g)=∇gf(g)T∇xTg(x)dx.
可得:
∇ x f ( x ) = ( ∇ g f ( g ) T ∇ x T g ( x ) ) T = ∇ x g T × ∇ g f ( g ) \nabla_{\mathbf{x}}f(\mathbf{x}) = (\nabla_{\mathbf{g}}f(\mathbf{g})^T \nabla_{\mathbf{x^T}}\mathbf{g}(\mathbf{x}))^T= \nabla_{\mathbf{x}}\mathbf{g}^T\times \nabla_{\mathbf{g}}f(\mathbf{g}) ∇xf(x)=(∇gf(g)T∇xTg(x))T=∇xgT×∇gf(g).
最后,总结下多种情形链式法则的结论,推导过程均可由上面过程拓展:
- 标量 f f f, 矢量 g \mathbf{g} g, 标量 x x x ∇ x f ( x ) = ∂ f ∂ x = ∂ f ∂ g T × ∂ g ∂ x \nabla_{x}f(x) =\frac{{\partial f}}{{\partial x}}=\frac{{\partial f}}{{\partial {\mathbf{g}^T}}} \times \frac{{\partial \mathbf{g}}}{{\partial x}} ∇xf(x)=∂x∂f=∂gT∂f×∂x∂g *标量 f f f, 矢量 g g g, 矢量 x x x ∂ f ∂ x = ∂ g T ∂ x × ∂ f ∂ g \frac{{\partial f}}{{\partial \mathbf{x}}}=\frac{{\partial \mathbf{g}^T}}{{\partial \mathbf{x}}}\times \frac{{\partial f}}{{\partial {\mathbf{g}}}} ∂x∂f=∂x∂gT×∂g∂f *矢量 f f f, 矢量 g g g, 矢量 x x x ∂ f ∂ x = ∂ g T ∂ x × ∂ f ∂ g \frac{{\partial \mathbf{f}}}{{\partial \mathbf{x}}}=\frac{{\partial \mathbf{g}^T}}{{\partial \mathbf{x}}}\times \frac{{\partial \mathbf{f}}}{{\partial {\mathbf{g}}}} ∂x∂f=∂x∂gT×∂g∂f *标量 f f f, 矩阵 g g g, 标量 x x x ∂ f ∂ x = t r ( ∂ f ∂ g T ∂ g ∂ x ) \frac{{\partial f}}{{\partial x}}= \mathrm{tr}(\frac{{\partial f}}{{\partial {\mathbf{g}^T}}} \frac{{\partial \mathbf{g}}}{{\partial x}}) ∂x∂f=tr(∂gT∂f∂x∂g)