如果你选择适当的学习率,你的学习算法将运行得更好,如果太小,它会跑得很慢,如果太大,它甚至可能不会收敛,那么如何为模型选择一个好的学习率呢?
如果绘制多次迭代的成本,注意到成本有时会上升,有时它会下降,你应该把这看作梯度下降工作不正常的明显迹象,这可能意味着代码中有bug,或者有时这可能意味着你的学习率太大了,所以这里有一个例子来说明这里可能发生的事情。垂直轴是成本函数,横轴表示一个参数,比如:W1,如果学习率太大,如果你从标红的地方开始,你的更新步骤可能会超过最小值,并且在与它齐平的地方停止,在下一个更新步骤中,你又超调了,所以你最终会停在上方等等,这就是为什么成本有时会上升而不是减少来解决这个问题。你可以使用较小的学习速率,所以你的更新可能从这里开始,向下一点,向下一点,并有望持续减少,直到达到全球最小值,有时你可能会看到,在每次迭代之后,成本一直在增加,像下图第2个曲线一样,这也可能是由于学习率太大,他可以通过选择较小的学习速率来解决,但是像这样的学习速率也可能是代码中可能存在bug的迹象,例如,如果我写了我的代码,以便W1=W1+alpha*d1这个导数项,这可能导致每次迭代的成本持续增加,这是因为添加导数项将成本j从全局最小值移的更远,而不是靠得更近,所以如果用减号,代码应该被更新为W1=W1-alpha*d1。
一个正确实现梯度下降的调试技巧,以足够小的学习速度,成本函数应该在每一次迭代中降低,所以如果梯度下降不起作用,那么就把alpha设为一个非常非常小的数,看看这是否会导致每次迭代的成本降低,如果将alpha设置为一个非常小的数字,J不会在每次迭代中减少,但有时反而会增加,那通常意味着有窃听器,在代码的某个地方注意,将alpha设置为非常非常小,这里是指调试步骤和一个非常非常小的alpha值,并不是训练你的学习算法的最有效的选择。一个重要的权衡是,如果你的学习速度太小,那么梯度下降可能需要大量迭代才能收敛。
所以当我运行梯度下降时,我通常会尝试学习速率alpha的一系列值,可能会从0.001的学习速率开始,也尝试十倍的学习率,比如0.01和0.1等等,每选一个alpha,你可能只在几个迭代中运行梯度下降,并将成本函数j绘制为迭代次数的函数,在尝试了几个不同的值之后,你可能会选择似乎会迅速降低学习速度的alpha值,但也始终如一,事实上,做的是尝试一系列像这样的值,在尝试了0.001之后,将把学习速度提高三倍到0.003,在那之后,我将尝试0.01,差不多是0.03的3倍,所以这些大致是在尝试梯度下降,每一个alpha值大约是前一个值得三倍,所以我要做的是尝试一系列的值,直到我发现一个太小的值,然后确保我找到了一个太大的值,我会慢慢尝试选择最大可能的学习率,或者只是比我发现的最大合理价值稍微小一点的东西。当我这么做的时候,它通常给我的模型一个很好的学习率,所以我希望这个技巧对你也有用。在即将到来的可选实验室中为梯度下降的实现选择一个好的学习率。
alpha选择学习速率是训练许多学习算法的重要组成部分。