大家好!在踏入深度学习的宏伟殿堂时,有两个概念是我们无论如何也绕不开的“守门神”:梯度下降(Gradient Descent)反向传播(Backpropagation, BP)。它们是驱动神经网络学习和优化的核心引擎,前者是战略方针,后者是战术执行。今天,就让我们用图文并茂、通俗易懂的方式,一次性征服这两个强大的概念!

一、战略方针:如何找到最优解?(梯度下降法)⛰️

在开始之前,我们先明确一个终极目标:训练一个神经网络,就是为了让它的预测结果与真实结果之间的误差(或称为损失,Loss) 尽可能小。

想象一下,这个“总误差”就像一座连绵起伏的山脉,我们的目标就是从山上的任意一个位置出发,走到山谷的最低点。而这个寻找最低点的“下山”策略,就是梯度下降法

1. 核心思想:下山最快的一步

想象你被蒙上眼睛放在一座山上,要以最快的速度走到山谷底。你该怎么办?
最明智的做法是:伸出脚,试探四周哪个方向是“下坡最陡”的,然后朝着这个方向迈一小步。不断重复这个过程,你最终就能到达谷底。

在数学中:

  • “坡度” 就是梯度(Gradient)
  • 梯度的方向是函数值增长最快的方向。
  • 那么,梯度的反方向自然就是函数值下降最快的方向。

因此,我们更新模型参数(比如权重 w)的公式就诞生了:
θnew=θold−η⋅∇J(θ) \theta_{new} = \theta_{old} - \eta \cdot \nabla J(\theta) θnew=θoldηJ(θ)

  • θ:代表模型的参数(权重和偏置)。
  • η (eta):是学习率(Learning Rate),它决定了我们“下山”时每一步迈多大。
    • η 太小:步子太小,下山速度慢,训练时间长。🐢
    • η 太大:步子太大,容易一步迈过山谷,在两边来回震荡,找不到最低点。😲
  • ∇J(θ):是损失函数 J(θ) 关于参数 θ梯度

2. 训练中的核心概念 🗓️

在进行模型训练时,我们经常遇到这三个名词:

  • Epoch (轮次): 指的是使用全部训练数据对模型进行一次完整的训练。
  • Batch Size (批大小) 📦: 每次训练,我们不用全部数据,而是取一小批(a batch of)数据来更新模型的参数。这个“一小批”的大小就是 Batch Size。
  • Iteration (迭代) 🔄: 使用一个 Batch 的数据来完成一次参数更新的过程。

举个例子:

假设数据集有 50,000 个训练样本,我们设定 Batch Size = 256。

  • 每个 Epoch 需要训练的样本数: 50,000
  • 训练集包含的 Batch 数量: 50,000 / 256 ≈ 195.3,向上取整为 196 个。
  • 每个 Epoch 的 Iteration 次数: 196
  • 10 个 Epoch 总共的 Iteration 次数: 196 × 10 = 1960

3. 梯度下降的“三兄弟”

根据每次更新参数时使用的数据量不同,梯度下降法可以分为三种:

类型 Batch Size 优点 缺点
批量梯度下降 (BGD) 全量数据集 N 梯度准确,方向稳定,容易收敛到全局最优解 数据量大时,内存消耗大,训练速度极慢 🐢
随机梯度下降 (SGD) 1 训练速度快,内存占用小,可能跳出局部最优解 梯度方向随机性大,收敛不稳定,震荡严重 🐇
小批量梯度下降 (Mini-Batch) B (1 < B < N) 结合了BGD和SGD的优点,速度和稳定性都很好 👍 需要额外选择Batch Size超参数

:在现代深度学习中,Mini-Batch Gradient Descent 是最常用、最主流的方法。我们通常说的 SGD 很多时候其实指的就是 Mini-Batch SGD。


二、战术执行:如何计算梯度?(反向传播算法)⚙️

我们已经知道了要用梯度下降来更新参数,也知道了更新的公式。那么,现在最关键的问题来了:

在一个包含成千上万个参数的复杂神经网络中,如何高效地计算出每个参数的“梯度” ∇J(θ) 呢?

答案就是 —— 反向传播 (BP) 算法

1. 核心思想:从后往前,层层追责

如果说梯度下降是“下山”,那么反向传播就是“计算下山坡度”的那个精密仪器。

  • 前向传播 (Forward Propagation) ➡️: 数据从输入层开始,逐层向前计算,直到输出层得到预测结果。就像多米诺骨牌一样,从第一块推倒最后一块。
  • 反向传播 (Back Propagation) ⬅️: 计算预测结果与真实结果的误差,然后将这个误差从输出层开始,反向传播给网络中的每一层,并在此过程中利用链式法则计算出每个参数的梯度(即每个参数对最终误差的“贡献程度”)。

2. BP算法实战推演

让我们通过一个简单的神经网络来手动推演一遍 BP 的过程。

网络结构如下:(激活函数为 Sigmoid)

第一步:前向传播 ➡️

数据向前流动,计算出每一层的输出,最终得到预测结果。

第二步:计算总误差 🎯

假设真实标签是 [0.01, 0.99],我们使用平方和误差作为损失函数:
Etotal=∑12(target−output)2 E_{total} = \sum \frac{1}{2}(target - output)^2 Etotal=21(targetoutput)2
将前向传播计算出的值代入,得到总误差 E_total ≈ 0.29837

第三步:反向传播 ⬅️

现在,我们开始反向计算梯度,以更新权重 w5 为例。这里就要祭出微积分中的大杀器 —— 链式法则 (Chain Rule) 🔗。

目标:计算 ∂E_total / ∂w5

E_totalout_o1 影响,out_o1net_o1 影响,而 net_o1 直接受 w5 影响。因此,求导链条为:
∂Etotal∂w5=∂Etotal∂outo1×∂outo1∂neto1×∂neto1∂w5 \frac{\partial E_{total}}{\partial w_5} = \frac{\partial E_{total}}{\partial out_{o1}} \times \frac{\partial out_{o1}}{\partial net_{o1}} \times \frac{\partial net_{o1}}{\partial w_5} w5Etotal=outo1Etotal×neto1outo1×w5neto1

计算出梯度 ∂E_total / ∂w5 = 0.082167 后,我们就可以用梯度下降公式更新 w5 了:

对于更深层的权重(如 w1),链条会更长,但原理完全相同。w1 通过 out_h1 同时影响了 E_o1E_o2,所以需要将两条路径的梯度相加。

通过这样链式地、从后向前地计算,我们可以求出网络中每一个权重对总误差的偏导数(梯度),然后用梯度下降法统一进行更新。

三、总结:天作之合 ✨

最后,让我们用一句话来总结它们的关系:

梯度下降 就像是神经网络的“优化哲学”,它告诉我们:“为了让误差最小,我们应该朝着梯度的反方向去调整参数”。它回答了 “做什么 (What to do)”

反向传播 则是实现这一哲学的“精密算法”,它解决了“在一个复杂的网络中,如何高效、准确地计算出每个参数的梯度”这个关键问题。它回答了 “怎么做 (How to do it)”

梯度下降是目标 (What to do),反向传播是方法 (How to do it)。两者相辅相成,构成了现代神经网络训练的基石。希望这篇文章能帮助你彻底理解这两个强大的概念!

🙏 课程推荐与参考 (Reference)

再次强调,本文核心知识点均提炼自 B 站黑马程序员 的精品课程,老师讲得非常详细,大家一定要去支持!

课程名称: AI大模型《神经网络与深度学习》全套视频课程,涵盖Pytorch深度学习框架、BP神经网络、CNN图像分类算法及RNN文本生成算法

更多推荐