【Deep Learning 】深度模型中的优化问题(一)SGD

本文是Deep Learning 之 最优化方法系列文章的SGD方法。主要参考Deep Learning 一书。

以下节选自个人深度学习笔记。
内容整合来源于网络与个人理解。

先来看一下学习步长
口 学习步长的设置是个难题:若学习步长过大,则目标函数可能不降低;
但若学习步长过小,则训练过程可能非常缓慢。
口 解决之道:训练几轮(轮数t)后就按一些因素调整学习步长。

【Deep Learning 】深度模型中的优化问题(一)SGD_第1张图片
碎碎念:①学习步长↓ <=> 训练轮数t↑
②越接近“谷底”,步长应该越小。但希望步长变化尽量缓慢,故作为分母并开方。

 SGD(stochastic gradient descent) 的问题

碎碎念:在这里SGD和min-batch是同一个意思,抽取m个小批量(独立同分布)样本,通过计算他们平梯度均值。后面几个改进算法,均是采用min-batch的方式。
SGD,即随机梯度下降,是梯度下降的batch版本。对于训练数据集,我们首先将其分成n个batch,每个batch包含m个样本。我们每次更新都利用一个batch的数据,而非整个训练集。其中,为学习率,为x在t时刻的梯度。

这么做的好处在于:
• 当训练数据太多时,利用整个数据集更新往往时间上不显示。batch的方法可以减少机器的压力,并且可以更快地收敛。
• 当训练集有很多冗余时(类似的样本出现多次),batch方法收敛更快。以一个极端情况为例,若训练集前一半和后一半梯度相同。那么如果前一半作为一个batch,后一半作为另一个batch,那么在一次遍历训练集时,batch的方法向最优解前进两个step,而整体的方法只前进一个step。
SGD方法的一个缺点是:
• 其更新方向完全依赖于当前的batch,因而其更新十分不稳定。解决这一问题的一个简单的做法便是引入momentum。

特点总结
口 learning rate不易确定,如果选择的太小,收敛速度会很慢;
如果太大,loss function 就会在极小值处不停地震荡甚至偏离。
口 每个参数的 learning rate 都是相同的(弊端:单一),如果数据是稀疏的,则希望对出现频率低的特征进行大一点的更新。
口 深层神经网络之所以比较难训练,并不是因为容易进入局部最小,而是因为学习过程容易陷入到马鞍面中,在这种区域中,所有方向的梯度值都几乎是 0 。

补充结论
1.SGD应用于凸问题时,k次迭代后泛化误差的数量级是O(1/sqrt(k)),强凸下是O(1/k)。
2.理论上GD比SGD有着更好的收敛率,然而[1]指出,泛化误差的下降速度不会快于O(1/k)。鉴于SGD只需少量样本就能快速更新,这远超过了缓慢的渐进收敛,因此不值得寻找使用收敛快O(1/k)。
3.可能由于SGD在学习中增加了噪声,有正则化的效果。
4.在某些硬件上使用特定大小的数组时,运行时间会更少。尤其是在使用GPU时,通常使用2 的幂数作为批量大小可以获得更少的运行时间。一般,2 的幂数的取值范围是32 到256,16 有时在尝试大模型时使用。
5.如果批量处理中的所有样本可以并行地处理(通常确是如此),那么内存消耗和批量大小会正比。对于很多硬件设施,这是批量大小的限制因素。

算法如下
【Deep Learning 】深度模型中的优化问题(一)SGD_第2张图片

参考:
  1. Deep Learning 最优化方法之SGD
  2. 各种优化方法总结比较(sgd/momentum/Nesterov/adagrad/adadelta)

你可能感兴趣的:(深度学习,Python,算法,SGD,随机梯度下降,最优化问题,深度学习)