反向传播与梯度下降:神经网络如何学习

发布时间:2026/6/3 13:42:31

反向传播与梯度下降:神经网络如何学习 摘要神经网络的学习本质上是一个优化问题——找到一组参数让模型的预测误差最小。反向传播和梯度下降就是解决这个问题的核心算法。这篇文章从直观到数学讲清楚神经网络训练的底层逻辑。一、学习的本质一个优化问题上一篇文章我们知道了神经网络的结构输入层 → 隐藏层 → 输出层每层之间有带权重的连接。但一个关键问题没回答这些权重是怎么自动学出来的把问题拆开看给定一个训练数据集输入 x期望输出 y_true 目标找到一组权重 w使得网络的预测 y_pred 和 y_true 尽可能接近 约束权重 w 可能有数百万到数千亿个这就是一个优化问题——在巨大的参数空间中找到一组参数使误差最小。问题类比说明参数空间一座巨大的山维度 参数数量当前位置当前的参数组合在山上的某个点误差当前位置的海拔高度越低越好目标找到山谷的最低点误差最小的参数梯度下降就是在这个山上下山的算法而反向传播是计算往哪个方向走的工具。二、梯度下降下山算法核心思想梯度下降的直觉非常简单在当前站着的位置看看四周哪个方向是下坡往那个方向迈一步。到了新位置再重复这个过程直到走到谷底。数学上w_new w_old - η × ∇L(w_old) 其中 w 参数权重 η 学习率步长大小 ∇L(w) 损失函数在 w 处的梯度指向最陡上升方向 负号 朝梯度反方向走下坡而不是上坡用一个参数的情况理解假设网络只有一个参数 w误差函数是 L(w) w²L(w) w² 的图像是一个抛物线 L ↑ /\ / \ / \ ----/------\----→ w / \ / \ 最小值点 (w0, L0) 如果 w 当前在 2 的位置 ∇L(2) 4梯度指向正方向说明要往左走才能下坡 w_new 2 - η × 4 如果 η 0.1w_new 2 - 0.1 × 4 1.6 ← 离谷底更近了 重复多次后 w 会逐渐接近 0最低点学习率步长的艺术学习率 η 是最重要的超参数之一控制每次调整的幅度学习率太小η 0.001 每次只走一点点需要很多步才能到谷底 → 训练极慢 学习率合适η 0.1 稳步下降效率最高 → 训练顺利 学习率太大η 1.0 一步跨过谷底跳到了对面的山坡上 → 震荡、发散三种梯度下降方式方式每步用的数据特点适用场景批量梯度下降BGD全部数据方向最准但每步很慢小数据集随机梯度下降SGD1 个样本速度快但方向有噪声大数据集在线学习小批量梯度下降Mini-batchN 个样本如 32/64/128兼顾速度和稳定性实际中最常用现代深度学习几乎都用 Mini-batch SGD通常简称为 SGDbatch size 通常取 32、64、128 或 256。三、反向传播链式法则的艺术梯度下降告诉我们往哪走但没告诉我们怎么计算梯度。对于一个有数百万参数的深度网络手动计算每个参数的梯度是不可能的。反向传播Backpropagation就是解决这个问题的算法。直观理解想象你在一个大型游乐园里迷路了你想回到入口正向传播从入口到当前位置你经过了 A → B → C → D 四个岔路口每个路口做了一个选择最后到了 D。反向传播从当前位置回入口从 D 开始往回走每经过一个路口就问自己如果我在这个路口选了另一条路会离入口更近吗正向传播 输入 x → 层1 → 层2 → ... → 层N → 输出 y_pred → 计算误差 L 反向传播 误差 L → 计算 ∂L/∂w_N最后一层的梯度 → 把误差传回上一层 → 计算 ∂L/∂w_{N-1} → 继续传 → ... → 计算 ∂L/∂w_1链式法则数学基础反向传播的数学基础是微积分中的链式法则。如果有z f(y), y g(x) 那么dz/dx dz/dy × dy/dx在深度网络中输出误差 L 依赖于 输出层的值 a_L 输出层的值 a_L 依赖于 最后一层的加权和 z_L 最后一层的加权和 z_L 依赖于 前一层的值 a_{L-1} ...一直追溯到输入层 所以 ∂L/∂w_1 ∂L/∂a_L × ∂a_L/∂z_L × ∂z_L/∂a_{L-1} × ... × ∂a_2/∂z_2 × ∂z_2/∂a_1 × ∂a_1/∂z_1 × ∂z_1/∂w_1这就是一个链式乘法。反向传播就是高效地计算这个乘积的过程——从输出层开始逐层往前把误差传回每一层。为什么叫反向传播正向传播Forward 数据从输入层 → 经过各层变换 → 到达输出层 → 计算误差 信号前向流动 反向传播Backward 误差从输出层 → 逐层往回传 → 直到输入层 → 在每一层计算该层参数的梯度 误差信号反向流动方向相反计算效率极高——一次正向 一次反向就能算出所有参数的梯度无论网络有多深。四、一个完整的训练循环把梯度下降和反向传播组合起来就得到了完整的训练循环1. 前向传播Forward Pass 输入一批数据 x → 通过网络计算 → 得到预测 y_pred → 计算损失 L 2. 反向传播Backward Pass 从输出层开始 → 反向传播误差 → 计算每层参数的梯度 3. 参数更新Gradient Descent Step w w - η × ∇L(w) 对网络中所有参数执行 4. 重复步骤 1-3直到收敛或达到最大迭代次数┌─────────────────────────────────────────────────────────┐ │ 一个训练步Training Step │ │ │ │ 输入批次 ──→ 前向传播 ──→ 计算损失 ──→ 反向传播 ──→ 更新参数 │ │ ↑ │ │ │ └──────────────── 下一个批次 ──────────────┘ │ └─────────────────────────────────────────────────────────┘时期Epoch和批次Batch术语含义举例Batch批次一次训练步使用的样本数32 张图像Iteration迭代一个 batch 前向反向更新处理 32 张图算一次Epoch时期所有训练样本都过了一遍10000 张图 / 32 313 次迭代通常训练一个模型需要几十到几百个 Epoch。五、优化器的演进基础的 SGD 虽然简单有效但有一些问题在峡谷地形中容易震荡对学习率非常敏感在平坦区域停滞不前研究者们提出了各种改进的优化器优化器对比优化器核心思想特点2026年地位SGD原始梯度下降简单但需要手动调学习率仍在使用但很少单独用Momentum积累历史梯度方向动量穿越峡谷更平稳加速收敛常用改进AdaGrad每个参数自适应学习率稀疏梯度效果好较少用了RMSProp梯度平方的滑动平均处理非平稳目标部分场景使用AdamMomentum RMSProp 结合自适应学习率几乎不用调参最常用默认选择AdamWAdam 权重衰减解耦泛化性更好训练更稳定大模型训练首选Adam 为什么这么流行Adam 是目前用得最广泛的优化器原因很简单对比 SGD SGD需要手动设置学习率、动量、学习率衰减策略... 常见情况学习率设大了发散设小了太慢改一次重训一次 Adam学习率默认 0.001大多数情况直接 work 常见情况直接训练效果已经很好Adam 的缺点在某些任务上泛化性不如精细调参的 SGD Momentum。所以一个常见策略是先用 Adam 快速找到一个好的参数区域然后切换回 SGD 做精细微调。六、训练中的常见问题与解决问题 1梯度消失Vanishing Gradient表现网络深层靠近输入的参数几乎不更新训练停滞。原因链式法则中连乘了太多小于 1 的梯度尤其是 Sigmoid 激活函数的导数最大只有 0.25。∂L/∂w_1 ∂L/∂a_L × (≤0.25) × (≤0.25) × ... × (≤0.25) └─ 连乘 L-1 次 ─┘ 如果 L50梯度 ≈ 0.25⁵⁰ ≈ 10⁻³⁰ → 几乎为零解决方案使用 ReLU 激活函数梯度恒为 1残差连接ResNet让梯度有捷径层归一化Layer Normalization问题 2梯度爆炸Exploding Gradient表现参数突然变得非常大损失变为 NaN。原因梯度连乘了大量大于 1 的值。解决方案梯度裁剪Gradient Clipping设置梯度的最大值权重初始化更加小心使用 Batch/Layer Normalization问题 3过拟合Overfitting表现在训练集上表现完美但在新数据上表现很差。解决方案方法核心思路效果Dropout训练时随机关掉部分神经元防止共适应强制鲁棒性L1/L2 正则化在损失函数中加入权重大小的惩罚防止权重过大数据增强对训练数据做随机变换翻转、旋转等增加有效数据量早停Early Stopping验证集不再提升时停止训练防止过度训练七、现代训练技巧速览技巧作用怎么做学习率预热Warmup开始用很小的学习率逐渐增加到目标值前 1000-2000 步线性增加学习率衰减训练后期减小步长精细调整Cosine 衰减、Step 衰减权重初始化初始参数选得好训练快几倍Kaiming InitReLU、Xavier InitSigmoidBatch Normalization让每层输入分布稳定每层后加 BN 层混合精度训练用 FP16 训练快 2-3 倍现代 GPU 都支持梯度累积模拟更大的 Batch Size多次前向后再更新八、总结概念一句话理解梯度下降沿着坡度往谷底走的优化算法学习率每一步走多远反向传播从输出到输入逐层计算每个参数的梯度优化器改进了的下山策略Adam 最常用过拟合考试答案背得太熟题目一变就懵梯度消失/爆炸梯度在传递过程中变得太大或太小核心三句话正向传播计算预测结果反向传播计算梯度方向梯度下降沿着梯度反方向更新参数循环以上两步足够多次 → 网络学会完成任务这就是深度学习的学习过程——不神秘但极其优雅。

相关新闻