深度学习:第四章 数值计算
机器学习算法通常需要大量的数值计算。这通常是指通过迭代过程更新解的估计值来解决数学问题的算法,而不是通过解析过程推导出公式来提供正确解的方法。常见的操作包括优化(找到最小化或最大化函数值的参数)和线性方程组的求解。对数字计算机来说实数无法在有限内存下精确表示,因此仅仅是计算涉及实数的函数也是困难的。
舍入误差会导致一些问题,特别是当许多操作复合时,即使是理论上可行的算法,如果在设计时没有考虑最小化舍入误差的累积,在实践时也可能会导致算法失效。
必须对上溢和下溢进行数值稳定的一个例子是softmax 函数(softmax func)。softmax 函数经常用于预测与Multinoulli 分布相关联的概率,定义为:
在大多数情况下,我们没有明确地对本书描述的各种算法所涉及的数值考虑进行详细说明。底层库的开发者在实现深度学习算法时应该牢记数值问题。本书的大多数读者可以简单地依赖保证数值稳定的底层库。在某些情况下,我们有可能在实现一个新的算法时自动保持数值稳定。
病态条件
条件数表征函数相对于输入的微小变化而变化的快慢程度。输入被轻微扰动而迅速改变的函数对于科学计算来说可能是有问题的,因为输入中的舍入误差可能导致输出的巨大变化。
这是最大和最小特征值的模之比1。当该数很大时,矩阵求逆对输入的误差特别敏感。这种敏感性是矩阵本身的固有特性,而不是矩阵求逆期间舍入误差的结果。即使我们乘以完全正确的矩阵逆,病态条件的矩阵也会放大预先存在的误差。在实践中,该错误将与求逆过程本身的数值误差进一步复合。
基于梯度的优化方法
大多数深度学习算法都涉及某种形式的优化。优化指的是改变x 以最小化或最大化某个函数f(x) 的任务。我们通常以最小化f(x) 指代大多数最优化问题。最大化可经由最小化算法最小化f(x) 来实现。
我们把要最小化或最大化的函数称为目标函数(objective function)或准则(criterion)。当我们对其进行最小化时,我们也把它称为代价函数(cost function)、损失函数(loss function)或误差函数(error function)。虽然有些机器学习著作赋予这些名称特殊的意义,但在这本书中我们交替使用这些术语。
点。这些点被称为鞍点(saddle point)
一维情况下,三种临界点的示例。临界点是斜率为零的点。这样的点可以是局部极小点(local minimum),其值低于相邻点; 局部极大点(local maximum),其值高于相邻点; 或鞍点,同时存在更高和更低的相邻点。
使f(x) 取得绝对的最小值(相对所有其他值)的点是全局最小点(globalminimum)。函数可能只有一个全局最小点或存在多个全局最小点,还可能存在不是全局最优的局部极小点。在深度学习的背景下,我们要优化的函数可能含有许多不是最优的局部极小点,或者还有很多处于非常平坦的区域内的鞍点。尤其是当输入是***的时候,所有这些都将使优化变得困难。因此,我们通常寻找使f 非常小的点,但这在任何形式意义下并不一定是最小。
梯度之上:Jacobian 和Hessian 矩阵
从图4.4 可以看出不同形式的曲率如何影响基于梯度的预测值与真实的代价函数值的关系
二阶导数确定函数的曲率。这里我们展示具有各种曲率的二次函数。虚线表示我们仅根据梯度信息进行梯度下降后预期的代价函数值。对于负曲率,代价函数实际上比梯度预测下降得更快。没有曲率时,梯度正确预测下降值。对于正曲率,函数比预期下降得更慢,并且最终会开始增加,因此太大的步骤实际上可能会无意地增加函数值。
***情况下,单个点处每个方向上的二阶导数是不同。Hessian 的条件数衡量这些二阶导数的变化范围。当Hessian 的条件数很差时,梯度下降法也会表现得很差。这是因为一个方向上的导数增加得很快,而在另一个方向上增加得很慢。梯度下降不知道导数的这种变化,所以它不知道应该优先探索导数长期为负的方向。病态条件也导致很难选择合适的步长。步长必须足够小,以免冲过最小而向具有较强正曲率的方向上升。这通常意味着步长太小,以致于在其他较小曲率的方向上进展不明显。
约束优化
有时候,在x 的所有可能值下最大化或最小化一个函数f(x) 不是我们所希望的。相反,我们可能希望在x 的某些集合S 中找f(x) 的最大值或最小值。这被称为约束优化(constrained optimization)。在约束优化术语中,集合S 内的点x 被称为可行(feasible)点.
约束优化的一个简单方法是将约束考虑在内后简单地对梯度下降进行修改。如果我们使用一个小的恒定步长ϵ,我们可以先取梯度下降的单步结果,然后将结果投
影回S。如果我们使用线搜索,我们只能在步长为ϵ 范围内搜索可行的新x 点,或者我们可以将线上的每个点投影到约束区域。如果可能的话,在梯度下降或线搜索前将梯度投影到可行域的切空间会更高效。
实例:线性最小二乘
此处给出最小二乘法的伪代码