optimization失败后,我们需面对的场景
optimization失败的原因:
- 当你update时候loss不再下降,但是你自己对这个loss不满意(下图蓝色线);
- 无论update,loss的下降都不明显(下图黄色线)。
以上2种情况,我们猜想这个地方参数对loss的微分是(或靠近)0即gradient为(或靠近)0(此时model就无法update了)
- gradient为(或靠近)0的情况意味着:
a.出现local minima(局部极小值,即是四周最低点,但不是全局最低点,四周都比这个点高,机器判断不出来这个点之外的有没有比这个更低点)
b.出现saddle point(鞍点,即左右高,前后低,机器根据前后低判断这个不是最低点)(local minima和saddle point统称为critical point)
- 损失函数的数学表达:
(由于网络复杂,其损失函数也是很复杂,只能估计,不能表示准确的)
下图是损失函数的近似数学表达式
L()表达式是泰勒级数近似(Tayler series appoximation)
是
附近一点
g 代表(gradient)梯度,它是一个向量
gi 是向量 g 的第 i 个元素,就是 L 关于 θ 的第 i 个元素的微分
绿色框是 g x (-
)的转置,就是图中竖着的绿色虚线
H是海森矩阵(Hessian matrix)
红色框是1/2 x (-
)的转置 x H x (
-
),就是图中竖着的红色虚线
判断 local minima和saddle point具体方法:
- 前提:当绿色框值为0则就是critical point,即当所有的gi都为0则就是g=0即找到critical point
- 判断 local minima和saddle point具体方法步骤:
- 看等高线图判断 critical point类型:根据红色框的值就可以判断在 θ′ 附近的误差表面(error surface)到底长什么样子。知道误差表面的“地貌”,就可以判断local min ;local max; saddle point
(-
)记作v
- 判断 critical point类型根据H的特征值(这个方法在实际中很少使用,在这里提出是为了让大家知道当遇到saddle point并不可怕):
- H 的所有特征值都是正的,H 为正定矩阵,则 vTHv > 0,临界点是local min(局部极小值。)
- H 的所有特征值都是负的,H 为负定矩阵,则 vTHv < 0,临界点是local max(局部极大值。)
- H 的特征值有正有负,临界点是saddle point(鞍点)。
如果临界点是saddle point(鞍点),可以利用H来update,具体过程如下:
-
设 λ 为 H 的一个特征值 λ,u 为其对应的特征向量。对于我们的优化问题,可令 u =θ − θ′
-
-
沿着 u 的方向更新 θ,损失就会变小。因为根据上述式子 ,只要 θ = θ′ + u,沿着特征向量 u 的方向去更新参数,损失就会变小,所以虽然临界点的梯度为零
总结:如果我们是在一个鞍点,只要找出负的特征值,再找出这个特征值对应的特征向量。将其与 θ′ 相加,就可以找到一个损失更低的点。
逃离鞍点的实际使用的方法
讲到这边会有一个问题:鞍点跟局部极小值谁比较常见?鞍点其实并没有很可怕,如果我们经常遇到的是鞍点,比较少遇到局部极小值,那就太好了。
- 采用高维图解决低维图的引入:科幻小说《三体 III:死神永生》中有这样一个情节:东罗马帝国的国王君士坦丁十一世为对抗土耳其人,找来了具有神秘力量的做狄奥伦娜。狄奥伦娜可以于万军丛中取上将首级,但大家不相信她有这么厉害,想要狄奥伦娜先展示下她的力量。于是狄奥伦娜拿出了一个圣杯,大家看到圣杯大吃一惊,因为这个圣杯本来是放在圣索菲亚大教堂地下室的一个石棺里面,而且石棺是密封的,没有人可以打开。狄奥伦娜不仅取得了圣杯,还自称在石棺中放了一串葡萄。于是君士坦丁十一世带人撬开了石棺,发现圣杯真的被拿走了,而是棺中真的有一串新鲜的葡萄,为什么迪奥伦娜可以做到这些事呢?是因为狄奥伦娜可以进入四维的空间。从三维的空间来看这个石棺是封闭的,没有任何路可以进去,但从高维的空间来看,这个石棺并不是封闭的,是有路可以进去的。误差表面会不会也一样呢。引入到 critical point, 在一维图看,好像到处都是local min,在三维图中就能具体的看清出critical point,(展露了更多“路”(就是“通向”global point的路))(牛啊,笔者以前还疑惑明明一维图就能将函数表示了,为什么大多数图都用了三维图嘞,拜读此书,醍醐灌顶啊),如下图所示:
由此可见,维度越高,“路”越多,越能找到 global min,联系到参数(feature), feature越多,层数越多,维度越高,“路”越多,越能找到 global min(闭环了啊,学友们)
以实例说明现实中我们训练到一个梯度很小的地方,参数不再更新,往往只是遇到了鞍点:
下图是训练某不同神经网络的结果,每个点对应一个神经网络。
纵轴代表训练网络时,损失收敛到临界点,损失没法下降时的损失。
横轴代表最小值比例(minimum ratio),最小值比例定义为最小值比例 =正特征值数量/总特征值数量.
我们常常会遇到两种情况:损失仍然很高,却遇到了临界点而不再下降;或者损失降得很低,才遇到临界点。 实际上,我们几乎找不到所有特征值都为正的临界点。下图中,最小值比例最大也不过处于 0.5 ~ 0.6 的范围,代表只有约一半的特征值为正,另一半的特征值为负,代表在所有的维度里面有约一半的路可以让损失上升,还有约一半的路可以让损失下降。虽然在这个图上,越靠近右侧代表临界点“看起来越像”局部极小值,但是这些点都不是真正的局部极小值。所以从经验上看起来,局部极小值并没有那么常见。多数的时候,我们训练到一个梯度很小的地方,参数不再更新,往往只是遇到了鞍点。
batch(批次)
- 随机打乱(shuffle):(eepoch划分batch的方法)随机打乱有很多不同的做法,一个常见的做法是在每一个回合开始之前重新划分批量,(也就是说,每个回合的批量的数据都不一样。)
- 分析用full batch 还是small batch:
举例说明,如下图所示:
- 左图:
没有用批量,批量大小为训练数据的大小,这种使用全批量(fullbatch)的数据来更新参数的方法即批量梯度下降法(Batch Gradient Descent,BGD)。
此时模型必须把 20 笔训练数据都看完,才能够计算损失和梯度,参数才能够更新一次。
- 右图:
批量大小等于 1,此时使用的方法即随机梯度下降法(Stochastic Gradient Descent,SGD),也称为增量梯度下降法。
批量大小等于 1 意味着只要取出一笔数据即可计算损失、更新一次参数。如果总共有 20 笔数据,那么在每一个回合里面,参数会更新 20 次。用一笔数据算出来的损失相对带有更多噪声,因此其更新的方向如 右图所示,是曲曲折折的 。
实际上,批量梯度下降并没有“划分批量”:要把所有的数据都看过一遍,才能够更新一次参数,因此其每次迭代的计算量大。但相比随机梯度下降,批量梯度下降每次更新更稳定、更准确。
对比上述左右图的实际运算时间:(具体如下图)
实际上,考虑并行运算,批量梯度下降花费的时间不一定更长;对于比较大的批量,计算损失和梯度花费的时间不一定比使用小批量的计算时间长 。
使用 Tesla V100 GPU 在 MNIST数据集得到的实验结果下如图所示。
下图中横坐标表示批量大小,纵坐标表示给定批量大小的批量,计算梯度并更新参数所耗费的时间。批量大小从 1 到 1000,需要耗费的时间几乎是一样的,原因:在实际上 GPU 可以做并行运算,这 1000 笔数据是并行处理的,所以 1000笔数据所花的时间并不是一笔数据的 1000 倍。
当然 GPU 并行计算的能力还是存在极限的,当批量大小很大的时候,时间还是会增加的。 当批量大小非常大的时候,GPU 在“跑”完一个批量,计算出梯度所花费的时间还是会随着批量大小的增加而逐渐增长 。当批量大小增加到10000,甚至增加到 60000 的时候,GPU 计算梯度并更新参数所耗费的时间确实随着批量大小的增加而逐渐增长。
但是因为有并行计算的能力,因此实际上当批量大小小的时候,要“跑”完一个回合,花的时间是比较大的。假设训练数据只有 60000 笔,批量大小设 1,要 60000 个更新才能“跑”完一个回合;如果批量大小等于 1000,60 个更新才能“跑”完一个回合,计算梯度的时间差不多。但60000 次更新跟 60 次更新比起来,其时间的差距量就非常大了。
图 3.10(a) 是用一个批量计算梯度并更新一次参数所需的时间。假设批量大小为 1,“跑”完一个回合,要更新 60000 次参数,其时间是非常大的。但假设批量大小是 1000,更新 60 次参数就会“跑”完一个回合。
图 3.10(b)是“跑”完一个完整的回合需要花的时间。如果批量大小为 1000 或 60000,其时间比批量大小设 1 还要短 。图 3.10(a) 和图 3.10(b) 的趋势正好是相反的。因此实际上,在有考虑并行计算的时候,大的批量大小反而是较有效率的,一个回合大的批量花的时间反而是比较少的。
大的批量更新比较稳定,小的批量的梯度的方向是比较有噪声的(noisy)。但实际上有噪声的的梯度反而可以帮助训练,如果拿不同的批量来训练模型来做图像识别问题。
实验结果如图 3.11 所示,横轴是批量大小,纵轴是正确率。
图 3.11(a) 是 MNIST 数据集上的结果,图 3.11(b) 是 CIFAR-10 数据集上的结果。批量大小越大,验证集准确率越差。但这不是过拟合,因为批量大小越大,训练准确率也是越低。因为用的是同一个模型,所以这不是模型偏见的问题。 但大的批量大小往往在训练的时候,结果比较差。这个是优化的问题,大的批量大小优化可能会有问题,小的批量大小优化的结果反而是比较好的。
一个可能的解释如图 3.12 所示,批量梯度下降在更新参数的时候,沿着一个损失函数来更新参数,走到一个局部最小值或鞍点显然就停下来了。梯度是零,如果不看海森矩阵,梯度下降就无法再更新参数了 。但小批量梯度下降法(mini-batch gradient descent)每次是挑一个批量计算损失,所以每一次更新参数的时候所使用的损失函数是有差异的。选到第一个批量的时候,用 L1 计算梯度;选到第二个批量的时候,用 L2 计算梯度。假设用 L1 算梯度的时候,梯度是零,就会卡住。但 L2 的函数跟 L1 又不一样,L2 不一定会卡住,可以换下个批量的损失 L2 计算梯度,模型还是可以训练,还是有办法让损失变小,所以这种有噪声的更新方式反而对训练其实是有帮助的。
大小batch的总比较汇总
momentum
原理:动量法(momentum method)是另外一个可以对抗鞍点或局部最小值的方法。如图 3.14所示,假设误差表面就是真正的斜坡,参数是一个球,把球从斜坡上滚下来,如果使用梯度下降,球走到局部最小值或鞍点就停住了。 但是在物理的世界里,一个球如果从高处滚下来,就算滚到鞍点或鞍点,因为惯性的关系它还是会继续往前走。如果球的动量足够大,其甚至翻过小坡继续往前走。 因此在物理的世界里面,一个球从高处滚下来的时候,它并不一定会被鞍点或局部最小值卡住,如果将其应用到梯度下降中,这就是动量。
(Vanilla) Gradient Descent:
Gradient Descent+ Momentum
过程图像化表示:
过程数值化表示: