优化为什么会失败呢?
— 梯度为零,有两种情况:局部极小值和鞍点,这两种点统称为critical point(驻点)。在局部极小值点无路可走,而鞍点只要能够逃离的话还是可以继续下降的。
如何判断是局部极小还是鞍点呢?
例:
\(H\)或许可以告诉我们参数更新的方向!
例:
低维空间里的局部极小值点可能只是高维空间中的一个鞍点,那么当你有很多参数的时候,会不会局部极小值点就很少见了呢?
考虑有20个样本的情况(\(N=20\)):
左边的方法更新的一步更稳定,但是看起来花的时间长。但是实际上,考虑到并行运算,大的batch size在计算梯度的时候并不需要更长的时间。
并且,较小的batch一次epoch所需的时间反而更长(花更多的时间来把所有的数据看一遍)。
那么大的batch就一定好吗?
从上图可以看出,小的batch size的表现更好。那么大的batch size有什么问题呢? — Optimization Fails(因为用的都是一样的模型,所以不是因为model bias)
此外,small batch在测试数据上表现也更好。
Small Batch v.s. Large Batch,两者各有优缺点,所以batch size是一个需要我们决定的hyperparameter。
两者兼得?
Large Batch Optimization for Deep Learning: Training BERT in 76 minutes
Extremely Large Minibatch SGD: Training ResNet-50 on ImageNet in 15 Minutes
Stochastic Weight Averaging in Parallel: Large-Batch Training That Generalizes Well
Large Batch Training of Convolutional Networks
Accurate, large minibatch sgd: Training imagenet in 1 hour
考虑物理世界,error surface就是斜坡,而参数是一个球,球从斜坡上滚下来,由于惯性的存在,它不一定会被鞍点或局部极小点卡住。
一般的梯度下降:计算初始点处的梯度,然后往梯度的反方向更新一次参数,得到一组新的参数,然后计算梯度并往梯度的反方向更新一次参数……不断重复这个过程。
人们总是以为训练卡住是因为参数到了驻点附近,但是实际计算一下梯度大小的变化,可以发现其实梯度并没有真的变得很小。
如果说训练停住往往不是因为驻点,那是因为什么呢?以一个凸的error surface为例,从头到尾采用同一个学习率是得不到好的结果的。
不同的参数需要不同的学习率。如果在某个方向上梯度的值很小,梯度非常平坦,那么我们会希望学习率大一点;反之,如果在某个方向上非常陡峭,那么会希望学习率小一点。那么如何来自适应地调整学习率呢?
以某一个参数\(\pmb{\theta}\)更新的过程为例。原来\(\pmb{\theta}\)的更新为 \(\pmb{\theta}_i^{t+1} \leftarrow \pmb{\theta}_i^t - \eta g_i^t\),\(\boldsymbol{g}_i^t = \left. \frac{\partial L}{\partial \pmb{\theta}_i} \right\vert_{\pmb{\theta} = \pmb{\theta}^{t}}\)。现在,将\(\eta\)这项改为\(\frac{\eta}{\sigma_i^t}\),这是一个与参数相关的学习率。
在AdaGrade中,即使是同样的参数,所需的学习率也会随着时间的改变而变化。
之前,我们似乎假设同一个参数对应的梯度都是差不多的值。实际上,以上图为例,同一个参数我们也期望有不同的学习率,那就需要学习率能够动态地适应调整。
原文:ADAM: A METHOD FOR STOCHASTIC OPTIMIZATION
如何解决这种震荡问题呢?