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的时间没有多大区别,因为平行运算可以平行处理不同数据。

image-20210806113717321

Parallel Computing

对于batch size增加所花的时间有人做了实验,测试就是mnist手写数据测试,如下图所示,batch size在1000以前,batch size设定并不会导致时间增长,只有batch size增长到1000后时间才迅速增长

image-20210806113645194

  • smaller batch requires longer time for one epoch(longer time for seeing all data once)

image-20210806114350083

Big Batch?

因为平行运算的关系,所以batch size增大反而跑完一个epoch的时间会减少,因此实际上大的batch时间会比较少。那么我们为什么并不会选择大的batch呢?

因为小的batch的noisy比较多,反而可以帮助训练。

image-20210806114906435

通过上图可以发现,随着batch size增加tranning acc和val acc都在变小,原理是:

Noisy update
  • Noisy update is better for training

    image-20210806115532831

可以发现,full batch的情况下loss很容易卡住在saddle point,但是smal

batch的情况下l1卡住可以继续算l2,因此没有任何问题。

small batch is bettern on testing data?

但我们实际上最关心的还是测试集的accurancy,根据研究者的实验发现,small batch size在测试集准确率是高于large batch size的。

image-20210806141808865

image-20210806141659715

在平原上的minima比在峡谷的minima好找。

解释之一是:假设training loss和testing loss有一个mismatch,那么平稳的时候mismatch会差距不大,都是在平稳的低谷,如图所示。但是如果是在峡谷区域,那么这个mismatch的变化会很大,而大的batch size更倾向于让我们走的平稳,大的batch size则会倾向于让我们走到盆地。

image-20210806144832400

因此总结后得出,超参数需要自己调整。

Momentum

假设error surface是真正的斜坡,我们的参数是一个球。那么在物理的世界里,并不会因为saddle point而被卡住,而是会不断下滑,因为有惯性,如果动量充足还可以继续进行。因此我们可以引用动量来解决问题。

image-20210806145237259

(Vanilla)Gradient Descent

image-20210806145411602

一般向的梯度更新的过程,更新梯度,变化$\theta$。

Gradient Descent + Momentum

image-20210806145913141

根据前一步的方向g的反方向以及m做力的合成来做两者的折中,确定下一步走的方向。

image-20210806150326130

image-20210806150506735

对于原本的saddle point,虽然此时的gradient是0,但是加上了上一步的方向是往右的,因此下一步方向仍然是右。