Datawhale × 李宏毅苹果书 AI夏令营-深度学习进阶##AI夏令营Datawhale#夏令营第五期 Task1
该笔记分为两个部分:
一、局部极小值与鞍点
二、批量和动量
一、局部极小值与鞍点
我们在做优化的时候经常会发现,随着参数不断更新,训练的损失不会再下降, 但是我们对这个损失仍然不满意。但有时候,模型一开始就训练不起来,不管我们怎么更新参数,损失都降不下去。这个时候就可能是陷入了局部最小值或者鞍点。以下就是对局部最小值和鞍点做一个简单介绍:
1、临界点及其种类
过去常见的一个猜想是我们优化到某个地方,这个地方参数对损失的微分为零,如下图。当参数对损失微分为零的时候,梯度下降就不能再更新参数了,训练就停下来了,损失不再下降了。
当梯度为零的时候,我们最先想到的可能是模型陷入了局部最小值(local minimum)。所以经常有人说,做深度学习时使用梯度下降会收敛在局部极小值,梯度下降不起作用。但其实损失不是只在局部极小值的梯度是零,还可能会在模型处在鞍点(saddle point)。我们把这中梯度为零的点统称为临界点(critical point),如下图所示。损失没有办法再下降,也许是因为收敛在了临界点,但不一定收敛在局部极小值,因为鞍点也是梯度为零的点。
2、判断临界值种类的方法
判断一个临界点到底是局部极小值还是鞍点需要知道损失函数的形状。但神经网络一般很复杂,用复杂的神经网络算出来的损失函数也会很复杂。所以是没有办法知道完整的损失函数的样子,但我们可以通过给定一组参数,取损失函数的近似样子。比如下图中的θ′附近的 L(θ) 可近似为其中,第一项当 θ 跟 θ′ 很近的时候,L(θ) 应该跟 L(θ′) 还蛮靠近的;第二项 (θ − θ′)Tg 中,g 代表梯度,它是一个向量,可以弥补 L(θ′) 跟 L(θ) 之间的差距;第三项跟海森矩阵(Hessian matrix)H 有关。
当处于临界点的时候,梯度为零所以上述中第二项为零。上述中的公式被近似为:,下面我们用向量v来代替θ − θ′,则(θ − θ′)T H(θ − θ′)可以改写为vT Hv,对vT Hv的值进行讨论,从而区分临界点的类型:
当vT Hv>0,这意味着对任意 θ,L(θ) > L(θ′),该临界点为局部最小值点;
当vT Hv<0,这意味着对任意 θ,L(θ) < L(θ′),该临界点为局部最大值点;
当有时vT Hv>0,有时vT Hv<0,因此在 θ′ 附近,L(θ′) 既不是局部极大值,也不是局部极小值,而是鞍点。
二、批量和动量
在计算梯度的时候,并不是对所有数据的损失 L 计算梯度,而是把所有的数据分成一个一个的批量(batch),如下图所示。每次在更新参数的时候,会去取出 B 笔数据用来计算出损失和梯度更新参数。遍历所有批量的过程称为一个回合(epoch)
1、批量大小对梯度下降法的影响
人们常常会错误的认为,每个批次的数据量较少,前向传播和反向传播所需的时间较短,而每次更新都需要处理大量的数据,因此迭代的时间会更长。实际上,考虑并行运算,对于比较大的批量,计算损失和梯度花费的时间不一定比使用小批量的计算时间长 。大的批量更新比较稳定,小的批量的梯度的方向是比较有噪声的(noisy)。但实际上有噪声的的梯度反而可以帮助训练。如下图所示,利用同一个模型对两种数据集进行训练,结果显示批量大小越大,验证集准确率越差。但这不是过拟合,因为批量大小越大,训练准确率也是越低。
出现上述结果的一个可能的解释如下图,批量梯度下降在更新参数的时候,沿着一个损失函数来更新参数,走到一个局部最小值或鞍点显然就停下来了。梯度是零,如果不看海森矩阵,梯度下降就无法再更新参数了 。但小批量梯度下降法(mini-batch gradient descent)每次是挑一个批量计算损失,所以每一次更新参数的时候所使用的损失函数是有差异的。选到第一个批量的时候,用 L1 计算梯度;选到第二个批量的时候,用 L2 计算梯度。假设用 L1 算梯度的时候,梯度是零,就会卡住。但 L2 的函数跟 L1 又不一样,L2 不一定会卡住,可以换下个批量的损失 L2 计算梯度,模型还是可以训练,还是有办法让损失变小,所以这种有噪声的更新方式反而对训练其实是有帮助的。
2、动量法
动量法(momentum method)是另外一个可以对抗鞍点或局部最小值的方法。如图所示,假设误差表面就是真正的斜坡,参数是一个球,把球从斜坡上滚下来,如果使用梯度下降,球走到局部最小值或鞍点就停住了。 但是在物理的世界里,一个球如果从高处滚下来,就算滚到鞍点或鞍点,因为惯性的关系它还是会继续往前走。如果球的动量足够大,其甚至翻过小坡继续往前走。 因此在物理的世界里面,一个球从高处滚下来的时候,它并不一定会被鞍点或局部最小值卡住,如果将其应用到梯度下降中,这就是动量。
对于引入了动量后的梯度下降,每次在移动参数的时候,不是只往梯度的反方向来移动参数,而是根据梯度的反方向加上前一步移动的方向决定移动方向。 下图中红色虚线方向是梯度的反方向,蓝色虚线方向是前一次更新的方向,蓝色实线的方向是下一步要移动的方向。把前一步指示的方向跟梯度指示的方向相加就是下一步的移动方向。下图中的公式就是动量法的计算过程。
动量的简单例子如下图所示。红色表示负梯度方向,蓝色虚线表示前一步的方向,蓝色实线表示真实的移动量。一开始没有前一次更新的方向,完全按照梯度给指示往右移动参数。负梯度方向跟前一步移动的方向加起来,得到往右走的方向。一般梯度下降走到一个局部最小值或鞍点时,就被困住了。但有动量还是有办法继续走下去,因为动量不是只看梯度,还看前一步的方向。即使梯度方向往左走,但如果前一步的影响力比梯度要大,球还是有可能继续往右走,甚至翻过一个小丘,也许可以走到更好的局部最小值,这就是动量有可能带来的好处 。