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