算法工程狮四、数学基础 数值计算及其他

数值计算

1.上溢与下溢

数值计算首先面临的一个问题就是数值的上溢和下溢。上溢指的是数值非常大溢出为NaN值,而下溢指的是数值非常小下溢为0。数值溢出极有可能会导致数值计算问题,因此也产生了相应的解决办法。

下溢

下溢为0首先要考虑得是除0操作。当计算涉及除法时,如果分母下溢为0,计算过程就会报错。比较著名的一个例子就是softmax和交叉熵损失函数。交叉熵损失函数在反向传播时涉及$\frac{1}{y}$得计算,当softmax的y下溢为0时,此过程就会报错,解决办法就是将softmax和交叉熵损失函数合并为一个过程,避免除法操作

上溢

当数值大到超过计算机最大数值表示范围时,就会溢出为NaN,导致整个计算过程失败。同样是softmax,softmax的公式为:
$$y_i=\dfrac{e^{z_i}}{\sum\limits_{j}e^{z_j}}$$
当分子中的$z_i$很大时,整个$e^{z_i}$会增长的很快,极有可能溢出为非法数值。解决办法是$z_{i,new}=z_i-\max\limits_j{z_j}$,此时,分子最大为1,避免了分子上溢的问题。虽然这样会带来下溢问题(分子指数幂会出现极小的负值),但当分子下溢为0时,输出的$y=0$是一个有意义的数值(但此处的0也就决定了上面提到的解决下溢的合并操作的必要性)。并且上述操作也会使分母包含1,避免除0操作。

2.病态条件

函数相对于输入的微小变化而变化的快慢程度就是条件数。对于矩阵来说,条件数就是最大最小特征值绝对值之比:$\max\limits_{i,j}\dfrac{\lambda_i}{\lambda_j}$。当矩阵的条件数很大时,矩阵求逆会对输入误差特别敏感,这是矩阵的固有特性,并不是误差问题,称之为病态条件。(小声说,PCA不就是丢弃小λ嘛)

3.二阶导数

梯度下降只用到了一阶导数,指向函数下降最快的方向。但是,这是一种过于简化的思想,我们只对目标函数做了一阶泰勒展开,从此看确实是下降最快的方向。但是如果变成做二阶泰勒展开呢?
二阶导数就是控制一阶导如何随输入变化而变化,以及判断是否会产生预期的那样大的改善
Hessian矩阵可以分解为$d^THd$,d方向的二阶导就是特征值。对函数f(x)做二阶泰勒展开:
$$f(x)\approx f(x_0)+\nabla f(x_0)(x-x_0)+\frac{1}{2}(x-x_0)^TH(x-x_0)$$
当我们使用学习率$\epsilon$新的点将会是$x_0-\epsilon g$,则:
$$f(x_0-\epsilon g)\approx f(x_0)-\epsilon g^Tg+\frac{1}{2}\epsilon^2g^THg$$
从上式可以看出,当二阶项为0或者负数时,函数会下降,但是$\epsilon$需要足够小结果才会准确(泰勒展开本身就是局部线性近似);当二阶项为正时,f(x)甚至会上升,梯度下降会失效。
另外,如果Hessian矩阵的条件数很差,那么梯度下降也会变得很差。因为某些方向梯度增加很快,某些方向增加很慢,使得sgd产生振荡。
二阶导为0的情况,是鞍点的可能性更大,此时特征值有正有负。牛顿法很容易被鞍点吸引。

补充

1.径向基函数

SVM里面会用到,当作核函数的一种
$$ K(x,x')=e^{-\dfrac{||x-x'||_2^2}{2\sigma^2}},\sigma为自由参数$$
令$\gamma=-\dfrac{1}{2\sigma^2}$,则$K=e^{\gamma||x-x'||_2^2}$。rbf使得样本点只被附近输入输出激活,相比多项式核参数少。另外,径向基网络使用径向基函数激活。

2.Jensen不等式

凸函数上,若对于任意点集$\{x_i\},\lambda_i\ge0且\sum_i\lambda_i=1,如果用数学归纳法,可证明凸函f(\sum\limits_{i=1}^{M}\lambda_ix_i)\leq\sum\limits_{i=1}^{M}\lambda_if(x_i)$,在概率论中$f(E(x))\leq E(f(x))$
Jensen不等式在证明EM算法中有用到。另外,如果判断一个函数凸或者非凸,可以通过二阶导/Hessian来判断,如果$f''(x)\ge0$或者hessian半正定,则凸。还可以通过jenson判断,如果函数凸,则满足$f(E(x))\leq E(f(x))$

3.全局最优和局部最优

柏拉图有一天问老师苏格拉底什么是爱情?苏格拉底叫他到麦田走一次,摘一颗最大的麦穗回来,不许回头,只可摘一次。柏拉图空着手出来了,他的理由是,看见不错的,却不知道是不是最好的,一次次侥幸,走到尽头时,才发现还不如前面的,于是放弃。苏格拉底告诉他:“这就是爱情。”这故事让我们明白了一个道理,因为生命的一些不确定性,所以全局最优解是很难寻找到的,或者说根本就不存在,我们应该设置一些限定条件,然后在这个范围内寻找最优解,也就是局部最优解——有所斩获总比空手而归强,哪怕这种斩获只是一次有趣的经历。
​ 柏拉图有一天又问什么是婚姻?苏格拉底叫他到树林走一次,选一棵最好的树做圣诞树,也是不许回头,只许选一次。这次他一身疲惫地拖了一棵看起来直挺、翠绿,却有点稀疏的杉树回来,他的理由是,有了上回的教训,好不容易看见一棵看似不错的,又发现时间、体力已经快不够用了,也不管是不是最好的,就拿回来了。苏格拉底告诉他:“这就是婚姻。”

优化问题一般分为局部最优和全局最优。其中,

  • 局部最优,就是在函数值空间的一个有限区域内寻找最小值;而全局最优,是在函数值空间整个区域寻找最小值问题。
  • 函数局部最小点是它的函数值小于或等于附近点的点,但是有可能大于较远距离的点。
  • 全局最小点是那种它的函数值小于或等于所有的可行点。

4.使用标准差而不是方差

使用标准差而不是方差描述数据离散程度,因为标准差有三个优势:

  • 数量级一致
  • 单位一致
  • 方便运算,在正态分布下,$\begin{cases}99\%在\mu前后3个\sigma内 \\\ 95\%在\mu前后2个\sigma内 \\\ 68\%在\mu前后1个\sigma内 \end{cases}$

5.二次规划

n个变量,m个限制的二次规划问题如下:
$$\begin{cases}\argmin\limits_Xf(X)=\frac{1}{2}X^TQX+C^TX \\\ s.t. AX\leq b \end{cases}$$
当Q为半正定时,为凸二次规划问题,可行域不为空,则有全局最优解;如果Q非正定,则NP难问题,有多个平稳点;Q=0退化为普通二次规划。
一个点x为全局最小值,则其满足KKT条件,当f(x)为凸函数,则kkt变为充要条件,即满足KKT则X为全局最小值。
关于对偶问题,二次规划的对偶也是二次规划,凸二次规划的对偶也是凸二次规划。
凸二次规划的解决方案有内点法、共轭梯度法、椭球法。
python中有CVXOPT解决二次规划问题。

你可能感兴趣的:(算法,机器学习,人工智能,深度学习,数据挖掘)