关于什么是梯度下降,请看我之前发的一个博文: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) }
关于SGD迭代收敛条件的讨论:
1、是否适合用前后两次损失函数值机会无变化来判断收敛,即abs(J(k)-J(k-1))/J(k-1)<1e-5,
个人认为不适合,因为SGD的收敛曲线不是平滑下降的,可能在远未达到最优值时就满足了该条件。
2、是否可以用theta几乎无变化来判断满足收敛?
前后两次theta几乎无变化,和损失函数几乎无变化等价。
那么该如何选择达到收敛,而终止迭代呢?
这里可以用控制迭代次数来终止迭代,即控制伪代码中的m。
matlab代码:
明天附上,
原文地址:http://blog.csdn.net/u010367506/article/details/38052203