自动求梯度

【注】参考自邱锡鹏的《神经网络与深度学习》。
自动计算梯度的方法主要分为三类:数值微分、符号微分和自动微分。

1. 数值微分

1.1 原理

根据函数 f(x)f(x) 在点 xx 处的导数的定义:

f(x)=limΔx0f(x+Δx)f(x)Δx\begin{array}{c} f^{'}(x) = \lim_{\Delta x \rightarrow 0} \frac{f(x+\Delta x) - f(x)}{\Delta x} \end{array}

通过给定一个很小的非零扰动 Δx\Delta x,即可通过上述定义直接求出导数 f(x)f^{'}(x)。在实际应用中,为减小截断误差,常采用以下公式来计算梯度:

f(x)=limΔx0f(x+Δx)f(xΔx)2Δx\begin{array}{c} f^{'}(x) = \lim_{\Delta x \rightarrow 0} \frac{f(x+\Delta x)-f(x-\Delta x)}{2\Delta x} \end{array}

1.2 优缺点

  • 优:实现简单
  • 缺:计算出的导数的准确度依赖于 Δx\Delta x 的选取,容易产生舍入误差和截断误差;同时,对于每个参数都需要单独施加扰动,计算梯度的复杂度较高,为 O(N2)O(N^2),其中 NN 为参数数量。

2. 符号微分

2.1 原理

符号微分是一种基于「符号计算」(也称为「代数计算」)的自动求导方式。符号计算的输入和输出都是数学表达式,一般包括对数学表达式的化简、因式分解、微分、积分、解代数方程、求解常微分方程等运算。

  • 符号计算一般来讲是对输入的表达式,通过迭代或递归使用一些事先定义的规则进行转换。当转换结果不能再继续使用变换规则时,便停止计算。

2.2 优缺点

  • 优:符号微分可以在编译时就计算梯度的数学表示,并进一步利用符号计算方法进行优化。此外,符号计算的一个优点是符号计算和平台无关,可以在 CPU 或 GPU 上运行。

  • 缺:1)编译时间较长,特别是对于循环,需要很长时间进行编译;2)为了进行符号微分,一般需要设计一种专门的语言来表示数学表达式,并且要对变量(符号)进行预先声明;3)很难对程序进行调试。

3. 自动微分

3.1 原理

自动微分的基本原理是所有的数值计算可以分解为一些基本操作,包含 +, −, ×, / 和一些初等函数 exp, log, sin, cos 等,然后利用链式法则来自动计算一个复合函数的梯度。一般用「计算图」来图形化表示自动微分的过程。

  • 按照计算导数的顺序,自动微分可以分为两种模式:前向模式和反向模式。
  1. 前向模式:前向模式是按计算图中计算方向的相同方向来递归地计算梯度。
  2. 反向模式:反向模式是按计算图中计算方向的相反方向来递归地计算梯度。

对于一般地函数形式 f:RNRM f: \mathbb{R}^N \rightarrow \mathbb{R}^M

  • 前向模式需要对每一个输入变量都进行一遍遍历,共需要 NN 遍;
  • 反向模式需要对每一个输出变量都进行一遍遍历,共需要 MM 遍;

在前馈神经网络的参数学习中,风险函数为 f:RNR f: \mathbb{R}^N \rightarrow \mathbb{R} ,故采用反向模式最为有效,即反向传播算法


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!