批量梯度下降、随机梯度下降与小批量梯度下降算法之间的比较

这三种算法都用于反向传播的优化损失函数算法。在每轮迭代中更新一次权重w,根据多次迭代,最终无限的靠近我们预期的权重最优值。

1. 批量梯度下降算法:

(1) 如果数据集比较小,完全可以采用全数据集(Full Batch Learning)的形式,采用全数据有两个好处:

a. 由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。
b. 由于不同权重的梯度值差别巨大,因此选取一个全局的学习率很困难。 Full Batch Learning 可以使用 Rprop 只基于梯度符号并且针对性单独更新各权值。

(2) 但是批量梯度下降也存在一下这些缺点:

a. 梯度下降算法并不能保证被优化函数达到全局最优解,只有当损失函数为凸函数时,梯度下降算法才能保证达到全局最优解,因此不能保证一定达到全局最优,受限于损失函数是否为凸函数。

b. 梯度下降算法的另外一个问题是计算时间太长,因为要在全部训练数据上最小化损失,在海量训练数据下,这样是十分耗时。

2. 随机梯度下降算法:

为了加速训练的过程,可以使用随机梯度下降算法(stochastic gradient descent-SGD)。随机梯度下降算法也是称为"在线学习"。

(1) 这个算法优化的不是在全部训练数据上的损失函数,而是在每轮迭代中,随机优化某一条训练数据上的损失函数,这样每一轮参数的更新速度大大加快。

(2) 但是带来了如下问题:

在某一条数据上损失函数更小并不代表在全部数据上的损失函数更小,于是使用随机梯度下降优化得到的神经网络甚至可能无法达到全局最优。

3. 小批量梯度下降算法:

为了综合批量梯度下降算法和随机梯度下降算法的优缺点,在实际应用中一般采用这两个算法的这种----->每次计算一小部分训练数据的损失函数。小批量梯度下降算法(Mini-batches Learning)在深度学习很多算法的反向传播算法中非常常用。这一小部分训练数据也称为一个batch,因此也引入了batch_size的概念,batch_size顾名思义就是来度量每一个batch中实例的个数。

(1) 引入batch有很好的优势:

a. 通过矩阵运算,每次在一个batch上优化神经网络参数并不会比单个数据慢太多。

b. 每次使用一个batch可以大大减小收敛所需要的迭代次数,同时可以使收敛到的结果更加接近梯度下降的效果。

--->但是小批量梯度下降算法带来一个问题,那就是如何选取最优的batch_size?

(2) 可不可以选择一个适中的 Batch_Size 值呢?

当然可以,这就是小批量梯度下降法(Mini-batches Learning)。因为如果数据集足够充分,那么用一半(甚至少得多)的数据训练算出来的梯度与用全部数据训练出来的梯度是几乎一样的。

(3) 在合理范围内,增大 Batch_Size 有何好处?

a. 内存利用率提高了,大矩阵乘法的并行化效率提高。

b. 跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。

c. 在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。

(4) 盲目增大 Batch_Size 有何坏处?

a. 内存利用率提高了,但是内存容量可能撑不住了。

b. 跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。

c. Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。

 

---------------------------------------

原文:https://zhuanlan.zhihu.com/p/37714263

你可能感兴趣的:(MachineLearning)