主要学习任务: 1、深度学习基础:局部极小值与鞍点 2、深度学习基础:批量和动量
1、局部极小值与鞍点
如果深层网络相比浅层网络没有做得更好,没有发挥出它应有的效果,那次此时优化是存在问题的。
临界点及其种类
两条曲线对应两个神经网络训练的过程。当参数对损失微分为零的时候,梯度下降就不能再更新参数了,训练就停下来了,损失不再下降了。
损失不是只在局部极小值的梯度是零,还有其他可能会让梯度是零的点,比如鞍点(saddle point)。鞍点其实就是梯度是零且区别于局部极小值和局部极大值(local maximum)的点。
梯度为零的点统称为临界点(critical point)。损失没有办法再下降,也许是因为收敛在了临界点,可能是局部极小值,也可能是鞍点。
区别:如果损失收敛在局部极小值,我们所在的位置已经是损失最低的点了,往四周走损失都会比较高,就没有路可以走了。但鞍点没有这个问题,旁边还是有路可以让损失更低的。只要逃离鞍点,就有可能让损失更低。
判断临界值种类的方法
判断一个临界点到底是局部极小值还是鞍点需要知道损失函数的形状。在临界点的附近,损失函数可被近似为
我们用向量 v 来表示 θ − θ′,(θ − θ′)TH(θ − θ′)可改写为 vTHv, 有如下三种情况。
(1)如果对所有 v,vTHv > 0. 这意味着对任意 θ,L(θ) > L(θ′). 只要 θ 在 θ′附近,L(θ) 都大于 L(θ′). 这代表 L(θ′) 是附近的一个最低点,所以它是局部极小值。
(2)如果对所有 v,vTHv < 0. 这意味着对任意 θ,L(θ) < L(θ′),θ′是附近最高的一个点,L(θ′) 是局部极大值。
(3)如果对于 v,vTHv 有时候大于零,有时候小于零。这意味着在 θ′附近,有时候L(θ) > L(θ′),有时候 L(θ) < L(θ′). 因此在 θ′附近,L(θ′) 既不是局部极大值,也不是局部极小值,而是鞍点。
逃离鞍点的方法
实际上,我们几乎找不到所有特征值都为正的临界点。最小值比例最大也不过处于 0.5 ~ 0.6 的范围,代表只有约一半的特征值为正,另一半的特征值为负,代表在所有的维度里面有约一半的路可以让损失上升,还有约一半的路可以让损失下降。多数的时候,我们训练到一个梯度很小的地方,参数不再更新,往往只是遇到了鞍点。
为了让损失逃离鞍点,可以尝试以下方法:
- 使用自适应优化算法:如Adam或RMSprop,它们通过调整学习率来帮助跳出鞍点。
- 引入噪声:在训练过程中加入随机噪声,增强梯度的波动性。
- 调整学习率:适当增大学习率,帮助更新跳出鞍点区域。
- 使用动量:动量方法能累积历史梯度,增加更新的动量,从而避免停留在鞍点。
- 梯度裁剪:控制梯度的大小,防止梯度爆炸或消失,使更新更加稳定。
批量和动量
实际上在计算梯度的时候,会把所有的数据分成一个一个的批量(batch),每个批量的大小是 B ,即带有 B 笔数据。每次在更新参数的时候,会去取出 B 笔数据用来计算出损失和梯度更新参数。在把数据分为批量的时候,我们还会进行随机打乱(shuffle)。随机打乱有很多不同的做法,一个常见的做法是在每一个回合开始之前重新划分批量,也就是说,每个回合的批量的数据都不一样。
批量大小对梯度下降法的影响
随机梯度下降(SGD)的梯度上引入了随机噪声,因此在非凸优化问题中,其相比批量梯度下降(BGD)更容易逃离局部最小值。
根据并行计算中批量大小与计算时间的关系,大的批量更新比较稳定,小的批量的梯度的方向是比较有噪声的(noisy)。但实际上有噪声的的梯度反而可以帮助训练。
批量大小越大,验证集准确率越差。但这不是过拟合,也不是模型偏见。 但大的批量大小往往在训练的时候,结果比较差。这个是优化的问题,大的批量大小优化可能会有问题,小的批量大小优化的结果反而是比较好的。从图中看,在不同的数据集中,最佳的批量大小也不尽相同。
小批量梯度下降法(mini-batch gradient descent)每次是挑一个批量计算损失,所以每一次更新参数的时候所使用的损失函数是有差异的。选到第一个批量的时候,用 L1计算梯度;选到第二个批量的时候,用 L2计算梯度。假设用 L1算梯度的时候,梯度是零,就会卡住。但 L2的函数跟 L1又不一样,L2不一定会卡住,可以换下个批量的损失 L2计算梯度,模型还是可以训练,还是有办法让损失变小,所以这种有噪声的更新方式反而对训练其实是有帮助的。
大的批量大小会让我们倾向于走到“峡谷”里面,而小的批量大小倾向于让我们走到“盆地”里面。小的批量有很多的损失,其更新方向比较随机,其每次更新的方向都不太一样。即使“峡谷”非常窄,它也可以跳出去,之后如果有一个非常宽的“盆地”,它才会停下来。
动量法
动量法(momentum method)是另外一个可以对抗鞍点或局部最小值的方法。在物理的世界里,一个球如果从高处滚下来,就算滚到鞍点或鞍点,因为惯性的关系它还是会继续往前走。如果球的动量足够大,其甚至翻过小坡继续往前走。 因此在物理的世界里面,一个球从高处滚下来的时候,它并不一定会被鞍点或局部最小值卡住,如果将其应用到梯度下降中,这就是动量。
引入动量后,每次在移动参数的时候,不是只往梯度的反方向来移动参数,而是根据梯度的反方向加上前一步移动的方向决定移动方向。反复进行同样的过程。
引入动量后,可以从两个角度来理解动量法。一个角度是动量是梯度的负反方向加上前一次移动的方向。另外一个角度是当加上动量的时候,更新的方向不是只考虑现在的梯度,而是考虑过去所有梯度的总和。