前向求导算法
前向求导算法
在神经网络当中需要利用反向传播算法对神经网络进行训练
又或者利用梯度下降法求局部最优解
但是我们又不想去手动求导
对于复杂的函数求导是件很痛苦的事
所以像是pytorch这类神经网络框架都提供了自动求导,或者自动微分机制
这里就来介绍下一种最简单的自动求导算法:前向求导
首先我们定义$\epsilon$趋近于0,但是不等于0
因此
$\frac{f(x+\epsilon)-f(x)}{\epsilon}=f^{‘}(x)$
推导得
$f(x+\epsilon) = f(x) + f^{‘}(x)\epsilon$
更一般的
我们设二元数$a+b\epsilon$,则有
$f(a+b\epsilon) = f(a) + f^{‘}(a)b\epsilon$
至此我们就得到了一个求导的普遍公式
即
$f(a+b\epsilon) = f(a) + f^{‘}(a)b\epsilon$
其中$a\in R,b\in R,\epsilon\to0$
为了方便计算,我们设二元数$a+b\epsilon$
其有如下特征
$(a+b\epsilon)+(c+d\epsilon)=(a+c)+(b+d)\epsilon$
由于$\epsilon\to0$,所以我们可以认为$\epsilon^2=0$
类似于虚数单位$i^2=-1$
所以有乘法公式
$(a+b\epsilon)(c+d\epsilon)=ac+(ad+bc)\epsilon$
更进一步,根据$f(a+b\epsilon) = f(a) + f^{‘}(a)b\epsilon$可以推导得
$n^{(a+b\epsilon)} = n^a+(bn^a\ln{n})\epsilon,n\in R$
$(a+b\epsilon)^n = a^n + (nba^{n-1})\epsilon,n\in R$
这就意味着二元数$a+b\epsilon$满足所有的数学运算
只要我们已知函数$f(x)$
我们通过代入二元数$f(a+\epsilon)=f(a)+f^{‘}(a)\epsilon$
就能求得该点的函数值和导数
这就是前向求导算法
具体代码可有python实现
1 | import numpy as np |
