
视频元信息
- 所属课程:吴恩达深度学习专项课程 - 改善深层神经网络(Professionalization of Deep Learning)
- 章节编号:3.9 神经网络的梯度下降
- 本节主题:单隐层神经网络的梯度下降公式推导与实现要点
内容摘要(TL;DR)
本节给出单隐层神经网络梯度下降所需的全部核心公式:前向传播4个公式 + 反向传播6个公式。吴恩达强调训练时必须随机初始化参数(而非全零),并详细讲解了 NumPy 中 keepdims=True 的作用——防止输出"rank 1 array"导致后续计算维度错误。本节只需照着公式实现即可跑通,推导细节留到下一节选修视频。
一、本节定位与学习目标 [00:00]
本节的目标:给出实现反向传播(back propagation)和梯度下降所需的全部方程,先会用,再理解。
- 本节直接给出公式,不深入推导;
- 下一节(选修视频)才解释这些公式为什么是正确的;
- 理解:吴恩达的教学策略是"先学会用,再理解原理",这与很多课程"先推导再用"的顺序不同,降低了初学者的挫败感。
核心目标:知道如何计算偏导数项 dw1、db1、dw2、db2,从而用梯度下降学习网络参数。
二、单隐层网络的参数与维度约定 [00:29]
本节讨论的网络结构:单隐层(single hidden layer)神经网络,参数为 w1、b1、w2、b2。
符号定义
- n0:输入特征数
- n1:隐藏层单元数
- n2:输出单元数(本课程例子中 n2 = 1)
各参数矩阵维度
| 参数 | 维度 | 说明 |
|---|---|---|
| w1 | n1 × n0 | 第一层权重矩阵 |
| b1 | n1 × 1 | 第一层偏置(列向量) |
| w2 | n2 × n1 | 第二层权重矩阵 |
| b2 | n2 × 1 | 第二层偏置 |
易错点:维度匹配——矩阵乘法要求前一层的输出维度与后一层的输入维度对齐。w1 的列数必须等于输入特征数 n0,w2 的列数必须等于隐藏层单元数 n1。
考点:记住这四个参数的维度关系。这是判断代码中矩阵乘法是否写错的第一道防线。b1 是 n1 维列向量,写成矩阵就是 n1 × 1;b2 同理。
思考:为什么 b 是列向量而不是行向量?因为广播机制(broadcasting)中,z = wx + b,wx 的结果是 (n1, m) 的矩阵,b 是 (n1, 1),NumPy 会自动把 b 广播到每一列,这正是我们想要的——每个样本加上同一个偏置。
三、代价函数与二分类假设 [01:33]
本节暂时假设做的是二分类(binary classification)。
代价函数
代价函数 J 定义为:
J = (1/m) × Σ L(y_hat_i, y_i)
- m:训练样本数量
- L:损失函数,衡量网络预测 y_hat 与真实标签 y 之间的差距
- 二分类情况下,损失函数就是逻辑回归中使用的那个(交叉熵损失)
理解:这里把逻辑回归的损失函数直接搬到神经网络输出层,是因为输出层用的也是 sigmoid 激活函数,本质上和逻辑回归的输出形式一致。
四、梯度下降的整体流程 [02:13]
参数初始化:必须随机初始化
重点:训练神经网络时,参数必须随机初始化,不能全部初始化为 0。 吴恩达特别强调这一点,并说"后面会看到为什么"。
推导(为什么不能全零初始化):如果所有权重都是 0,那么隐藏层所有单元计算出的结果完全相同,反向传播时它们的梯度也完全相同,更新后仍然完全相同——相当于多个隐藏单元退化成一个,网络失去了表达能力。这就是所谓的"对称性破坏问题"(symmetry breaking)。
一次梯度下降迭代的步骤
- 计算预测值:对 i = 1 到 m,计算 y_hat_i
- 计算导数:
- dw1 = ∂J/∂w1
- db1 = ∂J/∂b1
- dw2 = ∂J/∂w2
- db2 = ∂J/∂b2
- 更新参数:
- w1 := w1 - α · dw1
- b1 := b1 - α · db1
- w2 := w2 - α · dw2
- b2 := b2 - α · db2
其中 α 是学习率(learning rate)。
- 吴恩达提到
:=和=两种写法都可以,只是记号习惯不同; - 这是一次迭代,重复若干次直到参数收敛。
思考:这里体现了梯度下降的通用范式——"预测 → 求导 → 更新"三步循环。无论网络多深,这个框架都不变,区别只在于求导的公式复杂度。
五、前向传播的四个方程 [04:18]
前向传播(forward propagation)即从左到右的计算过程:
方程1:z1 = w1 · x + b1
方程2:a1 = g1(z1) (g1 是隐藏层的激活函数,逐元素作用)
方程3:z2 = w2 · a1 + b2
方程4:a2 = g2(z2)
- 以上全部对训练集做了向量化(vectorized) 处理;
- 二分类情况下,g2 应该是 sigmoid 函数。
理解:向量化意味着 x 不是单个样本,而是整个训练集堆叠成的矩阵,一次前向传播就能算出所有样本的预测值,避免了低效的 for 循环。
易错点:激活函数的下标——g1 对应隐藏层,g2 对应输出层。二分类时 g2 = σ(sigmoid),这是后面反向传播公式能简化的前提。
六、反向传播的六个方程 [05:16]
反向传播(back propagation)即从右到左计算梯度的过程。
输出层梯度
方程5:dz2 = a2 - y
- 这是输出层误差项;
- 全部对样本做了向量化;
- y 是一个 1 × m 的矩阵,即 m 个样本的标签水平堆叠。
理解:dz2 = a2 - y 这个简洁形式,正是"输出层用 sigmoid + 损失用交叉熵"这一组合带来的结果。如果换别的激活函数或损失函数,形式会变复杂。
方程6:dw2 = (1/m) · dz2 · a1ᵀ
方程7:db2 = (1/m) · np.sum(dz2, axis=1, keepdims=True)
- 吴恩达指出:这几个方程和逻辑回归的梯度下降非常相似。
隐藏层梯度
方程8:dz1 = (w2ᵀ · dz2) ⊙ g1'(z1)
- g1' 是隐藏层激活函数的导数;
- ⊙ 表示逐元素乘积(element-wise product);
- 输出层用 sigmoid,其导数已经"烘焙"进 dz2 的公式里了。
方程9:dw1 = (1/m) · dz1 · xᵀ
方程10:db1 = (1/m) · np.sum(dz1, axis=1, keepdims=True)
维度验证
- dz1 是 n1 × m 的矩阵;
- g1'(z1) 也是 n1 × m 的矩阵;
- 两者逐元素相乘,结果仍是 n1 × m。
考点:反向传播的六个方程必须牢记,它们是实现神经网络的核心。前向4个 + 反向6个 = 共10个方程。
思考:注意 dz1 的公式中,w2ᵀ · dz2 这一步相当于把输出层的误差"反向传播"回隐藏层,再乘以隐藏层激活函数的导数——这就是链式法则的体现。
七、NumPy 实现细节:keepdims=True 的作用 [06:08]
这是本节最实用的编程细节。
np.sum 的用法
np.sum(..., axis=1, keepdims=True)表示沿某一维度求和;- 本例中是水平方向求和(对每个样本的梯度求和)。
keepdims=True 为什么重要
- 不加
keepdims=True时,NumPy 会输出一种"奇怪的 rank 1 array"(形如 (n,) 的数组); - 加上
keepdims=True后,确保输出是 n × 1 的向量,维度明确。
易错点:rank 1 array 的坑——这种数组在做后续矩阵运算时会产生难以察觉的维度错误,是初学者最常见的 bug 来源之一。
易错点:db2 的维度问题。当 n2 = 1 时,db2 只是一个 1 × 1 的数,用不用 keepdims 影响不大;但 db1 是 n1 × 1 的向量,此时 keepdims 就非常关键——不加的话会输出 rank 1 array,可能破坏后续计算。
替代方案
另一种做法是不用 keepdims,而是显式调用 reshape,把 np.sum 的输出重塑成 db 应有的维度。
思考:keepdims=True 是更优雅的写法,因为它一次到位,不用手动记住目标维度。这也是吴恩达推荐的做法。
八、本节小结与后续预告 [09:04]
公式数量总结
- 前向传播:4 个方程
- 反向传播:6 个方程
学习建议
- 吴恩达坦言:即使不完全理解微积分,也可以实现这个算法并让它工作——很多成功的深度学习从业者就是这样做的;
- 如果想更深入理解这 6 个反向传播方程是怎么推导出来的,可以看下一节选修视频;
- 但无论如何,只要照着这些公式实现,就能得到正确的前向传播和反向传播,从而用梯度下降学习网络参数。
理解:这体现了工程实践与理论推导的平衡——先能跑通,再求甚解。对于想深入的人,推导视频提供了理论支撑;对于想快速上手的人,公式清单已经足够。
关键标签 / 关键词
神经网络 #梯度下降 #反向传播 #前向传播 #单隐层网络 #参数维度 #随机初始化 #keepdims #rank1array #NumPy #二分类 #sigmoid #交叉熵损失 #向量化 #吴恩达 #深度学习专项课程 #对称性破坏 #链式法则 #学习率 #dw1 #db1 #dw2 #db2 #dz1 #dz2
生成时间:2026-10-10 21:46:01 生成平台:VideoNote www.xygy.top