数值求导()

有限差分(finite-difference)

由于有效数字位数只有52位,指数越大,有效数字的最低位对应的大小就越大。举例来说,1015与其浮点数表示相差大约1,而1与其浮点数表示相差大约10-15。因此,误差不只和差分计算的当前点和前面的点的距离d有关,还与计算机的相对精度u有关。

L表示二阶导数的界限,Lf表示函数值的界限。在前向差分的计算中,同时考虑d和u,求误差相对于d和u的导数,可知当d2=4Lfu/L时,误差最小。实际应用中,我们假设4Lfu/L不会太大也不会太小,所以取d2=u即可。

前向差分(forward-difference),计算了当前点和前面的点的函数值。中心差分(central-difference)计算了前面的点和后面的点的函数值。假设x是N维向量,那么前向差分需要计算 N+1 次函数值,而中心差分则需要计算 2N 次函数值。可见,中心差分精度高的代价是计算量大,实际使用时需要有所取舍。


自动求导

自动求导不计算解析解,而是利用链式法则将复杂的函数拆分成一个个独立的计算单元,分别对这些小单元求导,最后再合并得到完整的导数。将函数拆分为多个计算单元后,我们称之为计算图(computational graph),这是一个有向无环图,标记了数据的流向。
自动求导的优点在于可以精确计算复杂函数的导数,且用户无需手动推导导数公式。然而,自动求导可能需要较多的计算资源,特别是在处理大规模计算图时。

前向模式(forward mode)

在前向传播的过程中,如果我们不仅计算中间节点的函数值,同时也计算它相对于所有输入数据的偏导数。前向模式适合于输入变量多于输出变量的情况。

逆向模式(reverse mode)

在深度学习以及大部分优化问题中,目标函数都是标量函数,自变量很多,但函数值只有一个。这种情况下,使用前向模式,就会导致前面所述的大量冗余计算。如果使用逆向模式,每次计算只需考虑该节点真实的后继节点,不存在冗余。

逆向模式由一次前向扫描(forward sweep)和一次逆向扫描(reverse sweep)完成。

前向扫描负责建立计算图、计算并缓存所有必要的前向值,为随后的梯度计算和反向传播过程做准备。这一步骤是整个自动求导过程中不可或缺的一部分,确保了梯度计算的正确性和效率。

在逆向扫描的过程中,从后往前计算导数。


符号求导/解析求导

符号求导是通过数学符号操作来求解函数导数的精确表达式,是一种直接用计算机计算导数解析解的方法。它依赖于符号计算软件(如Mathematica、Maple、SymPy等)来进行。符号求导的优点是可以得到导数的精确表达式,适用于需要精确数学表达式的场合,如数学建模、理论分析等。缺点是符号求导在处理非常复杂的函数时可能变得非常困难,且在某些情况下可能无法找到封闭形式的解。