十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

反向传播算法:手算一遍2-2-1网络,把梯度流动看穿

反向传播算法:手算一遍2-2-1网络,把梯度流动看穿 反向传播算法手算一遍2-2-1网络把梯度流动看穿【免费下载链接】nndl邱锡鹏《神经网络与深度学习》第二版与通识版电子书、章节目录、学习资源与勘误。项目地址: https://gitcode.com/GitHub_Trending/nn/nndl用随机梯度下降训练一个两层网络时最常见的翻车现场是loss 卡在初始值一动不动打印梯度却全是 0。问题多半出在反向传播Backpropagation的实现里——某个导数写错、某个转置方向搞反梯度就悄悄变成 0 或 NaN。《神经网络与深度学习》邱锡鹏本仓库维护的蒲公英书第 4 章前馈神经网络系统讲了这套算法这篇教程带你手算一遍拿到一个可复核的参照系。读完你可以独立完成三件事手算一个 2-2-1 网络每个参数的梯度用数值梯度检验验证自己写的反向传播分辨梯度消失与梯度爆炸并说出对策它到底解决什么问题前向传播一次只产出一个预测值而你需要的是每个参数对损失的偏导数。参数成千上万逐个扰动参数、重新前向求导代价高到不可行。反向传播的价值在于一次前向加一次反向得到全部参数梯度。把前向计算画成流程图每个中间量是一个节点边是运算。反向传播就是逆流回溯——每个节点把自己的本地导数乘以从下游传回的损失份额再交给上游。回溯到参数所在的边梯度就汇总齐了。同一个套路也适用于卷积网络下面的动画展示前向时一个卷积核如何扫过特征图产生输出反向时梯度沿同样的连接逆向汇回每个权重。原理怎么拆成四步第 1 步定符号存中间量把第 l 层的线性组合记作 z⁽ˡ⁾过激活函数 σ 后的输出记作 a⁽ˡ⁾参数为 W⁽ˡ⁾、b⁽ˡ⁾z⁽ˡ⁾ W⁽ˡ⁾a⁽ˡ⁻¹⁾ b⁽ˡ⁾ a⁽ˡ⁾ σ(z⁽ˡ⁾) L 1/2 (a⁽ᴸ⁾ − Y)²这一步在做什么约定全文符号注意前向时必须把每层的 z 和 a 存下来反向全程要用。第 2 步输出层误差项定义误差项 δ⁽ˡ⁾ 为损失对该层线性输入 z⁽ˡ⁾ 的偏导。输出层第 L 层可直接写出δ⁽ᴸ⁾ (a⁽ᴸ⁾ − Y) ⊙ σ′(z⁽ᴸ⁾)这一步在做什么损失对输出的偏差 (a⁽ᴸ⁾ − Y) 乘上激活函数的局部斜率得到输出层每个神经元该被修正多少这是反向的起点。⊙ 表示逐元素相乘。第 3 步隐层误差反向传递对第 l 层L−1 ≥ l ≥ 1δ⁽ˡ⁾ (W⁽ˡ⁺¹⁾)ᵀ δ⁽ˡ⁺¹⁾ ⊙ σ′(z⁽ˡ⁾)这一步在做什么下游的误差先乘权重矩阵 (W⁽ˡ⁺¹⁾)ᵀ 汇回本层权重是连接误差只沿连接流动再乘本层激活函数的局部斜率。第 4 步从误差项读参数梯度有了各层 δ⁽ˡ⁾梯度直接读出∂L/∂W⁽ˡ⁾ δ⁽ˡ⁾ (a⁽ˡ⁻¹⁾)ᵀ ∂L/∂b⁽ˡ⁾ δ⁽ˡ⁾这一步在做什么权重梯度 本层误差 × 本层输入外积偏置梯度 本层误差。四步做完整个网络一次前向、一次反向即得全部参数梯度。拿一组数字完整走一遍取最小可算的样例2-2-1 网络输入 2 维隐层 2 个神经元输出 1 维激活函数为 Sigmoid σ(x)1/(1e⁻ˣ)其导数 σ′(x)σ(x)(1−σ(x))。给定输入 X [1, 0]目标 Y 1W⁽¹⁾ [[0.4, 0.5], [0.6, 0.7]]b⁽¹⁾ [0.8, 0.9]W⁽²⁾ [[0.1, 0.2]]b⁽²⁾ [0.3]前向z⁽¹⁾ W⁽¹⁾X b⁽¹⁾ [1.2, 1.5]a⁽¹⁾ σ(z⁽¹⁾) ≈ [0.7685, 0.8176]σ(1.2)≈0.7685σ(1.5)≈0.8176z⁽²⁾ 0.1×0.7685 0.2×0.8176 0.3 ≈ 0.5399a⁽²⁾ σ(0.5399) ≈ 0.6316L 1/2 (1 − 0.6316)² ≈ 0.0692反向δ⁽²⁾ (a⁽²⁾ − Y)·a⁽²⁾(1 − a⁽²⁾) (0.6316 − 1)×0.2328 ≈ −0.0864δ⁽¹⁾ W⁽²⁾ᵀδ⁽²⁾ ⊙ σ′(z⁽¹⁾)。其中 W⁽²⁾ᵀδ⁽²⁾ [−0.0086, −0.0173]σ′(z⁽¹⁾) ≈ [0.1782, 0.1487]相乘得 δ⁽¹⁾ ≈ [−0.0015, −0.0026]读出梯度∂L/∂W⁽²⁾ [−0.0864×0.7685, −0.0864×0.8176] ≈ [−0.066, −0.070] ∂L/∂b⁽²⁾ ≈ [−0.086] ∂L/∂W⁽¹⁾ δ⁽¹⁾Xᵀ [[−0.0015, 0], [−0.0026, 0]] ∂L/∂b⁽¹⁾ ≈ [−0.0015, −0.0026]每个数都可以按上面的链复算。符号也符合直觉预测 0.6316 偏小Y1损失希望 a⁽²⁾ 增大所以梯度下降方向−grad会增大 W⁽²⁾ 和 b⁽²⁾。动手时的三处易错点坑 1深层网络梯度消失现象加深网络后 loss 几乎不降底层权重梯度接近 0。成因Sigmoid 导数最大值只有 0.25误差沿 (W)ᵀσ′ 连乘逐层衰减。对策换 ReLU 类激活或用残差连接、Batch Normalization 保持梯度幅值。坑 2梯度爆炸现象loss 跳成 NaN参数几步就冲出合理范围。成因权重初始化偏大反向连乘把误差逐级放大。对策按 Glorot/Xavier 或 He 方案初始化必要时做梯度裁剪按范数截断。坑 3反向传播代码 bug 难自查现象loss 不降打印梯度却发现非零看不出哪里错。成因转置方向、Hadamard 乘积位置、激活导数公式任一写错梯度都有值但错值。对策用数值梯度检验对拍解析梯度见下文代码并逐层核对 δ 的维度。数值梯度检验只保留关键行def check_grad(f, x, eps1e-5): num np.zeros_like(x) for i in range(x.size): # 逐维扰动中心差分 xp, xm x.copy(), x.copy() xp[i], xm[i] x[i] eps, x[i] - eps num[i] (f(xp) - f(xm)) / (2 * eps) return num # 与解析梯度逐项对比比值应≈1继续往深走仓库内的相对路径资源理论正文入口含章节目录与全书 PDFnndl-v2/index.md反向传播位于第 4 章前馈神经网络案例与实践篇PyTorch 实现第 4 章含数值梯度检验nndl-practice/index.md卷积网络中的反向传播第 5 章viz/cnn-explainer.md损失曲面与优化器轨迹可视化第 7 章优化背景viz/optimizers.md经典文献Glorot Bengio, Understanding the difficulty of training deep feedforward neural networks2010权重初始化Maas et al., Making Deep Neural Networks Work on Data with Small Feature DimensionsReLU 缓解梯度消失。下一篇可以顺藤摸瓜卷积网络中权值共享如何改写 δ 的传播方式。最后说两句反向传播拆开就是链式法则在计算图上的系统应用。手算过 2-2-1 网络、又用数值检验对过拍你再看自动微分源码时每行都会对得上号。【免费下载链接】nndl邱锡鹏《神经网络与深度学习》第二版与通识版电子书、章节目录、学习资源与勘误。项目地址: https://gitcode.com/GitHub_Trending/nn/nndl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表