几种梯度下降法以及batch size与learning rate的关系

深度学习被戏称为“炼金师”,我们需要凭借经验对一些参数进行调试,其中在学习过程中梯度和学习率是比较重要的参数。下面我们首先介绍几种梯度下降法,然后再说明批处理大小与学习率之间的关系。

GD(Gradient Descent)

在整个训练集中计算当前的梯度,选定一个步长进行更新。

GD的优点是,基于整个数据集得到的梯度,梯度估计相对较准,更新过程更准确。

GD的缺点,一个是当训练集较大时,GD的梯度计算较为耗时;二是现代深度学习网络的loss function往往是非凸的,基于凸优化理论的优化算法只能收敛到local minima,因此使用GD训练深度神经网络,最终收敛点很容易落在初始点附近的一个local minima,不太容易达到较好的收敛性能。

SGD(stochastic gradient descent)

每次计算梯度只用一个样本。

优缺点:这样做的好处是计算快,而且很适合online-learning数据流式到达的场景,但缺点是单个sample产生的梯度估计往往很不准,所以得采用很小的learning rate,而且由于现代的计算框架CPU/GPU的多线程工作,单个sample往往很难占满CPU/GPU的使用率,导致计算资源浪费。

mini-batch

一次采用batch size的sample来估计梯度,这样梯度估计相对于SGD更准,同时batch size能占满CPU/GPU的计算资源,又不像GD那样计算整个训练集。同时也由于mini batch能有适当的梯度噪声[8],一定程度上缓解GD直接掉进了初始点附近的local minima导致收敛不好的缺点,所以mini-batch的方法也最为常用。

在一些计算机视觉任务中,如果网络收敛效果不好,我们常常需要对参数进行调试,盲目调试浪费算力浪费时间,我们通过数学表达式指导我们调参。

因为显存的限制,我们batch size会设置的很小,尤其在分割任务中,单张图像很大,但是在超分任务中图像又较小。一般在分割中batch size设置8,但是有时候模型比较小的时候我需要调大一点,使得曲线看起来更加平滑一些。但是增大batch size对于梯度估计有什么影响呢?

假设batch size为m,对于一个minibatch,

loss为:    \large L = \frac{1}{m}\sum_{i=1}^{m}L(x_{i},y_{i})

梯度为: \large g = \frac{1}{m}\sum_{i=1}^{m}g(x_{i},y_{i})

那么整个minibatch的梯度方差为:

\large Var = Var(\frac{1}{m}\sum_{i=1}^{m}g(x_{i},y_{i})) =\frac{1}{m^{2}}Var(g(x_{1},y_{1}+...+g(x_{m},y_{m})) =\frac{1} {m^{2}}mVar(g(x_{1},y_{1})) =\frac{1}{m}Var(g(x_{1},y_{1})

由于每个样本\large g(x_{i},y_{i})是随机从训练集sample得到的,因此样本梯度的方差相等,可以看到当batch size增大m倍时,相当于将梯度方差减小m倍,因此梯度更加准确。

如果要保持方差跟原来一样,相当于给定了这么大方差带宽那么就可以增大learning rate,利用方差容量,同时利用方差的变换公式,得到:\large \frac{1}{m}Var(\sqrt{m}*lr*g(x_{1},y_{1}))=Var(lr*g(x_{1},y_{1}))

所以可以将lr增加sprt(m)倍,以提高训练速度。

 

 

 

 

 

 

 

你可能感兴趣的:(机器学习,知识点,深度学习笔记)