优化是指找到最小化(或最大化)目标函数的设计点。获得一个函数的值如何随着输入的变化而变化是有用的,因为它告诉我们在哪个方向上我们可以改进之前的点,函数值的变化是通过单变量函数的导数和多变量函数的梯度来度量的。
01 求导数的方法
1-1 有限差分方法
通过计算函数在某一点的邻近点处的值的差分,来近似导数,主要包括前向差分、后向差分和中心差分三种形式。
理论上,步长h越小,通过有限差分法求得的导数值越精确。但实际上由于计算机存储的精度有限,h的值太小会导致数值抵消误差反而使导数计算精度下降。
1-2 复数步进法
复数步进法通过单个函数求值绕过了减法消去的影响,只需在虚方向上走一步之后对函数求一次值。
函数在虚数部分的展开为:
f
(
x
+
i
h
)
=
f
(
x
)
+
i
h
f
′
(
x
)
−
h
2
f
′
′
(
x
)
2
!
−
i
h
3
f
′
′
′
(
x
)
3
!
+
⋯
(1)
f(x+ih)=f(x)+ihf'(x)-h^2\frac{f''(x)}{2!}-ih^3\frac{f'''(x)}{3!}+\cdots \tag1
f(x+ih)=f(x)+ihf′(x)−h22!f′′(x)−ih33!f′′′(x)+⋯(1)
仅考虑虚数部分,上式化为:
I
m
(
f
(
x
+
i
h
)
)
=
h
f
′
(
x
)
−
h
3
f
′
′
′
(
x
)
3
!
+
⋯
⇒
f
′
(
x
)
=
I
m
f
(
x
+
i
h
)
h
+
h
2
f
′
′
′
(
x
)
3
!
−
⋯
=
I
m
(
f
(
x
+
i
h
)
)
h
+
O
(
h
2
)
a
s
h
→
0
(2)
\begin{align} Im(f(x+ih))=&hf'(x) -h^3\frac{f'''(x)}{3!}+\cdots \\ \Rightarrow f'(x)= & \frac{Imf(x+ih)}{h}+h^2\frac{f'''(x)}{3!}-\cdots \\ = &\frac{Im(f(x+ih))}{h} + O(h^2) \ as \ h\rightarrow0 \end {align} \tag2
Im(f(x+ih))=⇒f′(x)==hf′(x)−h33!f′′′(x)+⋯hImf(x+ih)+h23!f′′′(x)−⋯hIm(f(x+ih))+O(h2) as h→0(2)
由上式可以求得导数值,而且避免了有限差分法的分子相减过程。
同时(1)式的实数部分为:
R
e
(
f
(
x
+
i
h
)
)
=
f
(
x
)
−
h
2
f
′
′
(
x
)
2
!
+
⋯
⇒
f
(
x
)
=
R
e
f
(
x
+
i
h
)
h
+
h
2
f
′
′
′
(
x
)
2
!
−
⋯
(3)
\begin{align} Re(f(x+ih))=&f(x) -h^2\frac{f''(x)}{2!}+\cdots \\ \Rightarrow f(x)= & \frac{Ref(x+ih)}{h}+h^2\frac{f'''(x)}{2!}-\cdots \end {align} \tag3
Re(f(x+ih))=⇒f(x)=f(x)−h22!f′′(x)+⋯hRef(x+ih)+h22!f′′′(x)−⋯(3)
因此仅通过计算
f
(
x
+
i
h
)
f(x+ih)
f(x+ih) 可以同时获得
f
′
(
x
)
f'(x)
f′(x) 和
f
(
x
)
f(x)
f(x) 的值。
1-3 自动微分法
自动微分技术的关键是链式法则的应用。自动微分过程可以通过使用计算图实现自动化,计算图表示一个函数,其中节点是操作,边是输入输出关系。计算图的叶节点是输入变量或常量,终端节点是函数输出的值。图2是函数 f ( a , b ) = l n ( a b + m a x ( a , 2 ) f(a, b)=ln(ab+max(a,2) f(a,b)=ln(ab+max(a,2) 的计算图。
利用函数的计算图进行自动微分有两种模式。正向传播模式使用对偶数,并从输入遍历树到输出,而反向传播需要反向通过计算图。
(1)正向传播
以函数 f ( a , b ) = l n ( a b + m a x ( a , 2 ) f(a, b)=ln(ab+max(a,2) f(a,b)=ln(ab+max(a,2) 为例进行说明,计算该函数在 a = 3 , b = 2 a=3,b=2 a=3,b=2 处关于 a a a 的偏导数值:
- 第一步:传播过程从图的输入节点开始,该节点由函数输入和任意常数值组成。对于这些节点中的每一个输入变量,计算关于 a a a 的偏导数值,如图3所示;
- 第二步:沿着树向下,一次一个节点,选择输入已经被计算过的节点作为下一个节点。通过传递前一个节点的值来计算下一个节点的值,使用前一个节点的值和它们的偏导数来计算 a a a 的局部偏导数,如图4所示。从而通过一次正向传播获得 ∂ f ∂ a \frac{\partial f}{\partial a} ∂a∂f 的值。
上述过程可以通过计算机编程方便地实现自动化,从而自动对每个节点操作来产生函数关于某变量的函数值及其导数,这是通过引入“对偶数”实现的。
对偶数(Dual numbers)是一种数学概念,扩展了实数的概念,类似于复数的结构。对偶数系统中的每个数可以表示为 a + b ε a+b\varepsilon a+bε 的形式,其中 a a a 和 b b b 是实数,而 ε \varepsilon ε 是对偶单位,满足 ( ε 2 = 0 \varepsilon^2=0 ε2=0)(注意这与复数中的虚数单位 i i i 满足 i 2 = − 1 i^2=-1 i2=−1,不同)。
对偶数的一些基本性质包括:
- 加法:对偶数加法遵循分量加法的规则,即 ( a + b ε ) + ( c + d ε ) = ( a + c ) + ( b + d ) ε (a+b\varepsilon)+(c+d\varepsilon)=(a+c)+(b+d)\varepsilon (a+bε)+(c+dε)=(a+c)+(b+d)ε。
- 乘法:对偶数的乘法利用分配律和 ε 2 = 0 \varepsilon^2=0 ε2=0 的规则,即 ( a + b ε ) ⋅ ( c + d ε ) = a c + ( a d + b c ) ε (a+b\varepsilon)\cdot(c+d\varepsilon)=ac+(ad+bc)\varepsilon (a+bε)⋅(c+dε)=ac+(ad+bc)ε。
- 导数表示:对偶数特别有用的一个性质是它们可以用来表示函数关于变量的值和计算导数。如果有一个函数 R → R \mathbb{R}\rightarrow\mathbb{R} R→R,那么该函数在对偶数上的扩展 f ~ ( a + b ε ) = f ( a ) + f ′ ( a ) b ε \tilde{f}(a+b\varepsilon)=f(a)+f'(a)b\varepsilon f~(a+bε)=f(a)+f′(a)bε 利用了对偶数的性质来直接给出函数在 a a a点的值和导数。
(2)反向传播
为了计算一个n维函数的梯度,正向传播需要n次得到关于每个变量的导数后才能得到梯度,而反向传播只需要一轮运行就能求出梯度,但反向传播一轮运行需要两次遍历计算图:首先向前传播,在此期间计算必要的中间值,然后向后传播以计算梯度值。(当需要计算多元函数梯度时,反向传播通常比正向传播更可取)
仍以函数 f ( a , b ) = l n ( a b + m a x ( a , 2 ) f(a, b)=ln(ab+max(a,2) f(a,b)=ln(ab+max(a,2) 为例进行说明,用反向传播计算该函数在 a = 3 , b = 2 a=3,b=2 a=3,b=2 处的梯度:
- 第一步:首先正向传播过一次,从图的输入节点开始,获得中间值及导数程,如图5所示;
- 第二步:再反向传播,通过链式法则一次获得关于各个变量的导数,从而获得梯度,如图6所示。
参考文献
[1] Kochenderfer M J, Wheeler T A. Algorithms for optimization[M]. Mit Press, 2019.