自动求梯度
【注】参考自邱锡鹏的《神经网络与深度学习》。
自动计算梯度的方法主要分为三类:数值微分、符号微分和自动微分。
1. 数值微分
1.1 原理
根据函数 在点 处的导数的定义:
通过给定一个很小的非零扰动 ,即可通过上述定义直接求出导数 。在实际应用中,为减小截断误差,常采用以下公式来计算梯度:
1.2 优缺点
- 优:实现简单
- 缺:计算出的导数的准确度依赖于 的选取,容易产生舍入误差和截断误差;同时,对于每个参数都需要单独施加扰动,计算梯度的复杂度较高,为 ,其中 为参数数量。
2. 符号微分
2.1 原理
符号微分是一种基于「符号计算」(也称为「代数计算」)的自动求导方式。符号计算的输入和输出都是数学表达式,一般包括对数学表达式的化简、因式分解、微分、积分、解代数方程、求解常微分方程等运算。
- 符号计算一般来讲是对输入的表达式,通过迭代或递归使用一些事先定义的规则进行转换。当转换结果不能再继续使用变换规则时,便停止计算。
2.2 优缺点
-
优:符号微分可以在编译时就计算梯度的数学表示,并进一步利用符号计算方法进行优化。此外,符号计算的一个优点是符号计算和平台无关,可以在 CPU 或 GPU 上运行。
-
缺:1)编译时间较长,特别是对于循环,需要很长时间进行编译;2)为了进行符号微分,一般需要设计一种专门的语言来表示数学表达式,并且要对变量(符号)进行预先声明;3)很难对程序进行调试。
3. 自动微分
3.1 原理
自动微分的基本原理是所有的数值计算可以分解为一些基本操作,包含 +, −, ×, / 和一些初等函数 exp, log, sin, cos 等,然后利用链式法则来自动计算一个复合函数的梯度。一般用「计算图」来图形化表示自动微分的过程。
- 按照计算导数的顺序,自动微分可以分为两种模式:前向模式和反向模式。
- 前向模式:前向模式是按计算图中计算方向的相同方向来递归地计算梯度。
- 反向模式:反向模式是按计算图中计算方向的相反方向来递归地计算梯度。
对于一般地函数形式
- 前向模式需要对每一个输入变量都进行一遍遍历,共需要 遍;
- 反向模式需要对每一个输出变量都进行一遍遍历,共需要 遍;
在前馈神经网络的参数学习中,风险函数为 ,故采用反向模式最为有效,即反向传播算法。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!