名词解释

名词定义
original-loss整个训练集上的loss
minibatch-loss在一个mini batch上的loss
BGD最原始的梯度下降算法,为了计算original-loss上的梯度,需要使用训练集全部数据
SGD(近似)计算original-loss梯度时,只使用一个mini batch,相当于用minibatch-loss上的梯度去近似original-loss梯度
奇点(只是为了方便说明而起的名字)local minimal和saddle point

SGD vs BGD

下面将通过BGD与SGD的对比,来对SGD进行深入理解。

效率方面

深度学习使用的训练集一般都比较大(几十万~几十亿)。而BGD算法,每走一步(更新模型参数),为了计算original-loss上的梯度,就需要遍历整个数据集,这显然是不现实的。而SGD算法,每次随机选择一个mini-batch去计算梯度,在minibatch-loss上的梯度显然是original-loss上的梯度的无偏估计,因此利用minibatch-loss上的梯度可以近似original-loss上的梯度,并且每走一步只需要遍历一个minibatch(一~几百)的数据。

优化方面

SGD优势

(a)BGD容易陷入original-loss的奇点,而SGD不容易陷入;
(b)SGD也不会陷入minibatch-loss的奇点。
解释:
(a)original-loss存在很多奇点,而BGD每次下降的方向就是original-loss的负梯度,因此BGD很容易陷入某个奇点,而无法达到global minimal(或者比较好的local minimal)。SGD一定程度上可以避免这个情况,这可以从2个角度来理解。
从引入randomness的角度来看,SGD中计算的梯度是对original-loss梯度的近似,相当于在original-loss梯度的基础上加了randomness,因此即使当前走到了original-loss的奇点,SGD计算的梯度因为引入了randomness,所以也不接近0,比较容易跳出奇点。
另一个角度,SGD计算的不是original-loss的梯度,而是minibatch-loss的梯度。显然original-loss和minibatch-loss的形状不同,奇点分布也不同,如果当前这个点在original-loss上是奇点,但这个点在minibatch-loss中并不是奇点,此时使用minibatch-loss的负梯度作为下降方向,自然就不会陷入这个点了。
(b)主要是因为每次迭代,都会使用不同的mini batch,而不同的minibatch-loss的形状不同。就算此时陷入了当前minibatch-loss的奇点,那么下一次迭代,这个点也不一定就是下一个minibatch-loss的奇点,如果不是的话,自然就跳出来了。

SGD劣势

SGD走的路径比较曲折(震荡),尤其是batch比较小的情况下。
解释:
为了方便说明,假设loss函数是凸函数(没有奇点,local minimal就是global minimal)。即使loss函数不是凸函数也是相同的道理。 需要记住,不管使用什么优化方法,待优化的目标都是original-loss,分析问题都要从这一点出发。
BGD每次走的方向是original-loss的负梯度方向,是original-loss在当前点上的最速下降方向。而SGD每次走的方向是minibatch-loss的负梯度方向(或者理解成original-loss的负梯度+randomness),显然这个方向和original-loss的负梯度方向不同,也就不是original-loss在当前位置的最快下降方向(如果这个mini batch的大部分数据点的target是错误的,甚至有可能是original-loss在当前位置的上升方向),所以使用SGD算法从当前点走到global minimal的路径会很曲折(震荡)。
为了减少震荡,一个方法是增大batch size,原因是minibatch-loss的梯度是对original-loss梯度的无偏估计(bias为0),并且variance随着batch size的变大而减小。当batch size足够大(比如接近训练集),此时SGD就退化成了BGD,就会带来上面说的那些问题。因此batch size需要选择合适大小,一般是几十到几百。
减少震荡的方法还包括动量、Rmsprop等,详情参考另一篇博客《Momentum Rmsprop Adam》

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