在计算机中执行数学运算需要使用有限的比特位来表达实数,这会引入近似误差。
近似误差可以在多步数值运算中传递、积累,从而导致理论上成功的算法失败。因此数值算法设计时要考虑将累计误差最小化。
当从头开始实现一个数值算法时,需要考虑数值稳定性。当使用现有的数值计算库(如tensorflow
)时,不需要考虑数值稳定性。
一种严重的误差是下溢出underflow
:当接近零的数字四舍五入为零时,发生下溢出。
许多函数在参数为零和参数为一个非常小的正数时,行为是不同的。如:对数函数要求自变量大于零,除法中要求除数非零。
一种严重的误差是上溢出overflow
:当数值非常大,超过了计算机的表示范围时,发生上溢出。
一个数值稳定性的例子是softmax
函数。
设 ,则softmax
函数定义为:
当所有的 都等于常数 时,softmax
函数的每个分量的理论值都为 。
为了解决softmax
函数的数值稳定性问题,令 ,则有 的第 个分量为:
当 的分量 较小时, 的计算结果可能为 0 。此时 趋向于负无穷,因此存在数值稳定性问题。
softmax
名字的来源是hardmax
。
hardmax
把一个向量 映射成向量 。即: 最大元素的位置填充1
,其它位置填充0
。 softmax
会在这些位置填充0.0~1.0
之间的值(如:某个概率值)。Conditioning
刻画了一个函数的如下特性:当函数的输入发生了微小的变化时,函数的输出的变化有多大。
对于Conditioning
较大的函数,在数值计算中可能有问题。因为函数输入的舍入误差可能导致函数输出的较大变化。
对于方阵 ,其条件数condition number
为:
其中 为 的特征值。
梯度下降法是求解无约束最优化问题的一种常见方法,优点是实现简单。
对于函数: ,假设输入 ,则定义梯度:
函数的驻点满足: 。
沿着方向 的方向导数directional derivative
定义为:
其中 为单位向量。
方向导数就是 。根据链式法则,它也等于 。
为了最小化 ,则寻找一个方向:沿着该方向,函数值减少的速度最快(换句话说,就是增加最慢)。即:
假设 与梯度的夹角为 ,则目标函数等于: 。
考虑到 ,以及梯度的大小与 无关,于是上述问题转化为:
于是: ,即 沿着梯度的相反的方向。即:梯度的方向是函数值增加最快的方向,梯度的相反方向是函数值减小的最快的方向。
因此:可以沿着负梯度的方向来降低 的值,这就是梯度下降法。
根据梯度下降法,为了寻找 的最小点,迭代过程为: 。其中: 为学习率,它是一个正数,决定了迭代的步长。
迭代结束条件为:梯度向量 的每个成分为零或者非常接近零。
选择学习率有多种方法:
一种方法是:选择 为一个小的、正的常数。
另一种方法是:给定多个 ,然后选择使得 最小的那个值作为本次迭代的学习率(即:选择一个使得目标函数下降最大的学习率)。
这种做法叫做线性搜索line search
。
第三种方法是:求得使 取极小值的 ,即求解最优化问题:
这种方法也称作最速下降法。
在最速下降法中,假设相邻的三个迭代点分别为: ,可以证明: 。即相邻的两次搜索的方向是正交的!
证明:
根据最优化问题,有:
将 代入,有:
为求 极小值,则求解: 。
根据链式法则:
即: 。则有: 。
此时迭代的路线是锯齿形的,因此收敛速度较慢。
某些情况下如果梯度向量 的形式比较简单,则可以直接求解方程: 。
此时不用任何迭代,直接获得解析解。
梯度下降算法:
输入:
输出: 的极小点
算法步骤:
选取初始值 ,置 。
迭代,停止条件为:梯度收敛或者目标函数收敛。迭代步骤为:
计算目标函数 ,计算梯度 。
若梯度 ,则停止迭代, 。
若梯度 ,则令 ,求 : 。
通常这也是个最小化问题。但是可以给定一系列的的值,如:
[10,1,0.1,0.01,0.001,0.0001]
。然后从中挑选使得目标函数最小的那个。
令 ,计算 。
当目标函数是凸函数时,梯度下降法的解是全局最优的。通常情况下,梯度下降法的解不保证是全局最优的。
梯度下降法的收敛速度未必是最快的。
二阶导数 刻画了曲率。假设有一个二次函数(实际任务中,很多函数不是二次的,但是在局部可以近似为二次函数):
当函数输入为多维时,定义海森矩阵:
即海森矩阵的第 行 列元素为: 。
当二阶偏导是连续时,海森矩阵是对称阵,即有: 。
在深度学习中大多数海森矩阵都是对称阵。
对于特定方向 上的二阶导数为: 。
(0,1)
之间。且与 夹角越小的特征向量对应的特征值具有更大的权重。将 在 处泰勒展开: 。其中: 为 处的梯度; 为 处的海森矩阵。
根据梯度下降法: 。
应用在点 ,有: 。
注意:如果 较大,则很有可能导致:沿着负梯度的方向,函数值反而增加!
如果 ,则无论 取多大的值, 可以保证函数值是减小的。
如果 , 则学习率 不能太大。若 太大则函数值增加。
根据 ,则需要满足: 。若 ,则会导致沿着负梯度的方向函数值在增加。
考虑最速下降法,选择使得 下降最快的 ,则有: 。求解 有: 。
根据 ,很明显有: 。
由于海森矩阵为实对称阵,因此它可以进行特征值分解。假设其特征值从大到小排列为: 。
海森矩阵的瑞利商为: 。可以证明:
根据 可知:海森矩阵决定了学习率的取值范围。最坏的情况下,梯度 与海森矩阵最大特征值 对应的特征向量平行,则此时最优学习率为 。
满足导数为零的点(即 )称作驻点。驻点可能为下面三种类型之一:
全局极小点:。
全局极小点可能有一个或者多个。
在深度学习中,目标函数很可能具有非常多的局部极小点,以及许多位于平坦区域的鞍点。这使得优化非常不利。
因此通常选取一个非常低的目标函数值,而不一定要是全局最小值。
二阶导数可以配合一阶导数来决定驻点的类型:
对于多维的情况类似有:
局部极小点:,且海森矩阵为正定的(即所有的特征值都是正的)。
当海森矩阵为正定时,任意方向的二阶偏导数都是正的。
局部极大点:,且海森矩阵为负定的(即所有的特征值都是负的)。
当海森矩阵为负定时,任意方向的二阶偏导数都是负的。
,且海森矩阵的特征值中至少一个正值、至少一个负值时,为鞍点。
当海森矩阵非上述情况时,驻点类型无法判断。
下图为 在原点附近的等值线。其海森矩阵为一正一负。
梯度下降法有个缺陷:它未能利用海森矩阵的信息。
当海森矩阵的条件数较大时,不同方向的梯度的变化差异很大。
在某些方向上,梯度变化很快;在有些方向上,梯度变化很慢。
梯度下降法未能利用海森矩阵,也就不知道应该优先搜索导数长期为负或者长期为正的方向。
本质上应该沿着负梯度方向搜索。但是沿着该方向的一段区间内,如果导数一直为正或者一直为负,则可以直接跨过该区间。前提是:必须保证该区间内,该方向导数不会发生正负改变。
当海森矩阵的条件数较大时,也难以选择合适的步长。
下图是利用梯度下降法寻找函数最小值的路径。该函数是二次函数,海森矩阵条件数为 5,表明最大曲率是最小曲率的5倍。红线为梯度下降的搜索路径。
它没有用最速下降法,而是用到线性搜索。如果是最速下降法,则相邻两次搜索的方向正交。
牛顿法结合了海森矩阵。
考虑泰勒展开式: 。其中 为 处的梯度; 为 处的海森矩阵。
如果 为极值点,则有: ,则有: 。
一维情况下,梯度下降法和牛顿法的原理展示:
梯度下降法:下一次迭代的点 。
对于一维的情况,可以固定 。由于随着迭代的推进, 绝对值是减小的(直到0),因此越靠近极值点, 越小。
牛顿法:目标是 。
在一维情况下就是求解 。牛顿法的方法是:以 做 切线,该切线过点 。该切线在 轴上的交点就是: 。
推广到多维情况下就是: 。
当位于一个极小值点附近时,牛顿法比梯度下降法能更快地到达极小值点。
如果在一个鞍点附近,牛顿法效果很差,因为牛顿法会主动跳入鞍点。而梯度下降法此时效果较好(除非负梯度的方向刚好指向了鞍点)。
仅仅利用了梯度的优化算法(如梯度下降法)称作一阶优化算法,同时利用了海森矩阵的优化算法(如牛顿法)称作二阶优化算法。
牛顿法算法:
输入:
输出: 的极小值点
算法步骤:
选取初始值 , 置 。
迭代,停止条件为:梯度收敛。迭代步骤为:
计算 。
若 , 则停止计算,得到近似解 。
若 , 则:
梯度下降法中,每一次 增加的方向一定是梯度相反的方向 。增加的幅度由 决定,若跨度过大容易引发震荡。
而牛顿法中,每一次 增加的方向是梯度增速最大的反方向 (它通常情况下与梯度不共线)。增加的幅度已经包含在