NN的优化:寻找NN上的一组参数,可显著降低代价函数,该代价函数通常包括整个训练集上的性能评估和额外的正则化项。
1. 批量算法和小批量算法
和一般优化算法不同,ML算法的目标函数通常可分解为训练样本上的总和。ML中的优化算法在计算参数的每一次更新时,通常仅使用整个代价函数中的一部分项来估计代价函数的期望值。
为什么仅仅使用一部分来估计?
n个样本均值的标准差是 δ/n√ ,其中 δ 是样本值真实的标准差。分母表示使用更多样本来估计梯度的方法的回报是低于线性的。例如,一个基于100个样本,一个基于10000个样本。后者需要的计算量是前者的100倍,但仅降低了10倍的均值标准差。因此如果快速计算梯度估计值,而非缓慢的计算准确值,则算法会收敛得更快。
另一个动机:训练集的冗余。最坏极端情况下,训练集所有样本相同,则使用单个样本就可以计算出正确的梯度。实践中不太可能遇到最坏,但大量样本存在冗余是真的,其对梯度做出了相似的贡献。
使用整个训练集的优化算法被称为:批量(batch)梯度算法,或者确定性梯度算法。批量梯度下降 指的是使用全部训练集。批量 单独出现则指一组样本。
每次仅使用单个样本的优化算法,被称为 随机,或者 在线。在线含义:通常是指从连续产生样本的数据流中抽取样本的情况,而非从一个固定大小的训练集中遍历多次采样的情况。
大多数DL上的算法介于二者之间,使用多于一个,而又不是全部的训练样本,称为 小批量,或者 小批量随机。简单的统称为 随机方法。
小批量的大小决定有几个因素:并行处理的内存消耗和批量大小成正比;极小批量难以充分利用多核架构;特定大小的数组在某些硬件上更快;更大批量计算更精确的梯度估计但回报小于线性。
小批量需要随机抽取。从一组样本中计算出梯度期望的无偏估计,要求这些样本是独立的。我们希望两个连续的梯度估计是互相独立的,因此两个连续的小批量样本也应该是彼此独立的。实践中通常初始打乱样本顺序,然后重复使用该顺序即可。
很多ML上优化问题可分解为并行计算不同样本上独立的更新。在计算一个小批量样本上的最小化目标函数的更新时,同时可以计算其他小批量样本上的更新。
小批量随机梯度下降的一个有趣动机:只要没有重复使用样本,它将遵循着真实泛化误差的梯度。初始打乱顺序,多次遍历更新参数下,第一次遍历可计算真实泛化误差的无偏估计,第二次遍历估计将会是有偏的。
在线学习 / 随机梯度下降:每个样本都是从数据流中抽取出来的,学习器好像是一个每次都看到新样本的人,每个样本都来自数据生成分布,而不是使用大小固定的数据集。则样本永远不会重复,每次更新用的样本都是从分布中采样获得的无偏样本。
2. 神经网络优化中的挑战
凸优化是我们喜欢的,但NN总会遇到非凸的。因此优化问题变得复杂,诸多挑战。
2.1 病态
病态条件:函数对于输入被轻微扰动而迅速改变。矩阵参数本身固有的敏感性导致。最突出的是Hessian矩阵 H 的病态。病态问题一般认为存在NN训练过程中,体现在随机梯度下降会卡在某些情况,即使很小的步长也会增加代价函数。
成功训练的NN中,梯度显著增加。而不是我们所期望的那样随训练过程收敛到临界点而减小。监测梯度范数和验证集上分类误差。
病态时,尽管梯度很强,学习会变得非常缓慢。因为学习率必须收缩以弥补更强的曲率。
2.2 局部极小值
NN是非凸函数,有可能存在多个局部极小值,但似乎并不是非凸带来的问题。
模型可辨识性问题:如果一个足够大的训练集可唯一确定一组模型参数,则该模型是可辨识的。带有潜变量的模型通常不可辨识,如NN,因为可相互交换得到等价模型,称为权重空间对称性。
这些模型可辨识性问题意味着:NN代价函数具有无限多(换组参数得到一个新的等价模型)的局部极小值。所有这些因不可辨识性产生的局部极小值都有相同的代价函数值,因此这些局部极小值并非是非凸带来的问题。
是否存在大量代价很高的局部极小值,优化时是否会碰到它们,均尚未解决。学者们猜想:大部分局部极小值都具有很小的代价函数,能不能找到真正的全局最小点不重要,找到一个代价很小的点即可。(人的美好意志)
有人将NN优化中的所有困难均归结于局部极小值。不合适的。一种排除局部极小值是主要问题的检测方法是:画出梯度范数随时间的变化。局部极小值,则有梯度范数缩小到一个微小值。那么,若梯度范数没缩到微小值,则该问题就不是因着局部极小值的。
2.3 鞍点
鞍点:附近某些点比鞍点有更大的代价,其他点则有更小的代价。
鞍点处的海森矩阵同时具有正负特征值。正特征值对应的特征向量方向的点比鞍点代价更大,负特征值对应的特征向量方向的点有更小的代价。
多类随机函数有这些性质:低维空间中局部极小值很普遍。高维空间中局部极小值很罕见,鞍点较常见。海森矩阵在局部最小值处,仅有正特征值。鞍点处则同时具有正负特征值。试想这么个情况:特征值的正负号由抛硬币决定,一维时很容易得到正面朝上一次而取得局部极小点。n维时要抛n次硬币都正面朝上的难度大,鞍点就多了。
2014年实验证明,NN中也存在包含很多高代价鞍点的损失函数。鞍点激增对训练有何影响呢?仅用梯度信息的一阶优化算法,还不清楚。实验中,梯度下降似乎可以在很多情况下逃离鞍点。可视化显示,突出的鞍点附加,代价函数都是平坦的,权重都为0,蓝线轨迹可以迅速逸出该区间。
对于牛顿法,目标是寻找梯度为0的点。若无适当修改,牛顿法会跳进一个鞍点。高维空间中鞍点的激增,或许可解释NN中二阶方法无法成功取代梯度下降。
2.4 悬崖、梯度爆炸
多层NN中通常包含由几个参数连乘导致的参数空间中的尖锐非线性,类似于悬崖。
当参数接近悬崖区域时,非线性会产生非常大的导数,梯度下降更新使得参数弹射地非常远,可能会无效化已完成的大量优化工作(俗话说,步子大了容易扯着蛋,大概就是这个意思吧)。悬崖在RNN中较常见,此类模型会设计到多个因子的连乘。
启发式梯度截断:梯度并未指明最佳步长,仅说明了无限小区域内的最佳方向。那么,当传统的梯度下降算法建议更新很大一步时,启发式梯度截断会干涉来减小步长,从而使其不太可能走出悬崖区域。
2.5 长期依赖
当计算图变得极深时,NN优化算法面临的一大难题:长期依赖问题——即由于变深的结构,模型丧失了学习到先前信息的能力,优化极其困难。特别是在RNN中,很长时间序列中各个时刻重复应用相同操作来构建很深的计算图,模型参数共享,问题更为凸显。
例如,某个计算图中包含一条反复与矩阵
当特征值
梯度消失(弥散)和梯度爆炸问题:指该计算图上的梯度会因为 diag(λ)t 大幅度变化。梯度消失令我们难以知道参数朝哪个方向移动能改进代价函数,学习陷于停滞。梯度爆炸使得学习不稳定,悬崖问题就是梯度爆炸的案例。之前看过,sigmoid等函数的饱和区域,梯度流过时乘上很小值,也造成梯度弥散。
额外的,
xTWt
的效果:最终会丢弃
x
中所有与
RNN在各时间步上使用相同矩阵连乘,FNN没有,因此即使非常深层的FNN一定程度上能避免梯度消失和爆炸问题。
2.6 非精确梯度
实践中通常噪声存在,则不能得到精确的梯度,只能近似解决。第三部分更高级的模型汇总用到。作者未展开。
2.7 局部和全局结构间的弱对应
前面讨论的问题,均关于损失函数在单个点上的性质——例如一个下降方向不明显的鞍点使得很难更新当前步。若该方向局部改进很大,但并未指向代价低得多的遥远区域,即使单点处克服困难,全局仍表现不佳。这就是局部和全局的弱对应。
Goodfellow在2015年提出,大部分训练的运行时间取决于到达解决方案的轨迹长度。
上图中,即使没有局部极小值和鞍点,最终还是不能找到一个良好值。造成这种困难主要原因是:初始化在“山”的错误一侧,无法遍历。高维空间中,学习算法通常可以环绕过高山,但轨迹可能很长,导致训练时间过长。
现有研究在求解具有 困难全局结构 的问题时,旨在 寻求良好初始值,而非开发非局部范围更新的算法。实践表明,NN似乎不会到达任何一种临界点——全局最小点,局部极小点,鞍点(图8.2中看到梯度范数实际越来越大),甚至,这些点可能压根不存在。因此最终建议是:研究怎样选取更佳的初始化点。
2.8 优化的理论限制
我们目前为NN设计的任何优化算法都有性能限制的。但是这不影响NN在实践中的应用,我们找到一个 可接受解 就行了,这样做更现实些。