确保算法能收敛以及选择合适的学习速率α。
对于随机梯度下降算法,为了检查算法是否收敛,沿用之前定义的cost函数。在算法扫描到样本(x(i),y(i)) 但在更新参数θ之前,使用这个样本算出这个样本对应的cost函数。例如:每1000次迭代运算中,我们对最后1000个样本的cost值求平均然后画出来,通过观察这些画出来的图,我们就能检查出随机梯度下降是否在收敛。
图1:看起来是有噪声的,代价值在下降,后面开始变得平缓。这样的大致走向基本说明你的学习算法已经收敛了。如果你使用了更小的学习速率,那么很有可能使得算法的学习变得更慢了,代价函数的下降也变慢了。但由于你使用了更小的学习速率,你很有可能会让算法收敛到一个好一点的解。(红色的曲线代表随机梯度下降使用一个更小的学习速率)。随机梯度下降不是直接收敛到全局最小值,而是在局部最小附近反复振荡,所以使用一个更小的学习速率,最终的振荡就会更小,有时候这一点小的区别可以忽略,但有时候一点小的区别就会得到更好一点的参数。
图2:看起来已经收敛了。如果你把这个数 1000 提高到5000组样本,那么可能你会得到一条更平滑的曲线。这是增大平均的训练样本数的情形。当然增大样本数的缺点就是现在每5000个样本才能得到一个数据点,因此你所得到的关于学习算法表现的反馈就显得有一些“延迟”,因为每5000个样本才能得到图上的一个数据点而不是每1000个样本就能得到。
图3:运行梯度下降代价函数就没有在减小,算法没有很好地学习,需要更大量的样本进行平均,你很可能会观察到红线所示的情况。使用一个较大的样本数量,还是可能会发现这条学习曲线比较平坦,那可能就更肯定地说明不知道出于什么原因算法确实没怎么学习好,那么你就需要调整学习速率或者改变特征变量或者改变其他的什么
图4:曲线实际上是在上升,这是一个很明显的信号表示算法正在发散。那么你要做的事就是用一个更小一点的学习速率α。
线看起来噪声较大或者老是上下振动,那就试试增大你要平均的样本数量,这样应该就能得到比较好的变化趋势。如果你发现代价值在上升,那么就换一个小一点的α值。
运行随机梯度下降时,算法会从某个点开始然后曲折地逼近最小值,但它不会真的收敛,而是一直在最小值附近徘徊,因此你最终得到的参数实际上只是接近全局最小值,而不是真正的全局最小值。如果你想让随机梯度下降确实收敛到全局最小值,你可以随时间的变化减小学习速率α的值。一种典型的方法来设置α的值是让α等于某个常数1 除以 迭代次数加某个常数2。 该α的设置存在的问题是把时间花在确定常数1和常数2上,这让算法显得更繁琐。但是减小了学习速率,振荡也会越来越小直到落到几乎靠近全局最小的地方。这个公式起作用的原因是随着算法的运行,迭代次数会越来越大,因此学习速率α会慢慢变小,因此你的每一步就会越来越小,直到最终收敛到全局最小值。