自动求导
当前深度学习框架给深度学习的研究和应用带了诸多方便,其中之一就是让使用者不必关心求导计算,而是专注于于自己的工作。 那么面对复杂的网络结构,框架是如何完成求导的?
Numeratical differentiation
源
回到导数最基础的定义
h选的足够小,就可以逼近 f(x) f ( x ) 的导数,但这种方式的缺陷是 h h 不易选择:太大则结果误差增大,太小就要面对计算机浮点误差。 不过这种方法因为简单明了,可以用来做校验,给出一组实验数据,用这种方法计算出梯度,和其他方法得到的梯度做比较,差异小于给定的阈值,则认为两种计算梯度的方法一致。
Symbolic differentiation
源
常见函数的导数都有形式解(比如三角函数,指数函数,对数函数等),把形式解都硬编码到程序中,站在用户的角度自然可以实现自动求导。目前这应该是使用最广的自动求导方法,很多框架在自定义的运算中,只需要用户提供forward/backward两个接口即可,就是同样的道理。
dual numbers
源
dual number是虚数的推广,通过定义一组其上的运算规则,就可以用来计算给定函数的导数。这个感觉很有技术含量,没有详细研究,给出一个多项式求导的例子
其中b可以任意值,自然为了自动求导,此处可以选择
ϵ
ϵ
就是dual number,必须满足
ϵ2=0
ϵ
2
=
0
PS: 不知道哪个框架用了这种方法自动求导