深度学习的反向传播——神经网络如何学习
以MSE为例,Loss 被转化为了“代价函数的平方和”
代价函数的平方和最小 = 找代价函数最小值点 = Loss 最小
找函数最小值点 → 梯度下降 → 反向传播
函数有 n 个变量,只需要计算函数梯度,取梯度负方向,找一个 n 维向量,每个元素都能让对应的变量下降得最快

Loss 是什么 → 梯度下降怎么更新 → 反向传播如何高效算梯度 → 在 PyTorch 里怎么对应到 autograd / optimizer。
视频内容笔记
这是关于 3Blue1Brown 的视频 《梯度下降,神经网络如何学习 | 深度学习第 2 章》 (Gradient descent, how neural networks learn | Deep Learning Chapter 2) 的详细内容笔记:
1. 核心目标与背景回顾
- 神经网络结构回顾:视频延续了第 1 章的内容,以手写数字识别(MNIST 数据集)为例。网络输入是 28x28 像素的灰度值,通过隐藏层的权重(Weights)和偏置(Biases)计算,最终在输出层得到 10 个数字的概率 [00:31]。
- 学习的本质:所谓的“学习”,就是通过算法自动调整网络中成千上万个权重和偏置,使得网络在面对从未见过的输入时,能给出正确的分类结果 [01:53]。
2. 代价函数 (Cost Function)
- 定义偏差:为了让机器知道自己做得有多差,引入了“代价函数”。它计算网络当前的输出值与目标值(正确答案)之间差值的平方和 [03:56]。
- 如果网络自信地分类正确,代价很小。
- 如果网络分类错误或犹豫不决,代价很大。
- 整体评估:代价函数实际上是网络在数万个训练样本上表现的平均代价。它是一个极其复杂的函数,输入是 13,000 多个权重和偏置,输出是一个表示“糟糕程度”的单一数字 [04:19]。
3. 梯度下降 (Gradient Descent)
- 寻找最小值:由于代价函数太复杂,无法直接解出最小值。策略是像球从山上滚下来一样,寻找函数的局部最小值 [05:32]。
- 梯度的意义:
- 高维空间的理解:在 13,000 维的空间里,梯度向量告诉我们:如何微调每一个权重和偏置,才能最有效地降低代价 [08:36]。
- 权重重要性:梯度的分量大小可以理解为不同权重对结果的影响力(Bang for your buck)。某些权重的改变比其他的更重要 [11:05]。
4. 训练效果与实际表现
- 准确率:这个拥有两个隐藏层(各 16 个神经元)的简单网络,在处理未见过的数字时,准确率能达到约 96% [13:22]。
- 它真的学到了“特征”吗?:
5. 总结与后续
- 学习即优化:机器学习本质上就是一个微积分练习,通过梯度下降不断逼近局部最优解 [09:56]。
- 下集预告:视频提到,高效计算这个梯度的方法叫做反向传播 (Backpropagation),这将在下一章详细讲解 [09:25]。
相关视频链接:Gradient descent, how neural networks learn | Deep Learning Chapter 2
这是关于 3Blue1Brown 视频 《反向传播的直观理解 | 深度学习第 3 章》 (Backpropagation, intuitively | Deep Learning Chapter 3) 的中文内容笔记。
本集重点在于不使用复杂的数学公式,而是通过直观的物理意义来解释神经网络是如何通过“反向传播”算法来学习的。
1. 核心概念:敏感度 (Sensitivity)
- 梯度向量的另一种理解:与其将梯度看作 13,000 维空间中的一个方向,不如将其分量看作代价函数对每个权重和偏置的敏感程度 [02:07]。
- 影响力差异:如果某个权重的梯度分量是 3.2,另一个是 0.1,这意味着微调第一个权重对降低代价的效果是第二个权重的 32 倍 [02:13]。
2. 单个训练样本的“愿望” (The Desires of One Example)
反向传播首先考察一个样本(比如数字 "2")希望如何调整网络:
- 输出层调整:我们希望数字 "2" 对应的神经元激活值变大,而其他 9 个神经元的激活值变小 [04:12]。
- 调整的三种途径:为了增加某个神经元的激活值,有三种方法 [05:08]:
- 调整偏置 (Bias):整体提升激活水平。
- 调整权重 (Weights):给予前一层中本身就亮的神经元更多的权重。
- 调整前一层激活值:希望前一层中带有正权重的神经元更亮,带有负权重的神经元更暗 [06:49]。
3. 递归与“反向”的含义 (Propagating Backwards)
- 利益冲突与求和:输出层的 10 个神经元对于“倒数第二层应该长什么样”都有各自的愿望。我们将这些愿望全部加在一起,得到对倒数第二层的综合调整要求 [07:42]。
- 向后传递:一旦确定了倒数第二层的理想调整方向,就可以用同样的方法递归地去调整更前一层的权重和偏置。这种从后往前的微调过程就是“反向传播” [08:04]。
4. 训练的整体过程
- 平均愿望:网络不会只听一个样本的。它会遍历成千上万个训练样本,计算出每个样本对权重和偏置的调整愿望,然后取其平均值。这个平均后的结果才是真正的梯度下降步长 [08:45]。
- 随机梯度下降 (Stochastic Gradient Descent, SGD):
- 为了计算效率,网络不会等看完所有样本才走一步。
- 它将数据分成许多“小批量”(Mini-batches),每看完一小部分就更新一次权重。
- 比喻:这就像一个醉汉在下山,虽然路径歪歪扭扭,但每一步都很快,最终也能走到山谷 [10:14]。
5. 总结
- 反向传播是确定单个样本如何“建议”权重和偏置改变比例的算法 [10:42]。
- 机器学习的成功高度依赖于大量带标签的训练数据(如 MNIST 数据库)[12:01]。
- 预告:下一章将正式进入这些直观感受背后的微积分数学推导 [11:46]。
相关视频链接:Backpropagation, intuitively | Deep Learning Chapter 3
6. 补充:误差信号传回来后,参数到底怎么“分到更新量”?
上面第 3 集讲的是:从输出层开始形成“这一层希望怎么变”的信号,并把这种误差信号一层层往前传。这里补充一个读完本集很容易卡住的点:误差信号并不是被“平均摊给”每个权重/偏置的。
更贴近本集“敏感度(Sensitivity)/Bang for your buck”的说法是:当你真正要更新参数时,每个参数拿到的更新量由它对代价函数的敏感度决定(也就是梯度向量里对应分量的大小)。敏感度越大,就越“值得调”;敏感度接近 0 的参数,调它几乎没收益。
下面把这个点按视频的直觉继续展开。
1. 核心逻辑:谁的“杠杆作用”大,就多调谁
在视频中,Grant 反复强调了一个词:敏感度(Sensitivity)。
- 梯度向量里的每一个分量,代表的就是代价函数对该参数的偏导数(\frac{\partial C}{\partial w} 或 \frac{\partial C}{\partial b})。
- 数学意义: 这个数值的大小告诉你,如果你把这个参数改变一个微小的量,代价函数会改变多少。
- 非平均分配: 如果某个权重 w_1 的变动能显著降低错误(高敏感度),而另一个权重 w_2 的变动对结果几乎没影响(低敏感度),那么梯度下降算法会给 w_1 分配一个巨大的改变量,而让 w_2 几乎不动。
这就是 Grant 在视频里说的 "Bang for your buck"(性价比):算法会自动寻找最有效的改进路径,而不是平庸地平均修改。
2. 调节量的大小由什么决定?
在反向传播的具体公式中,一个权重 w 的调节量(梯度分量)取决于三个因子的乘积:
- 前一层神经元的亮度(激活值): 如果前一个神经元本身就是黑的(值为0),那么改变连接它的权重对下一层没有任何影响,所以这个权重的梯度就是0。
- 当前层激活函数的导数(坡度): 如果当前的神经元已经处于饱和区(比如 Sigmoid 函数非常平坦的地方),调节它的参数收效甚微,调节量就会很小。
- 下一层传回来的“愿望”: 下一层对这个神经元改变的渴求程度(误差项)。
3. “平均”通常出现在哪两处?
-
跨样本的平均(mini-batch averaging):
每个训练样本都会给出一套自己的梯度;训练时通常对一个 mini-batch 内的梯度做求和/取平均,得到一次参数更新用的“折中方向”。
-
多路径的求和(path-sum in backprop):
一个神经元会影响下一层的多个神经元;因此它回传到上一层的误差信号/梯度贡献,需要把来自多条路径的贡献做求和(有时在实现里表现为求和后再按 batch 做平均)。
总结
- 权重之间: 绝对不是平均分配。谁对结果影响大,谁的梯度就大,谁被调得就多。
- 样本之间: 确实是取平均值。网络通过平均成千上万个样本的梯度,来确保学习到的是通用特征,而不是只记住了某个特定的图片。
所以,反向传播是一套非常“势利”的算法:它把所有的精力都集中在那些最能立竿见影降低错误的权重和偏置上。
这是关于 3Blue1Brown 视频 《反向传播的微积分推导 | 深度学习第 4 章》 (Backpropagation calculus | Deep Learning Chapter 4) 的中文内容笔记。
1. 简化模型:单线网络
为了看清本质,视频先从一个最简单的网络入手:每一层只有一个神经元。
- 符号定义:
- a^{(L-1)}:前一层的激活值。
- w^{(L)}:连接两层的权重。
- b^{(L)}:偏置。
- z^{(L)} = w^{(L)} a^{(L-1)} + b^{(L)}:加权和。
- a^{(L)} = \sigma\!\left(z^{(L)}\right):当前层的激活值(通过激活函数,如 Sigmoid)。
- C_0 = (a^{(L)} - y)^2:单个样本的代价函数(y 为目标值)。
2. 链式法则:微积分的核心 (The Chain Rule)
我们要计算的是代价函数 C_0 对权重 w^{(L)} 的敏感度,即偏导数 \frac{\partial C_0}{\partial w^{(L)}}。
根据链式法则,这个过程可以拆解为三步:
- 代价对激活值的改变: \frac{\partial C_0}{\partial a^{(L)}} = 2\,(a^{(L)} - y)(这是我们离目标的距离)。
- 激活值对加权和的改变: \frac{\partial a^{(L)}}{\partial z^{(L)}} = \sigma'\!\left(z^{(L)}\right)(激活函数在当前点的坡度)。
- 加权和对权重的改变: \frac{\partial z^{(L)}}{\partial w^{(L)}} = a^{(L-1)}(前一层神经元的亮度决定了权重的强度)。
最终公式:
3. 三个参数的偏导数
- 对权重 (w): 取决于前一层的亮度(a^{(L-1)})。
- 对偏置 b:\frac{\partial z^{(L)}}{\partial b^{(L)}} = 1,所以偏导数就是前两项之积。
- 对前一层激活值 (a^{(L-1)}): 这是反向传播的关键。它告诉我们代价函数对前一层的敏感度,从而将"愿望"继续向后传递。
4. 推广到完整网络(多神经元)
在拥有多个神经元的真实网络中,下标会变得复杂(如 w_{jk}^{(L)} 表示从层 L-1 的第 k 个神经元到层 L 的第 j 个神经元的权重)[00:08:22]。
- 求和效应: 某一个神经元的改变会影响下一层所有的神经元。因此,在计算 \frac{\partial C_0}{\partial a_k^{(L-1)}} 时,需要将下一层所有受其影响的路径产生的导数全部求和。
5. 矩阵表示(向量化)
为了高效计算,数学家和工程师通常将这些复杂的求和过程写作矩阵运算:
- 梯度向量:包含了网络中所有权重和偏置的偏导数。
- 现代深度学习框架(如 PyTorch, TensorFlow)在底层就是在执行这些大规模的矩阵微积分运算。
6. 总结
- 反向传播本质上就是链式法则的应用。
- 它通过从输出层向输入层“倒退”计算偏导数,极大地减少了重复计算。
- 每一个偏导数都代表了:“为了降低代价,我应该在这个维度上把旋钮转动多少”。
相关视频链接:Backpropagation calculus | Deep Learning Chapter 4
结语:看完这一章,你就理解了神经网络“学习”背后的严谨数学支撑。接下来的内容通常会涉及更复杂的架构(如卷积神经网络 CNN 或 GPT 等)如何应用这些基本原理。
公式 / 例子 / PyTorch 对照
1) 反向传播公式
设第 l 层:
- 线性:z_l = W_l a_{l-1} + b_l
- 激活:a_l = f(z_l)
定义本层误差(背锅系数):
- \delta_l \equiv \frac{\partial L}{\partial z_l}
误差信号往前传:
- g_{a_l} \equiv \frac{\partial L}{\partial a_l} = W_{l+1}^{\mathsf{T}}\,\delta_{l+1}
- \delta_l = g_{a_l} \odot f'(z_l) = \left(W_{l+1}^{\mathsf{T}}\,\delta_{l+1}\right) \odot f'(z_l)
本层参数梯度:
- \frac{\partial L}{\partial W_l} = \delta_l\, a_{l-1}^{\mathsf{T}}
- \frac{\partial L}{\partial b_l} = \delta_l
直觉一句话:梯度 =(本层误差)×(本层输入)。
2) 带数字的最小例子(1 个参数)
模型:y = w x,L = (y - t)^2;给 x=2, t=5, w=1, \eta=0.1
- Forward:y=2,L=9
- \frac{dL}{dw} = 2(wx - t) \cdot x = 2(2-5) \cdot 2 = -12
- Update:w \leftarrow 1 - 0.1 \times (-12) = 2.2
- 再 Forward:y=4.4,L=0.36
3) 两层线性网络:误差信号会“变形”
两层:h = w_1 x,y = w_2 h,L = (y - t)^2;给 x=2, t=5, w_1=1, w_2=3
- Forward:h=2,y=6,L=1
- Backward:
- \delta_y = \frac{dL}{dy} = 2(y-t) = 2
- \frac{dL}{dw_2} = \delta_y \cdot h = 4
- \frac{dL}{dh} = \delta_y \cdot w_2 = 6
- \frac{dL}{dw_1} = \left(\frac{dL}{dh}\right) \cdot x = 12
4) PyTorch 对照:autograd 算梯度,optimizer 更新参数
- requires_grad=True:追踪计算图
- loss.backward():计算梯度并写入参数 .grad(不更新参数)
- optimizer.step():按学习率/策略更新参数
- optimizer.zero_grad():清梯度(默认会累积)
标准训练循环:
optimizer.zero_grad()
pred = model(x)
loss = criterion(pred, y)
loss.backward()
optimizer.step()
一句话小结
神经网络“学习”的本质是:
- 用 loss 把“错多少”变成可优化的标量
- 用反向传播高效算出每个参数的梯度
- 用梯度下降(或其变体)更新参数,让 loss 下降