微积分——自动微分

梯度降低法(Gradient Descendent)是机器学习的核心算法之一,自动微分则是梯度降低法的核心;
  梯度降低法用于求损失函数的最优值,前面的文章中咱们说过梯度降低是经过计算参数与损失函数的梯度并在梯度的方向不断迭代求得极值;可是在机器学习、深度学习中不少求导每每是很复杂的,手动使用链式法则求导很容易出错,借助于计算机也只能是硬编码;
  这时候就须要借助于自动微分了,求导主要有这么四种:手动微分法数值微分法符号微分法自动微分法,这里分别说说这几种求导方法;算法

手动微分法(Manual Differentiation)
  手动微分法须要咱们手动编写出代价函数激活函数的求导代码,硬编码这些函数的求导方法,若是这些函数后面有调整该函数的求导方法又要从新实现,能够说是又麻烦又容易出错;
数值微分法(Numerical Differentiation)
  经过使用函数值来估计函数的导数,该方法主要是计算速度慢,精度差等问题;
符号微分法(Symbolic Differentiation)
  符号微分普遍用在各类数学软件中如Matlab、Octave等,它通关过使用符号表达式进行求导,符号微分是基于求导法则进行的;框架

  如表达式:f(x) = 2y + x^2
  表达式树为:
    机器学习

  经过符号微分法求得:函数

  

  符号微分有个缺陷就是获得的导数不必定是最简的,函数较为复杂时表达式树会很复杂,可能会出现表达式爆炸的状况出现;性能

自动微分法(Autodiff)

  自动微分法介于数值微分符号微分 之间,数值微分是直接代入数值近似求解而符号微分为直接经过表达式树对表达式进行求解;自动微分先将符号微分用于基本的算子,带入数值并保存中间结果,后应用于整个函数;自动微分本质上就是图计算,容易作不少优化因此普遍应用于各类机器学习深度学习框架中;
  自动微分又分为前向模式(Forward mode Autodiff)反向模式(Reverse-Mode Atuodiff)求导;学习

前向模式(Forward mode Autodiff)

  前向模式引入二元数(dual number),同时会先将表达式转换为计算图而后会依次从下往上计算每一步的导数,因为每步都使用了上一步的导数因此不会致使重复计算不会出现像符号微分同样的表达式膨胀问题,但因为深度学习的参数比较多因此前向模式的效率仍是有些差;一个前向过程就能够求出其函数值与导数,下面简单举个例子:优化

  二元数:a+bꜫ
  a与b都是实数,ꜫ为无穷小的数,且ꜫ^2=0,并知足加分与乘法法则,且还有:
    编码

  这样是要求出f( a+ꜫ)就能够得出f(a)与f(a)的导数;
  仍是上面的表达式:f(x) = 2y + x^2.net

    

  如上图当x=2,y=3时,咱们能够得出:二元数 10+4ꜫ,即函数f(x)关于x的偏导数为:4,函数值为10;3d

反向模式(Reverse mode autodiff)

  反向模式为先经过正向遍历计算图求出每一个节点的值,而后经过反向遍历整个图,计算出每一个节点的偏导,其原理为微积分链式法则,这里所说的反向模式其实也就是咱们在深度学习中所说的BP算法(反向传播算法),只须要一个前向传播、一个反向传播就能够求得全部参数的导数,因此性能很高,很是适用于深度学习中的自动求导;

          

  上图为通过反向传播的计算图,根据链式法则:

  正如上面所说的,通过一次正向传播求出全部的节点值后再通过一次反向传播就求得了全部输入参数的导数效率很高,并且避免符号微分、数值微分所带来的问题;目前Tensoflow、MXNet等深度学习框架中也都使用了反向模式实现自动微分只是各类具体算法仍是有很多差别;

文章首发地址:Solinx
http://www.solinx.co/archives/1177

参考资料:
https://blog.csdn.net/aws3217150/article/details/70214422
https://arxiv.org/pdf/1502.05767.pdf

相关文章
相关标签/搜索