大家好,我是董董灿。
今天简单说一下自动微分这个概念。之前在查看华为MindSpore资料时,看到了MindSpore的软件流程图中,有一项是自动微分技术。
而我们学AI算法,或者说深度学习算法,肯定都离不开自动微分技术。
虽然大部分同学可能没有正面接触过这个技术,但是在进行网络训练的时候,这个技术肯定都是默默的隐藏在深度学习框架中,默默的完成梯度的更新。
自动微分或许不引人关注,但肯定很重要。
其实不光是华为的MindSpore,其他的框架如TensorFlow,PyTorch等深度学习框架,也都支持自动微分技术。
说到微分,其实很好理解,简单的说就是求导。
而自动微分,则是计算机借助程序自动求出一个函数导数的方法。在深度学习中,通常指对网络模型的自动求导,通过梯度反向传播完成对网络权重的优化。
那为什么要做自动微分呢? 一说到微分,我们第一反应肯定是手动推导计算微积分。毕竟,我们学习的高数知识还没有完全还给老师。
简单的函数,通过手动计算它的导数是可以实现的,比如 y = x^2 导数就是 f = 2x。
但是复杂的函数,比如高次方程高维数据的复合函数,先不说手动计算能不能算出来,即使算出来了,这效率和出错概率,也让人害怕。比如下面的这个,手动推导就已经很复杂了。
手动计算是一种最简单最好理解的微分方法,也就是手动微分。
除了手动微分之外,还有数值微分和符号微分(这俩以后再介绍)。而自动微分是一种介于数值微分与符号微分之间的一种求导方法。
自动微分的核心思想是将计算机程序中的一个复杂运算操作分解为一个有限的基本操作合集,且合集中基本操作的求导规则均为已知的。在完成每一个基本操作的求导后,使用链式求导法则将结果组合得到整体程序的求导结果。
一个通俗点但不严谨的表述就是,自动微分将AI模型中的很复杂的算法分解为一个个基本操作,比如乘法,平方等。然后利用链式求导法则,从最基本的运算开始求导,一步步完成整个复杂运算的求导。
这样,一旦有了自动微分的技术加持,AI模型再复杂,运算量再庞大,也不需要我们手动针对复杂运算编码来进行求导了。通过自动微分的技术将复杂求导过程分解,一步步,最终完成整个算法的求导过程。
这也是为什么,自动微分技术几乎成为了各大深度学习框架的标配。
这有点像算法中的分治算法。将一个复杂的问题分解成多个小问题,然后各个击破。
或者说有点像我们学过的数学归纳法,先证明n=1成立,然后证明如果 n = x 成立时, n = x + 1也成立,那么就可以归纳推导出,n 等于任意数都成立。
不得不说,经典的数学思想真是无处不在。