第十四章:Backpropagation --- 单元习题
总分:100分 | 建议用时:60分钟
范围:数值/符号/自动微分、计算图、反向传播、伴随变量
占位图

一、单项选择题(每题2分,共20题,40分)
1. 数值微分的最大缺点是什么?
A. 不适用于神经网络
B. 计算代价极高(O(ND2)\mathcal{O}(ND^2)O(ND2))
C. 结果不准确
D. 需要手动推导
2. 符号微分(Symbolic Differentiation)的主要问题是什么?
A. 无法求导
B. 表达式膨胀(Expression Swell)→大量冗余子表达式
C. 结果不精确
D. 只适用于线性函数
3. 自动微分(Autodiff)相比数值微分和符号微分的优势不包括?
A. 自动(无需手动推导)
B. 精确(机器精度)
C. 不需要任何计算
D. 高效(重用冗余计算)
4. 深度学习中使用哪种Autodiff模式?
A. Forward Mode
B. Backward Mode
C. Central Mode
D. Mixed Mode
5. Backward Mode适用于什么类型的函数?
A. f:R→RMf: \mathbb{R} \to \mathbb{R}^Mf:R→RM(少输入多输出)
B. f:RD→Rf: \mathbb{R}^D \to \mathbb{R}f:RD→R(多输入少输出/单一损失)
C. 任何函数
D. 只有线性函数
6. 伴随变量(Adjoint)aia_iai的定义是什么?
A. ai=f(vi)a_i = f(v_i)ai=f(vi)
B. ai=∂f∂via_i = \frac{\partial f}{\partial v_i}ai=∂vi∂f
C. ai=via_i = v_iai=vi
D. ai=∂vi∂fa_i = \frac{\partial v_i}{\partial f}ai=∂f∂vi
7. 反向传播的核心递归公式是?
A. ai=∑j∈Chiaja_i = \sum_{j\in\mathbf{Ch}i} a_jai=∑j∈Chiaj
B. ai=∑j∈Chi∂vj∂vi⋅aja_i = \sum_{j\in\mathbf{Ch}i} \frac{\partial v_j}{\partial v_i} \cdot a_jai=∑j∈Chi∂vi∂vj⋅aj
C. ai=∏jaja_i = \prod_{j} a_jai=∏jaj
D. ai=ai+1a_i = a_{i+1}ai=ai+1
8. 计算图中,如果viv_ivi有多个子节点(children),aia_iai如何计算?
A. 取所有子节点贡献的最大值
B. 取所有子节点贡献的平均值
C. 对所有子节点贡献求和
D. 随机选一个子节点
9. 反向传播中,最终输出fff的伴随变量afinala_{final}afinal初始化为?
A. 0
B. -1
C. 1
D. 随机值
10. 数值微分计算一个DDD维梯度向量需要多少次误差函数评估?
A. DDD次
B. 2D2D2D次
C. D2D^2D2次
D. 1次
11. 反向传播遍历计算图的顺序是?
A. 拓扑正序(输入→输出)
B. 拓扑逆序(输出→输入)
C. 随机顺序
D. 按变量名排序
12. 关于PyTorch的loss.backward(),正确的是?
A. 更新模型参数
B. 清零梯度
C. 触发反向传播,计算所有参数的.grad
D. 前向传播
13. Forward Mode Autodiff适合什么场景?
A. 神经网络训练
B. f:R→RMf: \mathbb{R} \to \mathbb{R}^Mf:R→RM(少输入多输出)
C. 所有深度学习任务
D. 不需要梯度的场景
14. 表达式膨胀(Expression Swell)是指?
A. 网络层数太多
B. 导数表达式中大量重复子表达式未合并→代码膨胀
C. 数据量太大
D. 参数太多
15. 在计算图中,v3=v1⋅v2v_3 = v_1 \cdot v_2v3=v1⋅v2,已知a3a_3a3,则a1a_1a1等于?
A. a3a_3a3
B. v2⋅a3v_2 \cdot a_3v2⋅a3
C. v1⋅a3v_1 \cdot a_3v1⋅a3
D. a3/v1a_3 / v_1a3/v1
16. 在计算图中,v4=exp(v3)v_4 = \exp(v_3)v4=exp(v3),已知a4a_4a4,则a3a_3a3等于?
A. a4a_4a4
B. exp(v3)⋅a4\exp(v_3) \cdot a_4exp(v3)⋅a4
C. v3⋅a4v_3 \cdot a_4v3⋅a4
D. 1
17. 神经网络中,为什么反向模式比前向模式高效?
A. 反向模式计算更简单
B. NN是f:RD→Rf: \mathbb{R}^D \to \mathbb{R}f:RD→R→反向一次得所有梯度;前向需DDD次
C. 反向模式不需要前向传播
D. 前向模式结果不精确
18. Autodiff中,需要缓存什么以便反向传播使用?
A. 模型参数
B. 前向传播中的中间变量值
C. 最终输出
D. 学习率
19. 关于数值微分的精度,正确的是?
A. 比解析解更精确
B. 近似值,精度取决于ϵ\epsilonϵ选择(太大→近似差;太小→舍入误差)
C. 总是精确的
D. 与Autodiff精度相同
20. 如果viv_ivi在计算图中没有子节点(非输出变量且不被任何后续变量使用),则aia_iai等于?
A. 1
B. 0
C. 未定义
D. −1-1−1
二、判断题(每题2分,共15题,30分。正确打√,错误打×)
21. 数值微分是计算梯度最精确的方法。( )
22. 自动微分=数值微分+符号微分的简单组合。( )
23. Backward Mode Autodiff是深度学习训练的核心技术。( )
24. 伴随变量aia_iai衡量的是fff对viv_ivi的敏感度(偏导数)。( )
25. 计算图中一个变量可以对多个后续变量产生影响。( )
26. 反向传播从输入层向输出层依次计算伴随变量。( )
27. PyTorch的Autograd构建的是静态计算图。( )
28. 反向模式对f:RD→Rf:\mathbb{R}^D\to\mathbb{R}f:RD→R的计算代价约为O(D)\mathcal{O}(D)O(D)。( )
29. 数值微分的ϵ\epsilonϵ越小精度总是越高。( )
30. 表达式膨胀导致符号微分在实际中难以用于大型神经网络。( )
31. 伴随变量的递归公式不需要知道前向传播的中间值。( )
32. 计算图中,子节点(children)指使用viv_ivi作为输入的后继变量。( )
33. 多路径到输出→对应偏导数需要沿所有路径求和(链式法则的多变量推广)。( )
34. 神经网络的反向传播=Autodiff在特定网络结构上的应用。( )
35. loss.backward()执行后,参数的梯度会自动清零。( )
三、简答题(每题5分,共3题,15分)
36. 请对比三种梯度计算方法(数值微分、符号微分、自动微分)的优缺点,并说明为什么自动微分是深度学习的最佳选择。
37. 请解释反向传播(Backward Mode Autodiff)的核心思想:什么是伴随变量?递归公式 ai=∑j∈Chi∂vj∂viaja_i = \sum_{j\in\mathbf{Ch}i} \frac{\partial v_j}{\partial v_i} a_jai=∑j∈Chi∂vi∂vjaj 如何工作?
38. 为什么Backward Mode适合深度学习而Forward Mode不适合?结合f:RD→Rf:\mathbb{R}^D\to\mathbb{R}f:RD→R进行分析。
四、计算题(每题5分,共3题,15分)
39. 已知计算图:v1=x,v2=v12,v3=sin(v2),f=v3v_1=x, v_2=v_1^2, v_3=\sin(v_2), f=v_3v1=x,v2=v12,v3=sin(v2),f=v3,前向计算值:x=1,v1=1,v2=1,v3=sin(1)≈0.841,f=0.841x=1, v_1=1, v_2=1, v_3=\sin(1)\approx0.841, f=0.841x=1,v1=1,v2=1,v3=sin(1)≈0.841,f=0.841。
从fff开始反向计算各伴随变量a3,a2,a1a_3, a_2, a_1a3,a2,a1。
提示:∂v2∂v1=2v1\frac{\partial v_2}{\partial v_1}=2v_1∂v1∂v2=2v1,∂v3∂v2=cos(v2)\frac{\partial v_3}{\partial v_2}=\cos(v_2)∂v2∂v3=cos(v2),∂f∂v3=1\frac{\partial f}{\partial v_3}=1∂v3∂f=1
40. 对于表达式 f(x,y)=x⋅y+sin(x)f(x,y) = x \cdot y + \sin(x)f(x,y)=x⋅y+sin(x):
(1) 画出计算图(分解为基本操作节点)。
(2) 给定x=2,y=3x=2, y=3x=2,y=3,前向计算所有节点值。
(3) 反向计算∂f∂x\frac{\partial f}{\partial x}∂x∂f和∂f∂y\frac{\partial f}{\partial y}∂y∂f。
41. 某神经网络有D=106D=10^6D=106个参数,输出单一损失值。分别估算Forward Mode和Backward Mode Autodiff计算完整梯度所需的时间比例(大致量级)。
试卷结束,请认真检查。
第十四章:Backpropagation --- 单元习题答案
一、单项选择题答案
| 题号 | 答案 | 解析 |
|---|---|---|
| 1 | B | 数值微分需2D2D2D次误差评估→O(ND2)\mathcal{O}(ND^2)O(ND2)→极贵 |
| 2 | B | 符号微分产生大量重复子表达式未合并→代码膨胀 |
| 3 | C | Autodiff仍需计算(但高效);非"不需要计算" |
| 4 | B | Backward Mode=f:RD→Rf:\mathbb{R}^D\to\mathbb{R}f:RD→R→DL专用 |
| 5 | B | NN=百万参数→单一损失→Backward最优 |
| 6 | B | 伴随变量ai=∂f/∂via_i=\partial f/\partial v_iai=∂f/∂vi(f对中间变量的偏导) |
| 7 | B | ai=∑j∈Chi(∂vj/∂vi)⋅aja_i=\sum_{j\in Chi}(\partial v_j/\partial v_i)\cdot a_jai=∑j∈Chi(∂vj/∂vi)⋅aj |
| 8 | C | 链式法则=所有路径求和 |
| 9 | C | afinal=∂f/∂f=1a_{final}=\partial f/\partial f=1afinal=∂f/∂f=1 |
| 10 | B | 中心差分需计算E(w+ϵIi)E(w+\epsilon I_i)E(w+ϵIi)和E(w−ϵIi)E(w-\epsilon I_i)E(w−ϵIi)→2D次 |
| 11 | B | 反向遍历=从输出→输入,拓扑逆序 |
| 12 | C | backward()=触发Autograd→计算.grad |
| 13 | B | Forward=f:R→RMf:\mathbb{R}\to\mathbb{R}^Mf:R→RM;Backward=f:RD→Rf:\mathbb{R}^D\to\mathbb{R}f:RD→R |
| 14 | B | Expression Swell=未共享重复子表达式→膨胀 |
| 15 | B | ∂v3/∂v1=v2\partial v_3/\partial v_1=v_2∂v3/∂v1=v2→a1=v2⋅a3a_1=v_2\cdot a_3a1=v2⋅a3 |
| 16 | B | ∂exp(v3)/∂v3=exp(v3)\partial\exp(v_3)/\partial v_3=\exp(v_3)∂exp(v3)/∂v3=exp(v3)→a3=exp(v3)⋅a4a_3=\exp(v_3)\cdot a_4a3=exp(v3)⋅a4 |
| 17 | B | 反向一次得全部梯度;前向需逐参数→D次 |
| 18 | B | 前向中间值→反向时需要(如∂vj/∂vi\partial v_j/\partial v_i∂vj/∂vi) |
| 19 | B | ϵ\epsilonϵ太小→舍入误差;太大→截断误差→需权衡 |
| 20 | B | 无子节点→不影响f→∂f/∂vi=0\partial f/\partial v_i=0∂f/∂vi=0 |
二、判断题答案
| 题号 | 答案 | 解析 |
|---|---|---|
| 21 | × | 数值微分=近似;Autodiff和符号微分=精确 |
| 22 | × | Autodiff=独立技术(追踪计算图+链式法则),非简单组合 |
| 23 | √ | Backward Mode Autodiff=反向传播=DL核心 |
| 24 | √ | aia_iai=f对viv_ivi的敏感度 |
| 25 | √ | 一个中间变量可流入多个后续变量→多路径 |
| 26 | × | 从输出→输入(反向),非输入→输出 |
| 27 | × | PyTorch=动态计算图(每次forward构建新图) |
| 28 | √ | 反向一次遍历≈前向代价的常数倍=O(D)\mathcal{O}(D)O(D) |
| 29 | × | ϵ\epsilonϵ太小→舍入误差增大→精度反而下降 |
| 30 | √ | 神经网络表达式巨大→符号微分膨胀不可行 |
| 31 | × | ∂vj/∂vi\partial v_j/\partial v_i∂vj/∂vi需要前向中间值 |
| 32 | √ | Children=用viv_ivi作为输入的后继节点 |
| 33 | √ | 多路径=偏导数的全微分=链式法则求和 |
| 34 | √ | BP=Autodiff应用于NN |
| 35 | × | backward()后梯度累加到.grad→需手动zero_grad() |
三、简答题参考答案
36. 三种梯度计算方法对比
参考答案:
| 方法 | 优点 | 缺点 |
|---|---|---|
| 数值微分 | 简单、适用任何函数 | 近似、O(ND2)\mathcal{O}(ND^2)O(ND2)极贵 |
| 符号微分 | 精确 | 表达式膨胀、不自动 |
| 自动微分 | 精确+自动+高效 | 需构建计算图 |
Autodiff是DL最佳选择:精确(机器精度)+自动(追踪计算图)+高效(Backward Mode一次遍历得所有梯度)。
37. 反向传播核心
参考答案:
伴随变量 :ai=∂f∂via_i = \frac{\partial f}{\partial v_i}ai=∂vi∂f,衡量最终输出对中间变量viv_ivi的敏感度。
递归公式 :ai=∑j∈Chi∂vj∂vi⋅aja_i = \sum_{j\in\mathbf{Ch}i} \frac{\partial v_j}{\partial v_i} \cdot a_jai=∑j∈Chi∂vi∂vj⋅aj
工作流程:
- afinal=1a_{final}=1afinal=1(∂f/∂f=1\partial f/\partial f=1∂f/∂f=1)
- 按拓扑逆序对每个节点:收集所有子节点的贡献→乘以局部偏导→累加
- ∂vj∂vi\frac{\partial v_j}{\partial v_i}∂vi∂vj:前向计算中viv_ivi对vjv_jvj的直接影响(局部偏导)
- aja_jaj:从vjv_jvj到输出的累积敏感度(已算好)
38. Backward vs Forward
参考答案:
NN=w∈RD\mathbf{w}\in\mathbb{R}^Dw∈RD(D=106D=10^6D=106)→L∈RL\in\mathbb{R}L∈R(1维损失)。
- Forward Mode :每次计算∂L/∂wi\partial L/\partial w_i∂L/∂wi需一次完整正向遍历→O(D)\mathcal{O}(D)O(D)次遍历
- Backward Mode :一次反向遍历计算所有 {∂L/∂wi}\{\partial L/\partial w_i\}{∂L/∂wi}→O(1)\mathcal{O}(1)O(1)次遍历
→Backward比Forward快约**DDD倍**(百万倍!)。这就是为什么所有DL框架都用Backward Mode。
四、计算题参考答案
39. 简单反向传播
a3=∂f∂v3=1a_3 = \frac{\partial f}{\partial v_3} = \mathbf{1}a3=∂v3∂f=1
a2=∂v3∂v2⋅a3=cos(v2)⋅1=cos(1)≈0.540a_2 = \frac{\partial v_3}{\partial v_2} \cdot a_3 = \cos(v_2) \cdot 1 = \cos(1) \approx \mathbf{0.540}a2=∂v2∂v3⋅a3=cos(v2)⋅1=cos(1)≈0.540
a1=∂v2∂v1⋅a2=2v1⋅0.540=2(1)(0.540)=1.080a_1 = \frac{\partial v_2}{\partial v_1} \cdot a_2 = 2v_1 \cdot 0.540 = 2(1)(0.540) = \mathbf{1.080}a1=∂v1∂v2⋅a2=2v1⋅0.540=2(1)(0.540)=1.080
∂f∂x=a1=1.080\frac{\partial f}{\partial x} = a_1 = \mathbf{1.080}∂x∂f=a1=1.080
40. f(x,y)=xy+sin(x)
(1) 计算图
v1 = x v4 = v2 * v3 (= x*y)
v2 = y v5 = sin(v1) (= sin(x))
v3 = x v6 = v4 + v5 (= f)
(2) 前向计算 (x=2,y=3x=2, y=3x=2,y=3)
v1=2,v2=3,v3=2v_1=2, v_2=3, v_3=2v1=2,v2=3,v3=2 | v4=2×3=6v_4=2\times3=6v4=2×3=6 | v5=sin(2)≈0.909v_5=\sin(2)\approx0.909v5=sin(2)≈0.909 | f=6+0.909=6.909f=6+0.909=6.909f=6+0.909=6.909
(3) 反向计算
a6=1a_6=1a6=1
a5=∂v6∂v5a6=1⋅1=1a_5 = \frac{\partial v_6}{\partial v_5}a_6 = 1\cdot1 = 1a5=∂v5∂v6a6=1⋅1=1
a4=∂v6∂v4a6=1⋅1=1a_4 = \frac{\partial v_6}{\partial v_4}a_6 = 1\cdot1 = 1a4=∂v4∂v6a6=1⋅1=1
a3=∂v4∂v3a4=v2⋅1=3a_3 = \frac{\partial v_4}{\partial v_3}a_4 = v_2\cdot1 = 3a3=∂v3∂v4a4=v2⋅1=3
a2=∂v4∂v2a4=v3⋅1=2a_2 = \frac{\partial v_4}{\partial v_2}a_4 = v_3\cdot1 = 2a2=∂v2∂v4a4=v3⋅1=2
a1=∂v4∂v1a4+∂v5∂v1a5=v2⋅1+cos(v1)⋅1=3+cos(2)a_1 = \frac{\partial v_4}{\partial v_1}a_4 + \frac{\partial v_5}{\partial v_1}a_5 = v_2\cdot1 + \cos(v_1)\cdot1 = 3 + \cos(2)a1=∂v1∂v4a4+∂v1∂v5a5=v2⋅1+cos(v1)⋅1=3+cos(2)
≈3+(−0.416)=2.584\approx 3 + (-0.416) = 2.584≈3+(−0.416)=2.584
∂f/∂x=a1+a3=2.584+3=5.584\partial f/\partial x = a_1 + a_3 = 2.584 + 3 = 5.584∂f/∂x=a1+a3=2.584+3=5.584(v1v_1v1和v3v_3v3都来自x→需加总)
或者统一:∂f/∂x=y+cos(x)=3+cos(2)≈2.584\partial f/\partial x = y + \cos(x) = 3 + \cos(2) \approx 2.584∂f/∂x=y+cos(x)=3+cos(2)≈2.584
∂f/∂y=a2=2\partial f/\partial y = a_2 = 2∂f/∂y=a2=2(或∂f/∂y=x=2\partial f/\partial y = x = 2∂f/∂y=x=2)
41. Forward vs Backward时间比例
- Forward Mode :D=106D=10^6D=106次遍历,每次≈前向代价→总≈106×10^6\times106×前向
- Backward Mode :1次反向遍历,≈2-3倍前向代价→总≈3×3\times3×前向
时间比例 :Backward:Forward ≈ 3:1063 : 10^63:106,即Forward比Backward慢约30万倍。
答案编制完成时间:2026年6月29日