第18讲 · EECS 189:神经网络与反向传播

UC Berkeley EECS 189/289A《机器学习导论》2026 春季 · 课堂实录重构

原始标题 Neural Networks, Backpropagation
视频 https://www.youtube.com/watch?v=XlaV_z2knjA
课程主页 https://eecs189.org/sp26/
官方讲义/笔记(Lecture 18) Google Drive 文件夹
图片来源 书中幻灯片插图为官方 PDF 高清渲染图

对应讲次:第18讲(UC Berkeley EECS 189 机器学习导论)

制作模型:deepseek-flash(coding-agent / pi;据 ~/.pi/agent/settings.json)

说明:课程材料版权归 UC Berkeley 及授课教师所有,本书仅供学习

本讲路线图

(参考时间: 00:00)

本讲全部围绕一个问题:如何高效地计算神经网络的梯度?

  1. 回顾:神经元、深度网络、激活函数、训练流程;
  2. 朴素做法:把损失写成 $w,b$ 的复合函数,用大一链式法则硬求导;
  3. 计算图(computation graph) 与反向传播:从损失倒着走、复用中间导数;
  4. 通用算法:拓扑排序 + 误差信号(bar 记号);多元链式法则处理「一个节点多个子节点」;
  5. 向量化、消息传递视角、计算复杂度(与参数量线性!);
  6. 梯度计算的另外三个视角与激活函数的梯度问题。

本讲幻灯片改编自 Roger Grosse(多伦多大学)的 backprop 讲义。

标题页

📷 标题页
回到原视频 (00:00:20)

整体设定与之前相同

📷 整体设定与之前相同
回到原视频 (00:01:33)

回顾:带阶跃激活的神经元

📷 回顾:带阶跃激活的神经元
回到原视频 (00:02:46)

k ∈ {1, …, K}

📷 k ∈ {1, …, K}
回到原视频 (00:03:59)

回顾:深度神经网络

📷 回顾:深度神经网络
回到原视频 (00:05:12)

回顾:一些激活函数

📷 回顾:一些激活函数
回到原视频 (00:06:25)

我们如何训练神经网络?

📷 我们如何训练神经网络?
回到原视频 (00:07:38)

反向传播幻灯片改编自 Roger Grosse

📷 反向传播幻灯片改编自 Roger Grosse
回到原视频 (00:08:51)


一、一个简单的非线性回归例子

(参考时间: 00:09)

标量例子:数据 $x$、标签 $t$,参数 $w,b$。

$$ z = wx+b,\qquad y=\sigma(z),\qquad L=\tfrac12(y-t)^2 $$

朴素做法(「假装没上过这门课」):把 $L$ 完全展开成 $w,b$ 的复合函数,再用链式法则一次性求出。可以 work,但每次都要重新推导,且会反复重算相同的项——对大网络极其低效。

简单非线性回归示例(一)

📷 简单非线性回归示例(一)
回到原视频 (00:10:04)

简单非线性回归示例(二)

📷 简单非线性回归示例(二)
回到原视频 (00:11:17)

简单非线性回归示例(三)

📷 简单非线性回归示例(三)
回到原视频 (00:12:30)

简单非线性回归示例(四)

📷 简单非线性回归示例(四)
回到原视频 (00:13:43)

简单非线性回归示例(五)

📷 简单非线性回归示例(五)
回到原视频 (00:14:56)

简单非线性回归示例(六)

📷 简单非线性回归示例(六)
回到原视频 (00:16:09)

简单非线性回归示例(七)

📷 简单非线性回归示例(七)
回到原视频 (00:17:22)

简单非线性回归示例(八)

📷 简单非线性回归示例(八)
回到原视频 (00:18:35)

简单非线性回归示例(九)

📷 简单非线性回归示例(九)
回到原视频 (00:19:48)

1.1 计算图

你看到结构了吗? 依赖关系是:$z$ 依赖 $(x,w,b)$,$y$ 依赖 $z$,$L$ 依赖 $(t,y)$。把它画成一个有向图就是计算图:

x ─┐
w ─┼─► z ─► y ─┐
b ─┘           ├─► L
t ─────────────┘

前向传播:沿箭头算出所有中间值,最后得到 $L$。

反向传播:从 $L$ 开始逆着箭头算导数——这就是「back-propagation」名字的来源。

你看到结构了吗

📷 你看到结构了吗
回到原视频 (00:21:01)

用计算图系统化导数(一)

📷 用计算图系统化导数(一)
回到原视频 (00:22:14)

用计算图系统化导数(二)

📷 用计算图系统化导数(二)
回到原视频 (00:23:27)

用计算图系统化导数(三)

📷 用计算图系统化导数(三)
回到原视频 (00:24:40)

用计算图系统化导数(四)

📷 用计算图系统化导数(四)
回到原视频 (00:25:53)

用计算图系统化导数(五)

📷 用计算图系统化导数(五)
回到原视频 (00:27:06)


二、反向传播:复用中间导数

(参考时间: 00:28)

Bar 记号(误差信号):$\bar v \equiv \dfrac{\partial L}{\partial v}$。

单子节点图的反向规则(先算 $\bar L = 1$,再往前推):

$$ \bar L = 1,\qquad \bar y = \frac{\partial L}{\partial y},\qquad \bar z = \bar y\,\sigma'(z),\qquad \bar w = \bar z\,x,\qquad \bar b = \bar z\cdot1 $$

关键洞见:计算 $\bar w$ 时需要的 $\bar z$ 已经在前一步算过——复用(caching)。函数复合越深,可复用的项越多。这正是动态规划:沿图反向、以正确的偏序依次计算,避免重复。

