现代深度学习系统中(比如MXNet TensorFlow等)都用到了一种技术——自动微分式子。在此之前机器学习社区中很少发挥这个利器,一般都是用Backpropagation进行梯度求解然后进行SGD等进行优化哽新。手动实现过backprop算法的同学应该可以体会到其中的复杂性和易错性一个好的框架应该可以很好地将这部分难点隐藏于用户视角,而自動微分式子技术恰好可以优雅解决这个问题接下来我们将一起学习这个优雅的技术:-)。本文主要来源于陈天奇在华盛顿任教的课程和《》
微分式子求解大致可以分为4种方式:
为了讲明白什么是自动微分式子,我们有必要了解其他方法做到有区分有对比,从而更加深入理解自动微分式子技术
手动求解其实就对应我们传统的backprop算法,我们求解出梯度公式然后编写代码,代入实际数值得出真实的梯度。在這样的方式下每一次我们修改算法模型,都要修改对应的梯度求解算法因此没有很好的办法解脱用户手动编写梯度求解的代码,这也昰为什么我们需要自动微分式子技术的原因
数值微分式子法是根据导数的原始定义:
h取很小的数值,比如0.0001那么我们可以很方便求解导數,并且可以对用户隐藏求解过程用户只要给出目标函数和要求解的梯度的变量,程序可以自动给出相应的梯度这也是某种意义上的“自动微分式子”?。不幸的是,数值微分式子法计算量太大,求解速度是这四种方法中最慢的,更加雪上加霜的是它引起的和使其更加不具备实际应用场景,为了弥补缺点便有如下center
符號微分式子是代替我们第一种手动求解法的过程,利用代数软件实现微分式子的一些公式比如:
为什么隐函数y求导后的式子可以帶y而其他的不行,得化作x的式子