5. 类神经网络训练(batch and momentum)
Batch
每次会把训练资料分成几份不同的batch,然后对于每一个batch做gradient,更新参数,然后不断重复。所有的batch做完就是一次epoch
对于每一次epoch都会打乱batch,都会重新分配epoch的方式,被称为shuffle。
Smal Batch vs Large Batch
假设我们有20个example,不分batch和分batch查询loss的图为以下
一种是看完所有的example再决定参数,这组方式时间长,但是比较powerful。另一种是只要看完一个example就更新一次参数,因此会比较noisy,花费的时间也较短。
实际上改为small batch和large batch的时间没有多大区别,因为平行运算可以平行处理不同数据。
Parallel Computing
对于batch size增加所花的时间有人做了实验,测试就是mnist手写数据测试,如下图所示,batch size在1000以前,batch size设定并不会导致时间增长,只有batch size增长到1000后时间才迅速增长
- smaller batch requires longer time for one epoch(longer time for seeing all data once)
Big Batch?
因为平行运算的关系,所以batch size增大反而跑完一个epoch的时间会减少,因此实际上大的batch时间会比较少。那么我们为什么并不会选择大的batch呢?
因为小的batch的noisy比较多,反而可以帮助训练。
通过上图可以发现,随着batch size增加tranning acc和val acc都在变小,原理是:
Noisy update
Noisy update is better for training
可以发现,full batch的情况下loss很容易卡住在saddle point,但是smal
batch的情况下l1卡住可以继续算l2,因此没有任何问题。
small batch is bettern on testing data?
但我们实际上最关心的还是测试集的accurancy,根据研究者的实验发现,small batch size在测试集准确率是高于large batch size的。
在平原上的minima比在峡谷的minima好找。
解释之一是:假设training loss和testing loss有一个mismatch,那么平稳的时候mismatch会差距不大,都是在平稳的低谷,如图所示。但是如果是在峡谷区域,那么这个mismatch的变化会很大,而大的batch size更倾向于让我们走的平稳,大的batch size则会倾向于让我们走到盆地。
因此总结后得出,超参数需要自己调整。
Momentum
假设error surface是真正的斜坡,我们的参数是一个球。那么在物理的世界里,并不会因为saddle point而被卡住,而是会不断下滑,因为有惯性,如果动量充足还可以继续进行。因此我们可以引用动量来解决问题。
(Vanilla)Gradient Descent
一般向的梯度更新的过程,更新梯度,变化$\theta$。
Gradient Descent + Momentum
根据前一步的方向g的反方向以及m做力的合成来做两者的折中,确定下一步走的方向。
对于原本的saddle point,虽然此时的gradient是0,但是加上了上一步的方向是往右的,因此下一步方向仍然是右。