SGD
SGD的全称是stochastic gradient descent,随机梯度下降,是相对batch gradient descent提出来的。
batch gradient descent:将所有训练样本全部投入计算dw,db。好处:这种计算方式求出来的dw和db是最真实的。坏处:如果训练样本特别大,比如100,000个样本,这样会导致很长时间才能计算出一次倒数然后进行一次梯度下降,导致训练特别缓慢。另外计算机的内存也无法存储这么大的矩阵进行计算。
stochastic gradient descent:用每一个训练样本计算dw和db。好处:一个样本计算导数非常快,可以很快的进行一次梯度下降。坏处:一个样本计算的导数与真实导数相差非常大,可能会导致在最小值附近徘徊而无法接近最小值,另外由于只用一个样本计算导数,导致遍历所有样本需要进行一个很大的循环,从整体上而言失去了矩阵计算带来的运算加速。
所以可以使用一种折中的方法,mini-batch gradient descent,现在提到SGD一般指的是这种方法。mini batch一般选择16,32,64等,根据计算机内存决定。这样计算一次导数比较快,所以可以比较快的进行一次梯度下降,而且也有矩阵计算带来的运算加速。
SGD公式表示
表示所有的参数,t代表第t次梯度下降。
tensorflow接口调用
tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
SGD优化效率不高
以下图为例,如果使用SGD优化方式,初始点在红色点出,优化过程会出现图中的zigzag的线路,以非常迂回的方式到达最优点。
为何会出现上图这样的曲线?
对上图而言,假设横轴是w1,纵轴是w2,那么这个图形如果从立体上来想象,应该是横轴的梯度比较平滑开口很大,纵轴的梯度比较陡峭开口很小。那么dw2比较大,dw1会比较小。所以在梯度更新的时候纵轴方向梯度更新会很大,横轴方向梯度变化会比较小,这样很可能w2因为步子大跳到了另一个方向,而w1因为步子小而正常的向前迈进了一小步。所以就会形成上图中的折线。
SGD+Momentum
Momentum是动量,通过指数加权平均来累积之前的动量,从而给下降的过程来带一点冲力。
公式表达