Logo
Section 1 / 4

调整学习率

探索学习率如何影响结果的准确性。

导入

调整学习率

探索学习率如何影响结果的准确性。

调整学习率

使用简单的思路和基础的 Python 实现的第一个神经网络,在 MNIST 数据集上取得了 95% 的性能得分,表现已经相当不错了。如果就此止步,也是完全合理的。

但让我们看看是否还能做一些简单的改进。

第一个可以尝试的改进是调整学习率。之前我们将学习率设为 0.30.3,并没有真正尝试过其他取值。

现在我们将其翻倍至 0.60.6,看看更大的学习率是否有助于提升网络的整体学习效果,还是反而有害。运行代码后,得到的性能得分为 0.90470.9047,比之前更差。这说明较大的学习率可能导致梯度下降过程中出现震荡和过度调整。

接下来我们尝试将学习率设为 0.10.1。这一次性能有所提升,达到 0.95230.9523,与某个网站上列出的结果相近——那个结果使用了 1000 个隐藏层节点。而我们的网络结构更小,却取得了相当甚至更好的表现!

如果我们继续降低学习率,将其设为更小的 0.010.01 会怎样?此时性能下降到了 0.92410.9241,表现并不理想。由此可见,学习率过小也会带来负面影响。这是合理的,因为这会限制梯度下降的速度,使每一步调整过于微弱,难以有效收敛。

性能随学习率变化的趋势图

下图展示了上述实验结果的变化趋势。虽然这种方法并不十分严谨(理想情况下应多次重复实验,以减少随机性和不良梯度下降路径的影响),但它仍有助于我们直观理解:学习率存在一个最佳范围。

...
性能 vs. 学习率

从图中可以看出,在学习率介于 0.10.1 到 0.30.3 之间时,模型性能可能还有提升空间。因此我们尝试设置学习率为 0.20.2,得到的性能为 0.95370.9537,确实略优于 0.10.1 和 0.30.3 的结果。这种通过绘图来更好地理解模型行为的方法,在其他场景中也值得借鉴——图像往往比一串数字更容易理解。

综上所述,我们决定采用 0.20.2 作为学习率,它似乎是当前神经网络在 MNIST 数据集上的一个较优选择。

顺便提一下,由于整个训练过程包含一定的随机性,每次重新运行代码时得到的分数会略有不同。例如,初始权重是随机生成的,不同人的初始权重不同,因此各自的梯度下降路径也会有所差异。

使用MNIST数据集测试神经网络

进行多次运行