一步一步建立直观
先预测,再点“演示本步”核对右图。每一步都重设到指定情形,随后可以自由修改参数。
01把复合函数拆成可求导的环节
记 ,输出为 ,损失为 。对 求导时,依次经过 、、 三个环节。右图同时给出中间量,方便逐项核对链式法则中的每个因子,而不是只看最后一个梯度数字。每一环的输入位置都来自同一次前向计算。
02用符号解释参数应该向哪边走
在激活区域,权重梯度为 。如果输出过大且输入为正,梯度为正,梯度下降就减小这个权重;若输入为负,改变方向随之反转。这种符号推理是检查求导的有效方法。偏置对应的局部输入恒为一,所以少了输入因子。
03不可导点需要单独处理
把单元切到关闭侧,再靠近边界。严格负侧梯度为零,严格正侧使用前面的公式;边界两侧一般不一致。右图在零点明确提示折点,不给出通常导数;某些训练程序会约定传回零,但这不是证明 ReLU 在零点可导。形式化命题与手算推导的适用条件应按各自陈述逐一核对。
3.5.1 把长表达式拆成三个短问题¶
考虑 、输出 、损失 。若直接对嵌套式求导,容易漏项。先分别问:损失对输出多敏感,输出对预激活多敏感,预激活对权重多敏感?答案是 、、。
把三个响应倍率按路径相乘,就得到权重梯度。输入激活 越大,同一权重变化越能改变预激活;激活函数若进入饱和区, 很小,梯度会被削弱。公式因此也解释了训练现象,而不仅给出可执行运算。
3.5.2 先检查最简单的线性输出¶
让 为恒等函数,取 。预测为三,误差为负一,权重梯度为负四。梯度下降减去负数,使权重增加,预测向目标移动,符号与直觉一致。偏置梯度为负二,因为偏置改变一个单位只使预测改变一个单位。
对多层情形,上一层的一个单元通常影响下一层多个单元,因而误差信号需要求和;矩阵转置正好把下一层的影响汇集回上一层。权重梯度的外积则把“接收端敏感性”和“发送端激活”配成所有连接的贡献。
推导时先固定向量是行还是列,再检查每个矩阵形状。损失是否带二分之一、是否按样本平均,也会改变系数。用一个可手算的标量例子核对符号和尺度,往往比只盯着大矩阵更有效。
定义 3.5.1 单个 ReLU 单元与平方损失
记 、、。输入与目标固定时,损失是参数的复合函数。
命题 3.5.1 严格激活区域中的权重梯度
在 的邻域中,。在 的邻域中,该梯度为零。
证明 · 展开纸笔推导
当 时,ReLU 在邻域内就是恒等函数,链式法则给出 。当 时,它在邻域内恒为零,局部损失因而不随该参数变化。
结论刻意避开 。ReLU 在零处没有经典导数,复合损失是否恰好可导还要另看具体参数与目标;程序采用的反向传播约定不能替代这项数学判断。
□
数学表述 3.5.1¶
将损失拆成短小的可导计算,再用链式法则组合,避免对整个表达式盲目展开。
对 , 多层网络写作 ,权重梯度为 。
例 3.5.1 把概念用于具体计算
线性输出时取 ,预测为 ,权重导数为 ;减去负梯度使权重上升。
练习 3.5.1¶
上例偏置导数是多少?
展开解答与检查
。
Lean 对照 3.5.1 命题、证明与适用边界
完整证明线性输出的平方损失对权重的导数。非线性层及矩阵反传公式在正文推导,未由此单命题覆盖。
NeuralNetworks.squared_loss_weight_gradient
theorem squared_loss_weight_gradient (a b y w : ℝ) :
HasDerivAt (fun t : ℝ => (t*a+b-y)^2) (2*(w*a+b-y)*a) w := by
convert ((((hasDerivAt_id w).mul_const a).add_const b).sub_const y).pow 2 using 1
simp only [id_eq]
ring