Skip to content

梯度与学习率:讲解逐字稿 ​

预测错了以后,程序怎样知道该改哪个数,又该改多少?这是 07. 梯度与学习率 配套视频的旁白全文。从一次乘法开始,先理解怎样给预测评分,再看梯度和学习率如何影响更新。平方和 0.5 的更多数值对照见怎样衡量预测好坏。

00:00 预测错了,该拧哪个旋钮? ​

模型预测错了,程序究竟改了什么?这一集从一个乘法开始,走到可以自己运行的训练循环。

先看一条便于手算的样本。输入是二,正确答案是四。我们用输入乘一个可调整的数,得到预测。

这个可调整的数叫参数,用字母 w 表示,像一个旋钮。现在它等于一,所以预测是二,比答案少了二。

训练时,输入和答案先保持不变。程序要找的是更合适的参数,而不是把正确答案改成自己的预测。

00:37 先量偏差,再给预测评分 ​

用预测减正确答案,二减四等于负二。这个带正负号的差叫残差,负数表示预测偏低。

为什么不直接把残差加起来?假如两条预测分别少二和多二,相加得到零,两次错误却都还在。

一种做法是先平方。负二的平方和正二的平方都是四,错误就不会靠正负抵消。偏差翻倍,平方会变成四倍。

01:10 平方前的 0.5 从哪里来? ​

把残差平方,就得到一种衡量错误的分数,叫损失。这里再乘零点五,负二的平方取一半,损失就是二。

为什么取一半?像把所有人的分数都减半,名次不会变。哪个参数损失最低,也不会因此改变。

这样选择,是因为后面计算平方的变化率会出现一个二,乘零点五正好约掉它,公式更简洁。

这个零点五不是自然定律。去掉它,损失和梯度都会加倍;想保持同样的更新幅度,就把学习率减半。

01:49 每个参数,都对应一个损失 ​

现在把这个评分规则画出来。横轴是参数 w,纵轴是损失,字母 L 只是损失的简写。

参数等于一时,预测是二,损失是二。参数等于二时,预测是四,损失是零,落在这个碗的最低处。

我们能从图上看到最低处,程序却需要一种通用的计算办法,判断当前位置该往哪边调。

02:18 轻轻试转,发现下降方向 ​

先不求导,直接试。把参数从一调到零点九九,损失变成二点零四零二,错误更多了。

再从一调到一点零一,损失变成一点九六零二,错误更少了。看来在这里,向右一点会下坡。

损失减少零点零三九八,参数增加零点零一。变化量相除得到负三点九八,表示这小段路的平均坡度。

把试探幅度越缩越小,这个比值会越来越接近负四。当前位置的这种变化率,就叫导数。

03:00 梯度是坡度,不是新参数 ​

只有一个参数时,梯度就是刚才的导数。负四表示向右稍走一点,损失会下降;它没有说新参数应该等于负四。

这个例子的梯度可以用残差乘输入算出。负二乘二,等于负四,和刚才试探出来的结果一致。

为什么还要乘输入?参数增加一点,预测会增加这点变化的两倍,因为输入是二。参数影响预测,预测再影响损失。

把这两段影响接起来求变化率,叫链式法则。后面的多层网络也会用到它,现在先记住这个具体的乘法。

03:42 方向有了,接下来决定步长 ​

更新规则是,原参数减去学习率乘当前梯度。学习率是提前选定的正数,控制一次调整的幅度。

这里取零点一。一减去零点一乘负四,等于一点四。减去负数,就是把参数往右增加零点四。

用新参数重新预测,得到二点八。再减目标四,平方取一半,损失是零点七二,确实比原来的二低。

04:15 方向正确,也可能一步走过头 ​

如果回到同一个起点,只把学习率改成一,新的参数就变成五,一步跨过了最低处。

这时预测是十,比目标四多了六,损失是十八。虽然出发时朝着下坡方向,落点却比起点更高。

所以梯度只描述脚边的坡,学习率决定走多远。每次更新后都要重新评分,下一步也要重新计算梯度。

04:47 多条记录,怎样合成一个分数? ​

一个旋钮的例子算清了。现在回到运费模型:预测运费等于参数 w 乘重量,再加起步项 b。两个参数都要调整。

用三条教学记录,重量是一、二、三千克,对应运费是三、五、七元。它们是构造的数据,不是真实报价。

从两个参数都为零开始,预测全是零。三条残差是负三、负五、负七,各自平方取一半,得到四点五、十二点五、二十四点五。

相加再除以三,平均损失约为十三点八三。取平均,是让分数按每条记录来算,复制同一批数据也不会让它平白翻倍。

05:35 两个旋钮,展开一张损失地形 ​

每选一组参数,就能算出一个平均损失。把参数放在两个水平方向,把损失画成高度,就得到损失曲面。

这里的两个横轴是参数,不是重量和运费。沿一个参数方向测坡度时,先固定另一个,这种变化率叫偏导数。

两个方向的坡度放在一起,就是两个参数的梯度。先用同一组旧参数算完,再一起更新,红点就会移动到新位置。

学习率取零点一,蓝线连接四十次实际更新,损失从十三点八三下降到约零点零零零二八。最低处附近,预测线贴近三条记录。

06:27 把重复计算交给训练循环 ​

现在可以把训练写成循环:先预测,再评分,计算梯度,最后更新参数。梯度下降,就是反复沿负梯度方向做这件事。

负责执行更新规则的算法叫优化器。这个例子用最基本的规则,后面再看更复杂的优化器怎样利用过去的信息。

把参数保存,再让另一个进程加载。输入二点五千克,得到约六点零零六二元,说明训练结果确实能重新使用。

07:03 会下降之后,再问能不能用于新数据 ​

能把这三条教学记录拟合好,说明计算跑通了。要判断真实效果,还得用没有参与调参的数据,检查新样本上的错误。

你现在可以解释损失为什么这样算,判断梯度的方向,并检查学习率是否让更新走过头。

配套文章可以单步调参数、查看三维曲面。下一篇再运行完整代码,把训练、保存和重新预测都做一遍。

继续实验 ​

交互曲面与一步更新 · 训练、保存与独立重载

别急,先让缓存热一下。