HomeBlogTopicsPublish
  • rss

  • contact

© 2025 MIT Licensed

Topics→Machine Learning→ML Numerical Methods

Machine Learning

Fundamentals
Decision TreeBackpropagationLinear 1Linear 2Linear 3Linear DualLinear IntroML Numerical MethodsNaive SolveLagrangian Conditions under Equality ConstraintsLagrangian Conditions under Inequality ConstraintsSupport Vector Machine 1Support Vector Machine 2Support Vector Machine 3Convex
Deep Learning Acceleration
Paper DartsPaper MobileNetsPaper ShuffleNetPaper HashingTricksPaper ShuffleNetV2Neural Architecture Search MilestonePyTorch Training Acceleration
Computer Vision
Paper RobotPaper InceptionV4Dataset Cityscapes
Reinforcement Learning
Paper Deep Q-Network

ML Numerical Methods

September 23, 2017

by Frank

机器学习算法通常需要大量的数值计算,即通过迭代求解近似值而非求得解析解。这些算法通常包括最优化和线性方程组的求解,在计算机中要通过有限位来表示各种浮点数是具有一定误差的,需要通过一些方法来保证我们的计算精度。##上溢与下溢

机器学习中的数值计算

机器学习算法通常需要大量的数值计算,即通过迭代求解近似值而非求得解析解。这些算法通常包括最优化和线性方程组的求解,在计算机中要通过有限位来表示各种浮点数是具有一定误差的,需要通过一些方法来保证我们的计算精度。##上溢与下溢 上溢(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})}softmax(x)i​=∑j=1n​exp(xj​)exp(xi​)​

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

maxi,j∣λiλj∣max_{i,j}|\frac{\lambda_{i}}{\lambda_{j}}|maxi,j​∣λj​λi​​∣

即为最大特征值和最小特征值的比,当这个数很大时,其f(x)f(x)f(x)对于输入xxx的误差很敏感。

基于梯度的优化

深度学习算法通常使用基于梯度的优化算法,传统的梯度下降由于资料众多故不再赘述,在这里重点介绍关于梯度方法的其他知识,主要包括 Jacobian 矩阵和 Hessian 矩阵。

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

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

H(f)(x⃗)i,j=∂2∂xi∂xjf(x⃗)H(f)(\vec x)_{i,j}=\frac{\partial^{2}}{\partial x_{i}\partial x_{j}}f(\vec x)H(f)(x)i,j​=∂xi​∂xj​∂2​f(x)

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

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

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

←Previous: Linear IntroNext: Naive Solve→

Comments