自动微分是一种高效且精准的求导技术,目前被广泛应用于机器学习领域。大多数的深度学习框架都应用了自动微分方法,如Tensorflow、Pytorch。
常见的计算机程序求导方法可以被分为以下四种:
- 手工微分(Manual Differentiation)
- 数值微分(Numerical Differentiation)
- 符号微分(Symbolic Differentiation)
- 自动微分(Automatic Differentiation)
手工微分
手工求解函数导数表达式(就像数学课里一样),在函数运行时根据输入值直接计算结果。这种方法工作量大且容易出错。
数值微分
根据倒数的定义通过差分近似方法来求导数。
数值微分容易实现,但存在精度误差问题:
近似计算的过程会引入截断误差(Truncation Error)。理论上h越小,截断误差越小。但实际情况由于计算机对浮点数的计算精度有限,当h减小时,会引入舍入误差(Round-off Error),舍入误差会随着h变小而逐渐增大。当h较大时,截断误差占主导,当h较小时,舍入误差占主导。
符号微分
利用如下数学规则对函数表达式进行递归变换来求导。符号微分也存在于部分的机器学习框架中,如Theano。
符号微分虽然克服了手工编吗的缺陷,但也有问题存在:
- 对表达式进行了严格的递归变换和展开,而且产生的变换结果无法复用,容易产生表达式膨胀(Expression Swell)。
- 符号微分要求表达式被定义成闭合式(closed-form)的,不能带有或者严格限制控制流的语句表达,会很大程度上限制机器学习框架网络的设计与表达。
自动微分
自动微分是一种介于数值微分和符号微分之间的方法。
基本思想:将计算机程序中的运算操作分解为一个有限的基本操作集合,且集合中基本操作的求导规则已知,在完成每一个基本操作的求导之后,使用链式法则得到整体程序的求导结果。
自动微分比数值微分更精确,比符号微分更灵活。避免了表达式膨胀的问题,并且可以处理分支、循环、递归等控制流语句。
参考:《机器学习系统设计和实现》