回顾
上偏文章我们了解到,权重迭代过程中可能遇到鞍点而阻断迭代过程,这是因为每一次迭代都以所有样本(故又称为批梯度下降算法)为依据(前后有直接联系),因此当梯度为零时相应增量也为零,导致新权重与不会改变。为了尽量避免这种情况出现,引入随机梯度下降算法,降低甚至消除权重前后权重间的联系,使得权重有可能从鞍点中‘跳脱’出来。
随机梯度下降(SGD)
批梯度下降:
随机梯度下降:
观察公式,随机梯度下降算法与梯度下降算法的区别在于每次迭代依据为随机的单个样本的梯度,而不是所有样本的梯度和平均值,而单个样本之间是独立的,由此降低了前后权重的联系,为跳出鞍点束缚提供了可能。
实现
同样以上篇文章的例子为例,只需修改部分代码即可:
1 | import numpy as np |
损失函数图像
优缺点
批梯度下降(BGD)
批梯度下降算法每一次迭代都要用到所有的样本,如果样本数量很多的话将会非常耗时,但其每次迭代都会朝着当前最优方向前进,故迭代次数相对较少。
随机梯度下降(SGD)
随机梯度下降是通过每个样本来迭代更新一次,对比上面的批量梯度下降,迭代一次需要用到所有训练样本(往往如今真实问题训练数据都是非常巨大),一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次。但是,SGD伴随的一个问题是噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。
小批量梯度下降算法(MBGD)
BGD 与 SGD 各有各的优缺点,那么能不能在两种方法的性能之间取得一个折衷呢?即,算法的训练过程比较快,而且也要保证最终参数训练的准确率,而这正是小批量梯度下降法(Mini-batch Gradient Descent,简称MBGD)的初衷。具体方法为:将所有样本划分为多个组(Mini-Batch),每组内使用BGD算法。
实现
1 | # 准备数据集 |
损失函数
1 | 训练前预测: 4 4.0 |
由图像可以看出其收敛速度较快,事实上在本例中它只迭代了20次左右就取得最优权重。
- 参考:
- 《Pytorch深度学习实践》