C3第 5 / 6 节 · 约 45 分钟

导数、梯度与优化:模型怎样减少误差

本节目标
  • 用变化率理解导数和梯度方向
  • 手算一个参数的一步梯度下降

训练不是让模型背一段定义

体验站暂时用一个非常简单的模型,预测用时就是参数w。输入任务不同也先输出同一个数,这不是好模型,却适合看清学习步骤。已知一条模拟记录实际用时四分钟,若w为六,预测高了两分钟。可以把损失定义为预测与实际差的平方,即括号内w减四再平方。损失是用一个数衡量模型在指定数据上的错误大小,越小表示在这个标准下越接近标签。不同任务可以选择不同损失,损失的定义本身就体现我们怎样重视错误。

导数表示当前位置怎样变化

在这条平方损失曲线上,w越远离四,损失越大,最小点在四。导数是某个位置附近输入发生很小变化时,函数输出的变化率,能告诉我们向哪边移动会让损失下降。对这个例子,导数为二乘括号内w减四。w为六时导数四,表示继续增大w会使损失上升,所以应往减小方向走;w为二时导数负四,表示增大w会降低损失。这里不要求推导公式,而要求把正负号与曲线方向联系起来。

手算一次梯度下降

梯度下降的更新规则是新参数等于旧参数减学习率乘导数。学习率决定一步走多远。旧参数六、导数四,取学习率零点二五,新参数为六减一,等于五。旧损失是四,新损失是一,确实减少。再一步在五处导数为二,参数更新成四点五,损失变成零点二五。实际模型有许多参数,导数组成的向量叫梯度,更新同时调整各个方向。学习不是魔法,而是在已定义的损失与数据上反复寻找更好的参数设置。

步长太大与太小都可能有问题

若在六处取学习率一点五,新参数是六减六,等于零,损失变成十六,比原来的四更大,这说明朝正确方向也可能走过头。若学习率特别小,每次移动很少,下降会很慢。复杂模型的损失曲面可能不平整,无法保证简单更新总找到最佳结果;有些模型也不采用这种优化方法。训练时通常观察损失曲线与验证表现,而不是只凭更新次数判断完成。学习率是优化设置,不是模型事实可靠性的直接开关。

训练误差低不等于泛化好

若只有一条四分钟记录,参数变成四可以让训练损失为零,但新任务实际可能是八分钟,固定预测四仍然很差。优化只是在给定数据和目标上减少错误,不能自动获得未观察规律。增加特征、收集更有代表性数据、控制模型复杂度和独立验证,分别解决不同问题。还可以使用正则化对过大或过复杂参数增加约束,但它也不能保证正确。把导数理解成局部方向,把损失理解成所选标准,把验证理解成新数据检查,就能避免把训练过程神化。

本节要点

  • 损失定义了当前训练怎样衡量错误
  • 梯度给出局部变化方向,学习率控制步长
  • 训练损失下降必须配合独立验证解释

动手练习:手算并比较两种学习率

  1. 设实际用时四、旧参数六,损失为w减四的平方
  2. 计算旧损失及导数二乘w减四
  3. 学习率零点二五时算新参数与新损失
  4. 学习率一点五时再算一次
  5. 说明哪次更新下降,并解释为何不能由此保证新任务准确

自查清单

  • 旧损失四、导数四正确
  • 两个新参数五与零及损失一与十六正确
  • 解释大步长越界与泛化边界
先自己做,再查看参考答案

旧参数为六时,误差为二,平方损失四,导数为四。学习率零点二五的更新是六减零点二五乘四,得到五,新误差一,损失一,低于原来四。学习率一点五的更新得到零,新误差负四,损失十六,说明步长过大而越过了较好的区域。更新朝导数相反方向不代表任何步长都合适。这里仅有一条四分钟样例,降低它的损失只能证明对这条记录更接近,不能保证遇到八分钟新任务也准确;还要使用符合目标情境的验证数据检查泛化。

本节自测

学完了吗?

标记后会记录在本机浏览器,课程首页显示你的进度。