调整学习率
探索学习率如何影响结果的准确性。
调整学习率
使用简单的思路和基础的 Python 实现的第一个神经网络,在 MNIST 数据集上取得了 95% 的性能得分,表现已经相当不错了。如果就此止步,也是完全合理的。
但让我们看看是否还能做一些简单的改进。
第一个可以尝试的改进是调整学习率。之前我们将学习率设为 ,并没有真正尝试过其他取值。
现在我们将其翻倍至 ,看看更大的学习率是否有助于提升网络的整体学习效果,还是反而有害。运行代码后,得到的性能得分为 ,比之前更差。这说明较大的学习率可能导致梯度下降过程中出现震荡和过度调整。
接下来我们尝试将学习率设为 。这一次性能有所提升,达到 ,与某个网站上列出的结果相近——那个结果使用了 1000 个隐藏层节点。而我们的网络结构更小,却取得了相当甚至更好的表现!
如果我们继续降低学习率,将其设为更小的 会怎样?此时性能下降到了 ,表现并不理想。由此可见,学习率过小也会带来负面影响。这是合理的,因为这会限制梯度下降的速度,使每一步调整过于微弱,难以有效收敛。
性能随学习率变化的趋势图
下图展示了上述实验结果的变化趋势。虽然这种方法并不十分严谨(理想情况下应多次重复实验,以减少随机性和不良梯度下降路径的影响),但它仍有助于我们直观理解:学习率存在一个最佳范围。
从图中可以看出,在学习率介于 到 之间时,模型性能可能还有提升空间。因此我们尝试设置学习率为 ,得到的性能为 ,确实略优于 和 的结果。这种通过绘图来更好地理解模型行为的方法,在其他场景中也值得借鉴——图像往往比一串数字更容易理解。
综上所述,我们决定采用 作为学习率,它似乎是当前神经网络在 MNIST 数据集上的一个较优选择。
顺便提一下,由于整个训练过程包含一定的随机性,每次重新运行代码时得到的分数会略有不同。例如,初始权重是随机生成的,不同人的初始权重不同,因此各自的梯度下降路径也会有所差异。