文章目录
摘要
本周学习了 batch,以及当 batch size过大或过小时的对比分析。对Momentum与梯度下降相结合进行优化模型的方法进行分析。在进行梯度下降过程中,学习率是一个重要的参数,学习率的大小决定着模型训练的平滑程度和稳定性。本文介绍了如何自动调整学习率,学习率会随着梯度的改变而改变。从而在各个情况下采用合适的学习率。同时也介绍了Adagard算法和Prop算法,Learning Rate Decay和Warm up是机器学习中的优化技术,这两种方式可以改变学习率中的 η \eta η,将 η \eta η随着时间的改变而改变,从而可以避免 “梯度爆炸” 等现象;同时搜索相关资料学习朴素贝叶斯理论。
Abstract
This week we learned about batch and comparative analysis when batch size is too large or too small. The method of combining Momentum and gradient descent to optimize the model is analyzed. In the process of gradient descent, the learning rate is an important parameter, which determines the smoothness and stability of model training. This article describes how to automatically adjust the learning rate, which will change as the gradient changes. Thus, the appropriate learning rate is adopted in each case. At the same time, Adagard algorithm and Prop algorithm are also introduced. Learning Rate Decay and Warm up are optimization techniques in machine learning. These two methods can change η \eta ηin learning rate and change η \eta ηwith the change of time, so as to avoid “gradient explosion” and other phenomena. At the same time, search relevant materials to learn naive Bayes theory.
1.批次(Batch)和动量(momentum)
1.1 批次(Batch)
实际上在计算梯度的时候,并不是对所有数据的损失Loss计算梯度,而是把所有的数据分成一个一个的批量(batch),每次更新参数时,会用每个Batch的数据计算出Loss值和梯度值,进行更新参数。
遍历所有批量的过程称为一个回合(epoch)。
在把数据分为批量的时候,我们还会进行随机打乱(shuffle)。随机打乱有很多不同的做法,一个常见的做法是在每一个回合开始之前重新划分批量,也就是说,每个回合的批量的数据都不一样。
批次的大小对Gradient descent的影响?
假设我们现在有20组训练数据。有两种极端的情况:
-
下图左图情况,没有使用批次,批次大小为训练数量大小,这种使用全批次(Full Batch)的数据来更新参数的方法即批次梯度下降法(Batch Gradient Descent,BGD)。此时模型必须把 20 笔训练数据都看完,才能够计算损失和梯度,参数才能够更新一次。参数更新频率较低,模型的训练过程更加稳定。
-
下图右图情况,Batch Size = 1 时,此时 Batch Size 最小,此时参数更新频率较高,模型的训练过程不稳定,同时在进行梯度估计时,会引入更多的噪声,导致梯度估计的不准确性增加。
当 Batch Size 比较大时,训练过程所花费的时间不一定比 Batch Size 比较小的时候所花费的时间长。如下图所示,这是一个手写数字辨识案例,在该案例中,Batch Size为1时所花费的时间与 Batch Size为1000时所花费的时间几乎相等。这是利用了GPU并行计算的优势,提高了训练效率。但是GPU并行计算的能力是有一个限度的。
假设训练数据只有 60000 笔,批量大小设为1,要 60000 个更新(update)才能“跑”完一个回合(epoch);如果批量大小等于 1000,60 个更新(update)才能“跑”完一个回合(epoch),计算梯度的时间差不多。但是60000次update和60次update比起来,时间差距是很大的。
下图中右图为跑完一个完整的回合(epoch)需要花的时间,BatchSize越大,跑完一个回合的时间越少。
因此实际上,在有考虑并行计算的时候,大的批量大小反而是较有效率的,一个回合大的批量花的时间反而是比较少的。
大的批量更新比较稳定,小的批量的梯度的方向是比较有噪声的(noisy)。但实际上有,噪声的的梯度反而可以帮助训练。
下图中横轴是批量大小,纵轴是正确率。
批量大小越大,验证集准确率越差。但这不是过拟合,因为批量大小越大,训练准确率也是越低。因为用的是同一个模型,所以这不是模型偏见的问题。 但大的批量大小往往在训练的时候,结果比较差。这个是优化的问题,大的批量大小优化可能会有问题,小的批量大小优化的结果反而是比较好的。
为什么 Batch Size 较小时引入更多噪声,但却能使得我们的训练结果更好呢?
假设我们此时选择的是 Full Batch,那我们在更新参数时,则是沿着一个 Loss function来更新,当参数更新到局部最小点或者鞍点时,梯度下降也就随之停止。如果此时我们选择的是 Small Batch,我们在更新参数时,选择第一个 Batch 时,是用 L 1 L^{1} L1这个function来更新,选择第二个 Batch 时,我们是用 L 2 L^{2} L2来更新,如果我们用 L 1 L^{1} L1计算梯度时,更新到梯度为0的点停止了,由于 L 2 L^{2} L2的funciton与 L 1 L^{1} L1不同,因此在 L 1 L^{1} L1 更新至梯度为0的点,此点在 L 2 L^{2} L2不一定梯度为0,因此即便在 L 1 L^{1} L1处无法更新参数了,但是在 L 2 L^{2} L2 处仍然可以更新参数。
如下图:训练损失上面有多个局部最小值,这些局部最小值的损失都很低,其损失可能都趋近于 0。但是局部最小值有好最小值跟坏最小值之分,如果局部最小值在一个“峡谷”里面,它是坏的最小值;如果局部最小值在一个平原上,它是好的最小值。
如果发生训练时的Loss跟测试时的Loss不一样,虽然只是差一点点。但对在右边在“峡谷”里面的最小值,一差就可以天差地远 。虽然它在训练集上的损失很低,但训练跟测试之间的损失函数不一样,因此测试时,损失函数一变,计算出的损失就变得很大。
大的批量大小会让我们倾向于走到“峡谷”里面,而小的批量大小倾向于让我们走到“盆地”里面。小的批量有很多的损失,其更新方向比较随机,其每次更新的方向都不太一样。即使“峡谷”非常窄,它也可以跳出去,之后如果有一个非常宽的“盆地”,它才会停下来。
在有并行计算的情况下,小的批量跟大的批量运算的时间并没有太大的差距(除非BatchSize特别大)。
1.2 Momentum
动量法(momentum method)是另外一个可以对抗鞍点或局部最小值的方法。
假设误差表面就是真正的斜坡,参数是一个球,把球从斜坡上滚下来,如果使用梯度下降,球走到局部最小值或鞍点就停住了。 但是在物理的世界里,一个球如果从高处滚下来,就算滚到鞍点或鞍点,因为惯性的关系它还是会继续往前走。如果球的动量足够大,其甚至翻过小坡继续往前走。 因此在物理的世界里面,一个球从高处滚下来的时候,它并不一定会被鞍点或局部最小值卡住,如果将其应用到梯度下降中,这就是动量。
引入动量后,每次在移动参数的时候,不是只往梯度的反方向来移动参数,而是根据梯度的反方向加上前一步移动的方向决定移动方向。
图中红色虚线方向是梯度的反方向,蓝色虚线方向是前一次更新的方向,蓝色实线的方向是下一步要移动的方向。把前一步指示的方向跟梯度指示的方向相加就是下一步的移动方向。
具体来说,首先我们需要有一个初始的参数 θ 0 \theta_0 θ0,假设一开始前一步的Movement变化量为0,即 M o v e m e n t Movement Movement m 0 = 0 m^0=0 m0=0,接下来通过初始参数计算出 g 0 g^0 g0,更新Movement参数,即 m 1 = λ m 0 − η g 0 m^1=\lambda m^0-\eta g^0 m1=λm0−ηg0,然后更新我们的 θ \theta θ参数, θ 1 = θ 0 + m 1 \theta^1=\theta^0+m^1 θ1=θ0+m1,以此类推,不断反复更新参数。
m i m^i mi也可以理解为过去所计算所有gradient的总和,其中 η \eta η是学习率, λ \lambda λ是钱一个方向的权重参数,是需要调的。