status
type
date
slug
summary
tags
category
password
icon
Total Videos
Link
Video Duration
Batch
0:11
前文我们提到了Batch这个概念,现在
dataloader
将训练集划分为N个batch,每个batch分别计算Loss和update,当所有的batch都update一遍后,就称为经历了一个epoch。而这里面有个重要的东西叫shuffle,用来在每个epoch开始前打乱batch,让每个epoch的batch都不一样,以便机器更好的理解数据之间的关系
为什么要用batch
如上图所示,我们现在有N=20个batch的数据,我们讨论两种极端的情况:
- 我们将
Batch_size
设置为N也称为Full batch,代表一次性把20batch的数据全部读取,一次计算Loss和Gradient
- 我们将
Batch_size
设置为1,代表我们分20次一个batch一个batch的读取数据,然后一次一次计算Loss和Gradient、
这两种方式的区别是,左边这种就像游戏里的大招一样,一次性读完所有的数据,虽然伤害很高,但是蓄力时间长。右边这种一次读取一个batch的方式,可以提前计算Loss,就像游戏里的小技能,CD短但伤害不高。
对于左图来说,它的一次update就等于一次epoch;而对于右图来说,要update20次参数才等于一次epoch。
可能直觉上我们会认为右边的方法要比左边的方法计算的快得多,但事实真的如此吗?
上图是MNIST任务的测试结果,左图是update的时间,发现batch size并不完全越小就越快,这是因为GPU是平行运算的,采用适量大的batch size,update的时间也不会明显的升高,所以可以大大家快batch处理效率,而这个曲线的斜率增加速度取决于你的GPU性能。
右图是epoch的时间,可以发现batch size越小,耗费的时间越多,在了解了GPU的能力后,这相当符合直觉,batch size 越大,update的次数就越少,每个epoch花费的时间自然越少,这也是因为GPU的并行运算能力。
现在我们知道了Batch size设大点速度也并不会减慢,那么是不是batch size大的话,训练出的模型效果也要比batch size小的好呢?毕竟batch size越大,考虑的数据就越多,计算的Loss和Gradient次数越少,更容易接近最佳的模型。
这次仍然不符合直觉,上图是两个相同的DNN训练的不同任务,其中横轴是batch size,纵轴是准确度。可以看到,两个任务都随着batch size的增大,准确度降低,这显然不是overfitting和model bias问题,而是optimization问题。
那为什么会出现这种情况呢?
一种可能的猜想是,batch size太大,一次性就读取了所有数据,计算Gradient的时候一下子就掉进了Local minima里面;而小的batch size,因为计算的Gradient多,所以即使掉进Local minima也无伤大雅。
此外,小的batch size与同样水平的训练集Loss但是用大batch size训练的模型相比,小的batch size在测试集Loss上表现的会更好,这就说明大的batch size遇到了overfitting问题。
这是为什么呢?一种可能的猜想如下:
Local minima亦有还坏之分,小的batch size倾向于掉入平缓的Local minima中,这种Local minima即使掉入训练集的Loss和测试集的Loss相差也不会很大;而大的batch size倾向于掉入峡谷形的Local minima中,这种Local minima因为太过狭小可能训练集和测试集的Loss形状会相差很大。
这是因为小的batch size要不断的update参数,所以每次update的方向都可能不一样,相对来说掉入平缓形状的Local minima中的概率要远比峡谷形的Local minima高。
总结
总结前文我们可以知道小的batch在optimization和模型泛用性上有优势,而大的batch在epoch速度上有优势,因此batch size也是一个hyperparameter。
Momentum
Momentum与Hessian一样是解决critical point问题的另一种方法。
它的原理来自物理学中的惯性,任何运动的物体都有动量,Momentum的意思就是借助动量原理来冲出Local minima。
首先我们看一下最原始的Gradient Descent。
首先是一个原始的,然后计算Gradient ,然后往Gradient的反方向移动,如此反复。
而现在多了一个Momentum。
它是Gradient和momentum的向量和,每一次移动前不仅要考虑Gradient的反方向,还要考虑上一步的Momentum。
或者说我们每次移动,考虑的是过去每次Gradient的总和。
以上图来说,第三个小球很明显掉进的Local minima,但是因为有通过过去的Gradient算出来的Momentum,所以即便在Lcoal minima,它也有一个“惯性”继续向右边走。甚至即使Gradient说明应该向左走的时候(第四个球),它仍然能够翻过“山峰”,到达真正的Global minima。
- 作者:铃溪
- 链接:https://lingxi.mozzai.top/article/a1736ee1-d9de-4303-a70d-a52f24be5232
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章