1. 局部最小值与鞍点
在优化过程中,有时随着参数不断更新,训练的损失不会再下降,但是损失仍然很大,把深层网络
线性模型和浅层网络做对比,发现深层网络没有做得更好。思考这时发生了什么。
1.1临界点及其种类
在过去的优化中,当某个地方的参数对损失的微分为零,那么梯度向量为零向量,参数无法继续更新。相当于训练停止。
梯度为零,可能是局部极小值点(local minimum),也可能是鞍点(saddle point),鞍点就是梯度为零时区别局部极小值点和局部极大值点的定义,其在某些方向上为极小值,某些方向上为极大值。
如图(b),红点在y轴方向上为极大值,x轴方向上为极小值,其不能被称为局部极小值,因为在周围还有其他点明显比红点小。
我们称梯度为零的点为临界点,参数在此处不会再改变,损失也无法继续下降。损失没有办法下降,一般是因为收缩在临界点,但不一定是在局部极小值点,也有可能是在鞍点。
因此要考虑一个点梯度为零是到底是局部极小值点还是鞍点,若是局部极小值点,则无路可走,损失已经降到最低,若是鞍点,则只要逃离鞍点就有可能让损失更低。
1.2判断临界值种类的方法
由多元函数的泰勒公式,我们可以得到在θ′附近的损失函数L(θ)可近似为
其中,第一项 L(θ)′ 告诉我们, 当θ跟θ′ 很近的时候,L(θ)应该跟L(θ′)还蛮靠近的;第二项θ−θ′ Tg 中,g 代表梯度, 它是一个向量,可以弥补L(θ′)跟L(θ)之间的差距。有时候梯度g 会写成∇L(θ′)。gi 是向 量g的第i个元素,就是L关于θ的第i个元素的微分,即
光看g还是没有办法完整地描述L(θ),还要看式(3.1)的第三项 1 2 θ−θ′ THθ−θ′。 第三项跟海森矩阵(Hessian matrix)H 有关。H 里面放的是 L 的二次微分,它第 i 行, 第j 列的值Hij 就是把θ的第i个元素对L θ′作微分,再把θ的第j个元素对 ∂L(θ′) ∂θi 微分后的结果
所以损失函数L(θ)与周围值的大小比较可根据第二项和第三项的正负来判断,在临界点处,g为零,故第二项为零,所以只需判断第三项即可,若第三项总为正值,则其为局部极小值点,若第三项时正时负则为鞍点。
通过变换,可得若矩阵H特征值均是正,则H为正定矩阵,第三项总大于零,临界点为极小值点。若H特征值均是负数,则H为负定矩阵,第三项总小于零,临界点为局部极大值点。若H特征值有正有负,则第三项有正有负,临界点为鞍点。
如果H特征值均为零,则继续展开,看第四项。
1.3
在实际过程中,可能涉及到的参数数量过于庞大,一般来说,局部极小值点数量远远小于鞍点甚至没有,在训练过程中找到局部极小值点的 概率也是极低。
定义最小值比例为 最小值比例=正特征值数量/总特征值数量,时加上我我们几乎找不到特征值都为正的临界点,最小值比例最大也不过处于0.5~0.6的范围,大多数时候,,我们训练到一个梯度 很小的地方,参数不再更新,往往只是遇到了鞍点。
2.批量和动量
在计算梯度时,不是对所有数据的损失计算梯度,而是将其分成一个一个批量(batch)。每个批量的size为B,即为一个批量中含有B个数据,在更新参数时,会逐步取出每个批量来计算损失和梯度更新参数,遍历所有批量的过程称为一个回合(epoch)批量的划分是随机的,每个回合开始之前会随机重新划分。
2.1批量大小对梯度下降法的影响
现在先考虑两种极端情况(如上图所示):
(1) a图中的情况为不用批量,即批量的大小等于训练数据的大小,这种使用全批量的数据来更新参数的的方法叫批量梯度下降法,假如有二十组数据,此时模型必须把二十组数据全部计算完成才可以更新参数。
(2) b图中的情况为批量的大小为一,成为随机梯度下降法,也称为增量梯度下降法,每计算一个数据就更新一次参数,假如有二十组数据,则在一回合中会更新二十次参数,用一笔数据计算出来的损失相对带有更多噪声。
实际上,批量梯度下降并没有“划分批量”:要把所有的数据都看过一遍,才能够更新一次 参数,因此其每次迭代的计算量大。但相比随机梯度下降,批量梯度下降每次更新更稳定、更 准确。
随机梯度下降的梯度上引入了随机噪声,因此在非凸优化问题中,其相比批量梯度下 降更容易逃离局部最小值。
实际上,在考虑并行运算的情况下,批量梯度下降花费的时间不一定更长,对于比较大的批量,计算损失和梯度花费的时间也不一定比使用小批量的计算时间长,即一个计算一个大小不同的批量所用时间相差不大。
当批量的大小在一千以内,所用时间基本相同,而当批量大小非常大时,计算梯度所花费的时间还是会随着批量大小的增加而逐渐增长。
但因为并行计算的能力,当批量较小时,运行完成一个回合花费的时间比批量较大时更大。
大的批量更新比较稳定,小的批量的方向比较有噪声。
实际上有噪声的梯度反而更能帮助训练,在优化方面,往往小的批量优化的结果更好。
小的批量对测试也有帮助。如果某种方法使两种训练得一样好,则在测试过程中,可以发现小的批量在测试时更好。大的批量往往过拟合更严重。
在论文 “On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima”中,作者在不同数据集上训练了六个网络(包括全连接网络、不同的卷积神经网络),在很多不同的 情况都观察到一样的结果。
这篇论文给出了一个解释,如图3.13所示,训练损失上面有多个局部最小值,这些局部 最小值的损失都很低,其损失可能都趋近于0。但是局部最小值有好最小值跟坏最小值之分, 如果局部最小值在一个“峡谷”里面,它是坏的最小值;如果局部最小值在一个平原上,它是好 的最小值。训练的损失跟测试的损失函数是不一样的,这有两种可能。一种可能是本来训练跟 测试的分布就不一样;另一种可能是因为训练跟测试都是从采样的数据算出来的,训练跟测 试采样到的数据可能不一样,所以它们计算出的损失是有一点差距。 对在一个“盆地”里面的 最小值,其在训练跟测试上面的结果不会差太多,只差了一点点。但对在右边在“峡谷”里面的 最小值,一差就可以天差地远 。虽然它在训练集上的损失很低,但训练跟测试之间的损失函 数不一样,因此测试时,损失函数一变,计算出的损失就变得很大。
两种方法各方面对比如下:
2.2动量法
动量法时一个可以对抗鞍点或局部最小值的方法。
如图3.14,假设误差表面为斜坡,参数为球,球从斜坡上滚落,若用梯度下降,就走到局部最小值或是鞍点处就会停止,但在现实世界中,在该点处由于惯性的存在,原有的速度使它继续向前,那么我们一样可以模拟一个惯性应用到梯度下降中,现在将其定义为动量。
一般梯度下降如图3.15,。初始参数为 θ0,计算一下梯 度,计算完梯度后,往梯度的反方向去更新参数θ1=θ0−ηg0。有了新的参数θ1 后,再计 算一次梯度,再往梯度的反方向,再更新一次参数,到了新的位置以后再计算一次梯度,再往 梯度的反方向去更新参数,即为按照梯度的方向更新参数。
引入动量后,在更新参数时,不是值向梯度的反方向来移动参数,而是梯度的反方向以及上一次移动的方向一起来决定移动方向。如图3.16。
因此动量法可以有效地避免鞍点,甚至越过某些局部最小值,到达更高的局部极小值。