梯度下降法作为机器学习中较常使用的优化算法,其有着3种不同的形式:批量梯度下降(Batch Gradient Descent)、随机梯度下降(Stochastic Gradient Descent)、小批量梯度下降(Mini-Batch Gradient Descent)。其中小批量梯度下降法也常用在深度学习中进行模型的训练。本文将对这3种不同的梯度下降法进行理解。
下面我们以线性回归算法来对三种梯度下降法进行比较。
一般线性回归函数的假设函数为:
对应的损失函数为:
批量梯度下降
简介
批量梯度下降(Batch Gradient Descent,BGD),是梯度下降法最原始的形式,它的具体思路是在更新每一参数时都使用所有的样本来进行更新。
训练的目的是要误差函数尽可能的小,即求解weights使误差函数尽可能小。首先,我们随机初始化weigths,然后不断反复的更新weights使得误差函数减小,直到满足要求时停止。这里更新算法我们选择梯度下降算法,利用初始化的weights并且反复更新weights:
这里α代表学习率,表示每次向着J最陡峭的方向迈步的大小。为了更新weights,我们需要求出函数J的偏导数。首先当我们只有一个数据点(x,y)的时候,J的偏导数是:
则对所有数据点,上述损失函数的偏导求和为:
那么每次参数更新的伪代码如下:
由上图更新公式可以看到,每一次的参数更新都用到了所有的训练数(比如有m个,就用到了m个),如果训练数据非常多的话,是非常耗时的。
总结
- BGD在每次更新模型的时候,都要使用全量样本来计算更新的梯度值。如果有m个样本,迭代n轮,那么需要是m*n的计算复杂度。BGD的优势在于计算的是全局最优解,效果较SGD会好一些,劣势在于计算开销大。
- 可以在每次迭代时对所有样本向量进行并行计算。但是遍历全部样本仍需要大量时间,尤其是当数据集很大时(几百万甚至上亿),就有点力不从心了。
随机梯度下降
简介
随机梯度下降(Stochastic Gradient Descent,SGD),随机梯度下降是通过每个样本来迭代更新一次,如果样本量很大的情况(例如几十万),那么可能只用其中几万条或者几千条的样本,就已经将theta迭代到最优解了,对比上面的批量梯度下降,迭代一次需要用到十几万训练样本,一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次。但是,SGD伴随的一个问题是噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。
总结
- SGD在每次更新模型的时候,只要当前遍历到的样本来计算更新的梯度值就行了。如果迭代n轮,则只需要n的计算复杂度,因为每轮只计算一个样本。
- SGD优势在于计算开销减小很多,劣势在于计算的是局部最优解,可能最终达不到全局最优解。在数据量大的时候,SGD是较好的折衷选择。
- 在学习过程中加入了噪声,提高了泛化误差。
- SGD可以跳出局部最优解,从而寻找到真正的全局最优解。
小批量梯度下降
简介
mini-batch梯度下降法是介于SGD和BGD中间的一种优化方式,基本思想是每次拿出batch_size大小的数据做参数更新,既不是全部数据量也不是单个数据量,这也是并行计算的一种应用。
batch size对收敛速度的影响
Batch size大,收敛速度会比较慢,因为参数每次更新所需要的样本量增加了,但是会沿着比较准确的方向进行。
在合理范围内,增大Batch_Size有何好处?
内存利用率提高了,大矩阵乘法的并行化效率提高。
跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小
盲目增大 batch_size 有何坏处?
内存利用率提高了,但是内存容量可能撑不住了。
跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
Batch_size 增大到一定程度,其确定的下降方向已经基本不再变化。