随机梯度下降算法是深度学习中最常用的算法。


梯度下降算法其实也很好理解,以简单的二元函数为例,如果我们想找到二元函数的极值,一般第一步我们是对该二元函数求导,然后令其为0,找出此时自变量的值,将该自变量代入函数式,即可求出该函数的极值。


那么在深度学习中,针对实际问题,我们首先需要建立一个模型,然后确定一个目标函数。目标函数通常是网络输出值和目标之间的误差,误差的形式有很多种,例如常见的有平方差、交叉熵等等。


训练模型的目的是使得目标函数达到极小值。对于一个深度神经网络,它的参数数目比较庞大,因此目标函数通常是一个包含很多参量的非线性函数。对于这个非线性函数,我们采用的是随机梯度下降算法来对参数进行更新。具体步骤如下:


(1)对网络参数进行初始化,一般情况下,权重初始化为均值是0,方差为0.01的高斯分布随机值,而偏置统一初始化为0;

(2)将参数代入网络计算前馈输出值,从而可以根据已有的目标标签得出目标函数值;

(3)根据目标函数值以及各参数与目标函数所构成的树结构,运用后向传播算法计算出每个参数的梯度;

(4)设置学习率大小(随着迭代的步骤增多,学习率通常要逐渐减小,这样可以有效避免训练中出现误差震荡情况),进行参数更新,最一般的更新方式是 新参数=旧参数-学习率×梯度;

(5)重复进行第2~4步,直到网络收敛为止。




那么为什么叫随机梯度下降算法呢?这里的随机是指每次迭代过程中,样本都要被随机打乱,这个也很容易理解,打乱是有效减小样本之间造成的参数更新抵消问题。



随机梯度下降算法通常还有三种不同的应用方式,它们分别是SGD、Batch-SGD、Mini-Batch SGD,下面分别解释一下这三种方式的不同。



SGD是最基本的随机梯度下降,它是指每次参数更新只使用一个样本,这样可能导致更新较慢;



Batch-SGD是批随机梯度下降,它是指每次参数更新使用所有样本,即把所有样本都代入计算一遍,然后取它们的参数更新均值,来对参数进行一次性更新,这种更新方式较为粗糙;



Mini-Batch-SGD是小批量随机梯度下降,它是指每次参数更新使用一小批样本,这批样本的数量通常可以采取trial-and-error的方法来确定,这种方法被证明可以有效加快训练速度。




 
来源: 张泽旺 深度学习每日摘要
智造家