如果网络有多个子节点?

📷 如果网络有多个子节点?
回到原视频 (00:28:19)

如果网络有多个子节点?(续)

📷 如果网络有多个子节点?(续)
回到原视频 (00:29:32)

微积分:多元链式法则

📷 微积分:多元链式法则
回到原视频 (00:30:45)

「消息」(值)已经……

📷 「消息」(值)已经……
回到原视频 (00:31:58)

通用规则(单子节点情形):要求某个变量的 $\bar{\ }$,就用它的子节点的 $\bar{\ }$ 乘以「子节点对该变量的偏导」。损失对自身的导数是基本情况 1——算法从这里开始递归回溯。

讲师提到幻灯片里的一处笔误(把「子节点」写成了「$i+1$」)经现场同学指出后更正:应当是「对这个节点的每个子节点 $j$,取 $\bar v_j\,\partial v_j/\partial v_i$」。

通用反向传播算法(一)

📷 通用反向传播算法(一)
回到原视频 (00:33:11)

通用反向传播算法(二)

📷 通用反向传播算法(二)
回到原视频 (00:34:24)

通用反向传播算法(三)

📷 通用反向传播算法(三)
回到原视频 (00:35:37)

通用反向传播算法(四)

📷 通用反向传播算法(四)
回到原视频 (00:36:50)

通用反向传播算法(五)

📷 通用反向传播算法(五)
回到原视频 (00:38:03)

通用反向传播算法(六)

📷 通用反向传播算法(六)
回到原视频 (00:39:16)

2.1 多个子节点:多元链式法则

问题:若某变量有多个子节点(例如 L2 正则项让 $L$ 同时依赖「数据损失」和「惩罚 $R$」,或多类 softmax 中某中间量指向每个类别),单子节点规则不再够用。

多元链式法则:$f=f(x,y)$,$x=x(t)$,$y=y(t)$:

$$ \frac{df}{dt}=\frac{\partial f}{\partial x}\frac{dx}{dt}+\frac{\partial f}{\partial y}\frac{dy}{dt} $$

即沿所有路径的信息流求和。于是通用规则的紫色部分变成:

$$ \bar v_i=\sum_{j\,\in\,\text{children}(i)} \bar v_j\,\frac{\partial v_j}{\partial v_i} $$

「扇出(fan-out)> 1」 就是「一个节点有多个子节点」。这条求和规则就是完整、最一般的反向传播。

通用反向传播算法(向量记号)

📷 通用反向传播算法(向量记号)
回到原视频 (00:40:29)

向量化:实际实现时把所有 $z,h,\dots$ 堆成向量/矩阵,用矩阵微积分——几行代码搞定整层,通常也是人们做法。

作为消息传递的反向传播

📷 作为消息传递的反向传播
回到原视频 (00:41:42)

消息传递视角:每个节点只需局部信息(来自子节点的 $\bar{\ }$)就能算出自己的 $\bar{\ }$ 并传给父节点,无需知道图的其余部分。这带来极好的模块化——每个节点只需实现「如何对自己的参数求导」。

反向传播的计算代价

📷 反向传播的计算代价
回到原视频 (00:42:55)

计算复杂度(至关重要):每个参数在前向被用一次,在反向被访问两次(算自身误差信号、作为回传求和的一项)⇒ 一次反向约等于两次前向。更重要的是,总代价与参数量(以及输入数、隐藏单元数)成线性。用传统符号微积分则未必线性——正是这种线性让深度网络可行。

梯度的三种视角

📷 梯度的三种视角
回到原视频 (00:44:08)

梯度的三种视角:

  1. 几何:最速上升方向(沿 $-\nabla$ 下降);
  2. 一阶微积分:链式法则的机械计算;
  3. 算法/动态规划/消息传递:图上的高效反向遍历。

三、激活函数的梯度与其它求导方式

(参考时间: 01:14)

Sigmoid/tanh 的共同问题

📷 Sigmoid/tanh 的共同问题
回到原视频 (00:45:21)

ReLU 解决了一半问题

📷 ReLU 解决了一半问题
回到原视频 (00:46:34)

其它获取梯度的方式:

用数值微分计算梯度

📷 用数值微分计算梯度
回到原视频 (00:47:47)

SymPy 等计算机代数系统

📷 SymPy 等计算机代数系统
回到原视频 (00:49:00)

面试题:什么叫反向传播?——从概念上讲,它就是在计算梯度,以便做梯度下降。很多人能写出公式,却说不出这一句。

为什么深度网络这么好?

📷 为什么深度网络这么好?
回到原视频 (00:50:13)

为什么深度网络这么好?(续)

📷 为什么深度网络这么好?(续)
回到原视频 (00:51:26)


总结(Takeaways)


附:参考与延伸阅读

主题 链接
本讲视频 https://www.youtube.com/watch?v=XlaV_z2knjA
课程主页 https://eecs189.org/sp26/
官方讲义/笔记(Lecture 18) Google Drive 文件夹
Roger Grosse, CSC321 Introduction to Neural Networks(backprop 讲义) http://www.cs.toronto.edu/~rgrosse/courses/csc321_2018/
Bishop, Pattern Recognition and Machine Learning 第 5 章(神经网络、反向传播) · https://www.microsoft.com/en-us/research/publication/pattern-recognition-machine-learning/
Goodfellow et al., Deep Learning 第 6 章(反向传播、计算图) · https://www.deeplearningbook.org/

版权说明:本讲视频、幻灯片与课程材料版权归 UC Berkeley EECS 189/289A 课程团队所有。本书为课堂内容的学习性中文重构,仅供学习交流。