- 1. 梯度下降
- 2. 批量梯度下降Batch gradient descent(BGD)
- 3. 随机梯度下降Stochastic gradient descent(SGD)
- 4.小批量梯度下降 Mini-batch gradient descent(MBGD)
1. 梯度下降
-
目标函数:
中h(x)为我们的模型预测结果,其中规定x0=1, θ(0~n)为该函数的参数,即我们通过损失函数需要调整的内容。y为准确结果,损失函数如下(均方):
梯度下降法:需要同时更新θ1,θ2,…,θn,的值
-
步长问题:在步长α的选取过程中,太小会造成下降速度过慢,太大会造成抖动,可能到不了谷底。解决方法:距离谷底较远(梯度较大的位置),步幅大一些;接近谷底的位置(梯度较小的位置),步幅小一些。步幅的设置可以与梯度数值的大小正相关。
2. 批量梯度下降Batch gradient descent(BGD)
梯度更新策略 :BGD 采用整个训练集的数据来计算 cost function 对参数的梯度
for i in range(nb_epochs):
params_grad = evaluate_gradient(loss_function, data, params)
params = params - learning_rate * params_grad
我们会事先定义一个迭代次数epoch,首先计算梯度向量 params_grad,然后沿着梯度的方向更新参数 params,learning_rate 决定了我们每一步迈多大(上文提到的步长α)。Batch gradient descent(BGD) 对于凸函数可以收敛到全局极小值,对于非凸函数可以收敛到局部极小值。
缺点: 一次更新中就要对整个数据集计算梯度,计算速度非常慢,遇到大规模数据集会非常棘手,而且不能投入新数据实时更新模型。
3. 随机梯度下降Stochastic gradient descent(SGD)
这里有详细的SGD讲解。
梯度更新规则:和 BGD 的一次用所有数据计算梯度相比,SGD 每次更新时对每个样本进行梯度更新,对于很大的数据集来说,可能会有相似的样本,这样 BGD 在计算梯度时会出现冗余,而 SGD 一次只进行一次更新,就没有冗余,而且比较快,并且可以新增样本。
for i in range(nb_epochs):
np.random.shuffle(data)
for example in data:
params_grad = evaluate_gradient(loss_function, example, params)
params = params - learning_rate * params_grad
# shuffle() 方法将序列的所有元素随机排序。
看代码,可以看到区别,就是整体数据集是个循环,其中对每个样本进行一次参数更新。
缺点:但是SGD因为更新比较频繁,会造成cost function(loss function)有严重的震荡。
BGD可以收敛到局部极小值,当然SGD的震荡可能会跳到更好的局部极小值处。当我们稍微减小learning rate,SGD和BGD的收敛性是一样的。
4.小批量梯度下降 Mini-batch gradient descent(MBGD)
梯度更新规则: MBGD 每一次利用一小批样本,即 n 个样本进行计算,这样它可以降低参数更新时的方差,收敛更稳定,另一方面可以充分地利用深度学习库中高度优化的矩阵操作来进行更有效的梯度计算。
和 SGD 的区别是每一次循环不是作用于每个样本,而是具有 n 个样本的批次,直到所有数据都循环完。
for i in range(nb_epochs):
np.random.shuffle(data)
for batch in get_baches(data, batch_size=50):
params_grad = evaluate_gradient(loss_function, batch, params)
params = params - learning_rate * params_grad
超参数的设定:n一般取值在 50~256
缺点: MBGD不能保证良好的收敛性