![PyTorch计算机视觉实战:目标检测、图像处理与深度学习](https://wfqqreader-1252317822.image.myqcloud.com/cover/947/50417947/b_50417947.jpg)
1.6 理解学习率的影响
为了理解学习率如何影响模型的训练,考虑一个非常简单的情况,这里我们试图拟合以下等式(注意,以下等式与迄今为止一直在研究的小数据集不同):
y=3×x
注意,y是输出,x是输入。有了一组输入和期望的输出值,我们将尝试用不同的学习率来拟合方程,以理解学习率的影响。
下列代码可以从本书GitHub存储库(https://tinyurl.com/mcvp-packt)Chapter01文件夹中的Learning_rate.ipynb获得。
1.给定如下输入和输出数据集:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/40_02.jpg?sign=1739314950-wGAQkQvAThYZvYtHSsWFqCUvQp2OQqeZ-0-35c59e7e61485dcfd2330d9c944e7707)
2.定义feed_forward函数。本例将对网络进行进一步修改,使其没有隐藏层,其架构如下:
y=w×x+b
注意,对于上述函数,我们需要估算参数w和b:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/40_03.jpg?sign=1739314950-OoVwaFpqgZSIcp2OPP5ylEZlt7jJTWgP-0-b982224ac3a5eb16b96d6dd334107019)
3.定义update_weights函数,就像在1.4.1节中定义的一样:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/40_04.jpg?sign=1739314950-mzJVx16lK5vGbIEFgnow0HGyGY8DcQ23-0-5d9d8058eccfe42dac1e8065efe5ecf8)
4.初始化权重和偏置项为随机值:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/40_05.jpg?sign=1739314950-RoJgei600DM1JIGR4EphWA2ghConqlau-0-042d8f22b874d0e77dda33a506553678)
注意,权重和偏置项被随机初始化为0。此外,输入权重值的形状是1×1,因为输入中每个数据点的形状是1×1,偏置项的形状是1×1(由于输出中只有一个节点并且每个输出都只有一个值)。
5.以0.01的学习率利用update_weights函数,循环遍历1000次,并检查权重值(W)如何随着轮数的增加而变化:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/41_01.jpg?sign=1739314950-ebKcjeGsr6yP0ycVRUINSGB0Y3CFdoyn-0-e9aeb709ed41b9d41dae76f5ee980732)
注意,在上述代码中,使用0.01的学习率并重复update_weights函数来获取每轮结束时修改的权重。此外,在每轮中,将最近的更新权重作为输入,以在下一轮中获取对权重的更新。
6.绘制每轮结束时权重参数的值:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/41_02.jpg?sign=1739314950-Xufto8zbpBJXqO2m5rD7GHT5ZeAValxm-0-8a9d2508b4dc7b9e27d0b55cd7fb2280)
上述代码导致权重值随轮数的增加而变化,如图1-17所示。
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/41_03.jpg?sign=1739314950-TkSjRIymTkzDCHTEvD0PRJSDPdGdXt2r-0-aa20dc3deebec09f1390ea7581a21a1e)
图1-17
需要注意的是,在上述输出中,权重值向右逐渐增加,然后饱和到最优值,约为3。
为了了解学习率的值对获得最优权重值的影响,考察当学习率为0.1和1时,权重值如何随时间的增加而变化。
可以通过在步骤5和步骤6中修改相应的学习率值获得图1-18所示的图表(生成该图表的代码与我们之前的代码相同,只是学习率值发生了变化,可以在GitHub的相关notebook中找到)。
请注意,当学习率非常小(0.01)时,权重值向最优值的移动比较缓慢(超过较大的轮数)。然而,当学习率稍大(0.1)时,权重值先是振荡,然后(以较少的轮数)快速饱和到最优值。最后,当学习率很大(1)时,权重值达到一个非常大的值,无法达到最优值。
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/42_01.jpg?sign=1739314950-BzuBB6c69pD7xkulcd9VTIFYczsYrCRB-0-5cc8f023ff1d6ad5c9b82c140bde9146)
图1-18
使用大量小学习率不会导致权重值大幅变化的原因是我们限制了权重更新的数值等于梯度×学习率,小的学习率本质上导致了权重的少量更新。然而,当学习率较大时,权重值的更新量也较大,之后损失的变化(权重值更新量较小时)非常小,使得权重值无法达到最优值。
为了更加深入地理解梯度值、学习率和权重值之间的相互作用,只运行10轮的update_weights函数。此外,将输出以下值,以了解它们如何随着轮数的增加而变化:
❍ 每轮起始时的权重值;
❍ 权重更新之前的损失;
❍ 权重少量更新时的损失;
❍ 梯度值。
修改update_weights函数来输出上面的值,如下所示:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/42_02.jpg?sign=1739314950-BYJc7swfiyrSJ5du18ya5mmbL3QdAOgj-0-d5ad3ac321dc30f7693bdccd2712e79f)
上述代码中以加粗字体突出显示的代码行修改了上一节的update_weights函数,首先,通过检查(i% 2 = = 0)是否作为其他参数对应的偏置项,考察当前是否正在处理权重参数,然后输出原始的权重值(original_weights[i][index])、损失(org_loss)、更新的损失值(_loss_plus)、梯度(grad)和最终更新的权重值(updated_weights)。
现在讨论在三种不同的学习率中,上述值如何随着轮数的增加而变化:
❍ 0.01的学习率。使用以下代码来检查值:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/43_01.jpg?sign=1739314950-hgBcLiDOloAYnaDp65M9ats2fAwnOj4b-0-bf1e211d554b0d115366ee0527d3d5d2)
上述代码的运行结果如图1-19所示。
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/43_02.jpg?sign=1739314950-KuLqPC8xTE8sXGuqbOsyc3tNxvODPjgR-0-6da82e5b34084fe5ca93241efdeaa053)
图1-19
需要注意的是,当学习率为0.01时,损失值下降缓慢,权重值也缓慢向最优值更新。现在考察当学习率为0.1时,上述值是如何变化的。
❍ 0.1的学习率。代码与学习率为0.01的场景中相同,但是,在这个场景中学习率参数将为0.1。运行修改学习率参数值后的代码,得到如图1-20所示的输出。
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/44_01.jpg?sign=1739314950-MPgBEwi3di0e1d4zm7eYCuF91ppI2rxe-0-72f4c21c56a6f0839c8e84f9465d7b36)
图1-20
对比0.01和0.1的学习率情形,两者之间的主要区别如下:
当学习率为0.01时,与学习率为0.1相比,权重值的更新速度要慢得多(当学习率为0.01时,在第一轮中从0到0.45,当学习率为0.1时,在第一轮中从0到4.5)。更新速度较慢的原因是学习率较小,因为权重是通过梯度乘以学习率的方式更新的。
除了权重更新的幅度外,还应该注意权重更新的方向:
当权重值小于最优值时,梯度为负;当权重值大于最优值时,梯度为正。这种现象有助于在正确的方向更新权重值。
最后,将上述内容与学习率为1时进行对比。
❍ 1的学习率。代码与学习率为0.01的场景中相同,但是,在这个场景中学习率参数为1。修改学习率参数后,运行相同的代码得到如图1-21所示的输出。
从图1-21可以看到,权重已经偏离到了一个非常大的值(在第一轮的末尾,权重值是45,在以后的轮中,权重值进一步偏离到了一个非常大的值)。除此之外,权重值移动到一个非常大的量,所以权重值的一个小变化几乎不会导致梯度的变化,因此权重值就卡在那个大的值。
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/45_01.jpg?sign=1739314950-O9PsQB2YmwE4eOeepzvZSWHx3mcYZD0N-0-566cd83065a2a5c6cf51b30bfd0b3890)
图1-21
一般来说,学习率越小越好。这样,模型可以慢慢地学习,但会将权重调整到最优值。典型的学习率参数值范围是0.0001到0.01。
现在已经学习了神经网络的构建模块——前向传播、反向传播和学习率,在下一节中,我们将概述如何将这三个构建模块组合在一起来训练神经网络。