关于什么是梯度下降,请看我之前发的一个博文: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代码:
明天附上,
时间: 2024-11-13 10:57:59