深度学习之:优化器 (optimizer)
我们知道,越复杂的神经网络 , 越多的数据 , 需要在训练神经网络的过程上花费的时间也就越多. 原因很简单, 就是因为计算量太大了. 可是往往有时候为了解决复杂的问题, 复杂的结构和大数据又是不能避免的, 所以我们需要寻找一些方法, 让神经网络聪明起来, 快起来,让cost()的收敛速度更加理想.
这个时候,就应该让优化器出场大显神通了.
今天,我们来探讨一下各种常见的优化器
1.Batch gradient descent 批梯度下降
BGD 采用整个训练集的数据来计算 cost function 对参数的梯度
每次更新我们需要计算整个数据集的梯度,因此使用批量梯度下降进行优化时,计算速度很慢,而且对于不适合内存计算的数据将会非常棘手。批量梯度下降算法不允许我们实时更新模型。
我们会事先定义一个迭代次数 epoch,首先计算梯度向量 params_grad,然后沿着梯度的方向更新参数 params,learning rate 决定了我们每一步迈多大。
但是批量梯度下降算法能确保收敛到凸平面的全局最优和非凸平面的局部最优。
2.Stochastic Gradient Descent (SGD) 随机梯度下降
随机梯度下降算法参数更新针对每一个样本集x(i) 和y(i) 。批量梯度下降算法在大数据量时会产生大量的冗余计算,比如:每次针对相似样本都会重新计算。这种情况时,SGD算法每次则只更新一次。因此SGD算法通过更快,并且适合online。
但是SGD以高方差进行快速更新,这会导致目标函数出现严重抖动的情况。一方面,正是因为计算的抖动可以让梯度计算跳出局部最优,最终到达一个更好的最优点;另一方面,SGD算法也会因此产生过调。
当我们稍微减小 learning rate,SGD 和 BGD 的收敛性是一样的。
3.Min-batch gradient descent 小批量梯度下降法
MBGD 每一次利用一小批样本,即 n 个样本进行计算,
这样它可以降低参数更新时的方差,收敛更稳定,
另一方面可以充分地利用深度学习库中高度优化的矩阵操作来进行更有效的梯度计算。
和 SGD 的区别是每一次循环不是作用于每个样本,