)
手算一遍反向传播4个公式加一个2-2-1最小实例源自《神经网络与深度学习》第4章【免费下载链接】nndl邱锡鹏《神经网络与深度学习》第二版与通识版电子书、章节目录、学习资源与勘误。项目地址: https://gitcode.com/GitHub_Trending/nn/nndl跑一遍前馈网络几千个参数一步全更新幕后干活的全是反向传播。本文以《神经网络与深度学习》第4章为底手算它一遍先直觉、再公式、再最小例子最后讲工程细节。 直觉先行误差像接力一样被问回输入层先说结论误差能从输出层一路传回输入层是因为每一层的责任只需两条信息就能算清——它对下一层误差的贡献、它自己的局部敏感度——完全不必盯着整个网络。把网络想象成一支接力队。比赛结束总教练损失函数只知道总成绩差了多少不知道是谁的锅。于是算账沿着比赛的反方向进行输出层看得见目标当场就能算出自己要担多少隐藏层看不见目标但它能问后一层——你的误差里有多大一块是因为我传给它的信号再乘上我这一段的局部导数就是我的份额。责任就这样一层层被问了回去。关键在于每问一步每个人只算自己那一小段乘法。计算量随层数线性增长而不是随路径数量爆炸。这正是链式法则的意义——把全局导数拆成本地导数的连乘并且中间结果每一层的 z 和 a在前向传播时存下来反向时直接复用。一条线推导从输出层误差到参数梯度先说结论反向传播全程只算一种量——每层的误差项 δ。δ 拿到手所有参数的梯度都是顺手的事。下面四步是一条完整主线每步先给公式再给一句大白话。符号约定与损失函数设网络共 L 层第 1 到 L−1 层为隐藏层第 L 层为输出层。第 l 层的预激活输入为 z⁽ˡ⁾ W⁽ˡ⁾a⁽ˡ⁻¹⁾ b⁽ˡ⁾激活输出为 a⁽ˡ⁾ σ(z⁽ˡ⁾)输入向量记作 a⁽⁰⁾ x。损失取均方误差 L ½‖y − a⁽ᴸ⁾‖²。输出层误差怎么算δ⁽ᴸ⁾ (a⁽ᴸ⁾ − y) ⊙ σ′(z⁽ᴸ⁾)大白话输出层直接看得见真值 y它的责任就是预测偏差再乘上本地导数。⊙ 是逐元素相乘σ′ 是激活函数在 z⁽ᴸ⁾ 处的导数。隐藏层误差怎么传对 l L−1 到 2δ⁽ˡ⁾ (W⁽ˡ⁺¹⁾)ᵀδ⁽ˡ⁺¹⁾ ⊙ σ′(z⁽ˡ⁾)大白话(W⁽ˡ⁺¹⁾)ᵀδ⁽ˡ⁺¹⁾ 是把下一层的误差按连接强度摊回本层每个输出再乘 σ′(z⁽ˡ⁾) 就是本层自己的份额。注意到这里为止只用到了下一层的 δ、本层权重和本层 z全是局部信息——这就是传的全部秘密。参数梯度怎么读出来∂L/∂W⁽ˡ⁾ δ⁽ˡ⁾(a⁽ˡ⁻¹⁾)ᵀ ∂L/∂b⁽ˡ⁾ δ⁽ˡ⁾大白话梯度等于责任 × 它收到的输入。权重把激活输入传给了下游出了错就按输入的比例分摊偏置没有输入直接领下整个 δ。到这里反向传播就结束了算法的全部就是三句话——算输出层 δ、逐层传回隐藏层 δ、读梯度。 手算一遍2-2-1 网络的前向与反向结论用最小可用的 2-2-1 网络输入 2 维、隐藏 2 神经元、输出 1 维把公式逐位验一遍。以下数值均保留 4 位小数可按顺序复算。设定x [1, 2]y 1W⁽¹⁾ [[0.5, 0.25], [0.5, 0.5]]b⁽¹⁾ [0, 0.5]W⁽²⁾ [0.4, −0.5]b⁽²⁾ 0.1两层都用 Sigmoid导数 σ′(z) a(1−a)。前向传播z⁽¹⁾ [0.5×1 0.25×2, 0.5×1 0.5×2] [0, 0.5] [1.0, 2.0]a⁽¹⁾ σ(z⁽¹⁾) [0.7311, 0.8808]z⁽²⁾ 0.4×0.7311 − 0.5×0.8808 0.1 0.2924 − 0.4404 0.1 −0.0480a⁽²⁾ σ(−0.048) ≈ 0.4880L ½(1 − 0.488)² ≈ 0.1311反向传播与梯度输出层σ′(z⁽²⁾) 0.488×0.512 0.2499δ⁽²⁾ (0.488 − 1)×0.2499 ≈ −0.1279隐藏层(W⁽²⁾)ᵀδ⁽²⁾ [0.4×(−0.1279), −0.5×(−0.1279)] [−0.0512, 0.0640]σ′(z⁽¹⁾) [0.7311×0.2689, 0.8808×0.1192] [0.1966, 0.1050]δ⁽¹⁾ [−0.0512×0.1966, 0.0640×0.1050] ≈ [−0.0101, 0.0067]梯度∂L/∂W⁽²⁾ [−0.1279×0.7311, −0.1279×0.8808] ≈ [−0.0935, −0.1127]∂L/∂b⁽²⁾ −0.1279∂L/∂W⁽¹⁾ [[−0.0101, −0.0202], [0.0067, 0.0134]]∂L/∂b⁽¹⁾ [−0.0101, 0.0067]顺手验一下符号真值 y 1输出才 0.488应该把输出调大。∂L/∂W⁽²⁾[0] −0.0935 0说明增大 W⁽²⁾[0] 会减小损失方向对得上。从纸面到工程向量化、数值梯度检验、梯度消失与爆炸工程化最容易踩三处坑拿循环跑样本、写完反向传播不验证、忽视梯度幅度。向量化矩阵乘法替代样本循环把 m 个样本写成矩阵 A⁽⁰⁾n×m。前向时 Z⁽ˡ⁾ W⁽ˡ⁾A⁽ˡ⁻¹⁾ b⁽ˡ⁾偏置 b⁽ˡ⁾ 沿列自动广播一次矩阵乘法算完整个批次反向时 δ⁽ˡ⁾ 同样是矩阵∂L/∂W⁽ˡ⁾ δ⁽ˡ⁾A⁽ˡ⁻¹⁾ᵀ。一套运算顶 m 次前反向这正是 GPU 上提速的来源。数值梯度检验你写的反向传播对不对手写反向传播后用中心差分核对一遍最放心def numeric_grad(loss_fn, theta, eps1e-5): g np.zeros_like(theta) for i in range(theta.size): t theta.copy(); t[i] eps lp loss_fn(t) t theta.copy(); t[i] - eps lm loss_fn(t) g[i] (lp - lm) / (2 * eps) return g让数值梯度 g_num 与你反向传播算出的 g_bp 逐元素对比相对误差在 1e-6 量级说明实现可信差出几个数量级十有八九是矩阵转置放错位置或符号写反。梯度消失与爆炸成因和对策现象成因对策梯度消失Sigmoid 导数 ≤0.25、tanh ≤1逐层连乘按指数衰减ReLU 系激活、Xavier/He 初始化、残差连接梯度爆炸权重尺度偏大连乘按指数放大梯度裁剪、调小学习率、BN 归一化神经元死亡ReLU 在 z≤0 区间导数恒为 0梯度归零He 初始化、合适学习率各激活函数的导数δ 公式里的本地因子也有现成形态写实现时直接套激活 σ导数 σ′(z)记 a σ(z)Sigmoida(1−a)tanh1−a²ReLUz0 时为 1否则 0Softmax 配交叉熵a−y两项合并后的干净形式反向传播算出梯度之后参数怎么落地更新不同优化器在三维损失面上的轨迹对比如下作者原创动画来自本书可视化资源收尾反向传播就是链式法则加上中间结果复用前向存 z 和 a反向逐层传 δ梯度按责任×输入读出。吃透这 4 个公式和一遍手算后面所有网络结构的梯度都是它的变体。下一个自然主题权值共享——卷积层里同一个核扫过整张输入时梯度公式要改成什么样。《神经网络与深度学习》第二版目录与章节入口含第 4 章·前馈神经网络全书在线阅读页作者制作的动图与交互演示优化器轨迹等可视化资源进阶资料Rumelhart 等 1986 年《Learning representations by back-propagating errors》反向传播原始论文Glorot Bengio 2010 年《Understanding the difficulty of training deep feedforward neural networks》Xavier 初始化与深层训练难度分析。【免费下载链接】nndl邱锡鹏《神经网络与深度学习》第二版与通识版电子书、章节目录、学习资源与勘误。项目地址: https://gitcode.com/GitHub_Trending/nn/nndl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考