机器学习中的数值计算(1)

#机器学习中的数值计算 机器学习算法通常需要大量的数值计算,即通过迭代求解近似值而非求得解析解。这些算法通常包括最优化和线性方程组的求解,在计算机中要通过有限位来表示各种浮点数是具有一定误差的,需要通过一些方法来保证我们的计算精度。##上溢与下溢 上溢(overflow)是具有破坏力的,当大量级的数被近似为-\infty或者\infty时会发生上溢,这会导致在下一步的计算中,数字变成非数字。 下溢(underflow)同样也是毁灭性的,即当浮点数很小时被四舍五入为0,有时候0和非0具有完全不同的性质,这样可能会导致分母为0等错误现象的发生。

可以通过softmax函数来避免上溢与下溢的发生:

softmax(x)i=exp(xi)j=1nexp(xj)softmax(\vec x)_{i}=\dfrac{exp(x_{i})}{\sum^{n}_{j=1}exp(x_{j})}

为了方便讨论,假设x\vec x中的每个元素xi=cx_{i}=c,当cc很大时,分子可能会上溢,同样的当cc很小时分母会下溢。这两个问题可以通过计算softmax(z)softmax(\vec z)解决,其中z=xmax(xi)\vec z=\vec x-max(x_{i}),这样的话z\vec z中的每个元素最大为0,分子不可能会发生上溢,至于分母,其中最少有一个值为1的分量,而其它元素都是非负的,所以分母也不可能发生下溢。这样便能解决溢出的问题。##病态条件 条件数指的是函数相对于输入的微小变化而变化的快慢程度。输入的轻微扰动而导致函数的迅速变化对于数值计算是有问题的。对于函数f(x)=A1xf(x)=A^{-1}x,当ARnnA\in R^{n*n}具有特征值分解的时候,其条件数为:

maxi,jλiλjmax_{i,j}|\frac{\lambda_{i}}{\lambda_{j}}|

即为最大特征值和最小特征值的比,当这个数很大时,其f(x)f(x)对于输入xx的误差很敏感。##基于梯度的优化 深度学习算法通常使用基于梯度的优化算法,传统的梯度下降由于资料众多故不再赘述,在这里重点介绍关于梯度方法的其他知识,主要包括Jacobian矩阵和Hessian矩阵。

有时候我们需要计算输入输出都为向量的函数的所有偏导数,包含所有这样的偏导数的矩阵称为Jacobian矩阵。即如果有一个函数f:RmRnf:R^{m}\to R^{n}ff的Jacobian矩阵为Ji,j=xjf(x)iJ_{i,j}=\frac{\partial}{\partial x_{j}}f(\vec x)_{i}

对于传统的梯度下降算法我们只用到了一阶导数,有时候在用到其他优化算法(比如牛顿法)需要用到二阶导数,将所有的二阶导数构成的矩阵称之为Hessian矩阵,即:

H(f)(x)i,j=2xixjf(x)H(f)(\vec x)_{i,j}=\frac{\partial^{2}}{\partial x_{i}\partial x_{j}}f(\vec x)

在深度学习的背景下,Hessian矩阵几乎处处是对称的。在特定方向d\vec d上的二阶导数可以写成dTHd\vec d^{T}H\vec d。当d\vec dHH的一个向量时,这个方向的二阶导数就是对应的特征值。

Hessian矩阵的一个重要作用就是进行二阶导数测试,即判断当前的点是极大/极小值点或者是鞍点。一维情况很简单,对于多维情况,我们通过检测Hessian矩阵的特征值来判断该临界点,当Hessian矩阵是正定时,该临界点是局部极小点,同样负定时则为局部极大点。如果Hessian的特征值中至少一个是正的一个是负的,那么xx在某个平面上是局部极大点,在某个平面是局部极小点,则为鞍点。

这是关于机器学习中数值计算文章系列的第一篇,To be continue…