随机梯度下降(SGD)

关于什么是梯度下降,请看我之前发的一个博文:http://blog.csdn.net/lilyth_lilyth/article/details/8973972

梯度下降能帮助我们找到局部最优值,取得很小的损失,但是在数据量达到数十万时,迭代次数高,运算速度慢,十分不适合。这时候可以考虑使用随机梯度下降算法。

所谓随机梯度下降是   每次用 每个样本的损失函数(即样本数为1时的损失函数)对theta求得的偏导,来跟新theta值。

对梯度下降中的例子我们采取随机梯度下降来解:

第i个样本数据为Xi,对应单个损失函数对theta的偏导数为:


算法伪代码:

for i=1 to m{
   theta_j=theta_j-gamma*grad_i;(for every j)
}


随机梯度下降是通过每个样本来迭代更新一次,如果样本量很大的情况(例如几十万),那么可能只用其中几万条或者几千条的样本,就已经将theta迭代到最优解了,对比之前梯度下降,迭代一次需要用到十几万训练样本,一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次。但是,SGD伴随的一个问题是噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。最终结果会在最优值附近回绕。

关于SGD迭代收敛条件的讨论:

1、是否适合用前后两次损失函数值机会无变化来判断收敛,即abs(J(k)-J(k-1))/J(k-1)<1e-5,

个人认为不适合,因为SGD的收敛曲线不是平滑下降的,可能在远未达到最优值时就满足了该条件。

2、是否可以用theta几乎无变化来判断满足收敛?

前后两次theta几乎无变化,和损失函数几乎无变化等价。

那么该如何选择达到收敛,而终止迭代呢?

这里可以用控制迭代次数来终止迭代,即控制伪代码中的m。


matlab代码:

明天附上,


你可能感兴趣的:(随机梯度下降,SGD)