
从零手算反向传播2-1-1网络里每个权重梯度怎么来【免费下载链接】nndl邱锡鹏《神经网络与深度学习》第二版与通识版电子书、章节目录、学习资源与勘误。项目地址: https://gitcode.com/GitHub_Trending/nn/nndl给前馈神经网络做第一次调参前邱锡鹏《神经网络与深度学习》开源仓库 nndl会抛出一个很小但很尖锐的问题损失是 0.08到底该怪哪个权重答案就是反向传播Backpropagation——把责任从损失一路倒查回每个权重的算法。0.08的损失该怪谁先想一遍责任分摊基金月末亏了一百万要向三位交易员结算。没人会平分这笔损失最后拍板的人担大头中间的人按他的观点被最终决策采纳了多少分摊前置的人按他的信息影响了中间多少再摊。结果先担责再沿着你对下游影响有多大的顺序往下摊。反向传播就是这套责任分摊。损失先在输出层领责任回传到上一层时乘上该层的权重和激活函数导数——也就是它在本地的贡献比例。数学上这对应链式法则若 L 依赖 z2z2 依赖 z1z1 依赖 w1则 ∂L/∂w1 ∂L/∂z2·∂z2/∂z1·∂z1/∂w1即各段局部导数的乘积。手算前向2-1-1网络每一步数字可验证用 2-1-1 网络做一遍输入 2 维 (1, 0.5)隐藏层 1 个神经元ReLU输出 1 维恒等激活做回归。参数取 w10.5w2−0.5b10.2w32.0b20.1。只需认识一个符号z 是激活前输入a 是激活后输出。① z1 0.5×1 (−0.5)×0.5 0.2 0.45。这是一次乘加每个权重负责搬运一路输入偏置是个人底分。② a1 ReLU(0.45) 0.45。ReLU 对负数归零、对正数原样放行所以直接通过。③ z2 2.0×0.45 0.1 1.0。输出层仍是乘加信号从输入经一层权重走完了全程。④ L ½×(1.4 − 1.0)² 0.08。目标 1.4、预测 1.0平方损失先给输出判了一个罚分。前向走完 现在倒过来算账。前馈网络的梯度倒推路径每个权重的梯度怎么算出来记 δ 为这一层 z 领到的责任即 δ ∂L/∂z。从输出层开始倒推。第 1 步输出层领责δ2 1.0 − 1.4 −0.4。恒等激活导数为 1预测偏离目标多少责任就是多少。第 2 步w3 的分∂L/∂w3 δ2×a1 −0.4×0.45 −0.18。它连着 a1 和输出责任 输出层责任 × 它搬运的信号量。第 3 步b2 的分∂L/∂b2 δ2 −0.4。偏置不携带输入信号直接领输出层的责任。第 4 步回传δ1 w3×δ2×ReLU′(z1) 2×(−0.4)×1 −0.8。输出层责任乘贡献比例 w3 传回来这一层处于 ReLU 正半区ReLU′1原样通过。第 5 步隐藏层各分∂L/∂w1 δ1×x1 −0.8∂L/∂w2 δ1×x2 −0.4∂L/∂b1 δ1 −0.8。规则同前责任 本地责任 × 该权重搬运的输入。规律很稳定先算本层 δ权重梯度是 δ 乘输入回传是 δ 乘权重再乘激活函数导数。全程没有新数学只是链式法则连用两次。有了梯度更新只有一行参数 ← 参数 − 学习率×梯度。学习率取 0.1 时w3 变为 2.018重算损失约 0.077一步下降。几何上每次更新都是沿损失面的最陡下坡方向走一步。反向传播写进代码最易翻车的两段逻辑先写激活函数导数。坑点导数要用前向时存下的 z来算而不是从输出反推。ReLU 最短def relu_backward(z): # z前向时存下的激活前输入 return (z 0).astype(float)Sigmoid 同理σ′(z) σ(z)(1−σ(z))用存下的 z 计算别把指数算两遍。第二件是梯度检验对每个参数加微小扰动做数值近似和你手算的解析梯度互相对账。def num_grad(f, x, eps1e-5): g np.zeros_like(x) for i in range(x.size): xp, xm x.copy(), x.copy() xp[i] eps xm[i] - eps g[i] (f(xp) - f(xm)) / (2 * eps) return g两者相对误差在 1e-6 量级以内 说明实现正确差好几个数量级多半是反向时误用了更新后的参数。新手最常踩的三个坑损失不降、梯度为零、梯度消失损失纹丝不动。现象loss 卡住甚至变差。根因反向计算时用了更新后的新权重而反向应当使用前向那一刻的旧状态。修复先把所有梯度算完再统一更新参数。某些梯度恒为 0。现象用了 ReLU 后部分权重梯度永远不动。根因z0 时 ReLU 导数为 0这条通路被断开。修复换 He 初始化或 Leaky ReLU。越深的层梯度越小。现象深层网络前几层几乎不更新。根因每回传一次梯度都要乘上一层权重与激活函数导数两者都小于 1 时连乘指数衰减这就是梯度消失的根源。修复改用 ReLU、加归一化层、上残差连接配合合理初始化。从手算到自动微分真实项目里没人这么算自动微分引擎在前向时记下计算图反向时自动完成这套责任倒推PyTorch 的 .backward() 就是这机制的封装。但只有手算过一遍损失卡住时你才分得清问题出在数据、初始化还是实现。这套规则在卷积网络里同样成立权值共享下梯度只是沿共享通路累加。延伸阅读Rumelhart, Hinton Williams (1986)《Learning representations by back-propagating errors》反向传播的原始论文《神经网络与深度学习》第 4 章前馈神经网络优化算法对比可视化【免费下载链接】nndl邱锡鹏《神经网络与深度学习》第二版与通识版电子书、章节目录、学习资源与勘误。项目地址: https://gitcode.com/GitHub_Trending/nn/nndl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考