September 23, 2017
by Frank
机器学习算法通常需要大量的数值计算,即通过迭代求解近似值而非求得解析解。这些算法通常包括最优化和线性方程组的求解,在计算机中要通过有限位来表示各种浮点数是具有一定误差的,需要通过一些方法来保证我们的计算精度。##上溢与下溢
机器学习算法通常需要大量的数值计算,即通过迭代求解近似值而非求得解析解。这些算法通常包括最优化和线性方程组的求解,在计算机中要通过有限位来表示各种浮点数是具有一定误差的,需要通过一些方法来保证我们的计算精度。##上溢与下溢 上溢(overflow)是具有破坏力的,当大量级的数被近似为或者时会发生上溢,这会导致在下一步的计算中,数字变成非数字。 下溢(underflow)同样也是毁灭性的,即当浮点数很小时被四舍五入为 0,有时候 0 和非 0 具有完全不同的性质,这样可能会导致分母为 0 等错误现象的发生。
可以通过 softmax 函数来避免上溢与下溢的发生:
为了方便讨论,假设中的每个元素,当很大时,分子可能会上溢,同样的当很小时分母会下溢。这两个问题可以通过计算解决,其中,这样的话中的每个元素最大为 0,分子不可能会发生上溢,至于分母,其中最少有一个值为 1 的分量,而其它元素都是非负的,所以分母也不可能发生下溢。这样便能解决溢出的问题。##病态条件 条件数指的是函数相对于输入的微小变化而变化的快慢程度。输入的轻微扰动而导致函数的迅速变化对于数值计算是有问题的。对于函数,当具有特征值分解的时候,其条件数为:
即为最大特征值和最小特征值的比,当这个数很大时,其对于输入的误差很敏感。
深度学习算法通常使用基于梯度的优化算法,传统的梯度下降由于资料众多故不再赘述,在这里重点介绍关于梯度方法的其他知识,主要包括 Jacobian 矩阵和 Hessian 矩阵。
有时候我们需要计算输入输出都为向量的函数的所有偏导数,包含所有这样的偏导数的矩阵称为 Jacobian 矩阵。即如果有一个函数,的 Jacobian 矩阵为。
对于传统的梯度下降算法我们只用到了一阶导数,有时候在用到其他优化算法(比如牛顿法)需要用到二阶导数,将所有的二阶导数构成的矩阵称之为 Hessian 矩阵,即:
在深度学习的背景下,Hessian 矩阵几乎处处是对称的。在特定方向上的二阶导数可以写成。当是的一个向量时,这个方向的二阶导数就是对应的特征值。
Hessian 矩阵的一个重要作用就是进行二阶导数测试,即判断当前的点是极大/极小值点或者是鞍点。一维情况很简单,对于多维情况,我们通过检测 Hessian 矩阵的特征值来判断该临界点,当 Hessian 矩阵是正定时,该临界点是局部极小点,同样负定时则为局部极大点。如果 Hessian 的特征值中至少一个是正的一个是负的,那么在某个平面上是局部极大点,在某个平面是局部极小点,则为鞍点。
这是关于机器学习中数值计算文章系列的第一篇