欢迎来到本系列的第七篇文章。在上一章,我们用张量武装了我们的线性代数知识,学会了如何描述和操作神经网络中的高维数据流。我们知道,一个神经网络的“前向传播”过程,就是输入张量经过一系列复杂的张量运算(矩阵乘法、卷积、激活函数等),最终计算出预测值,并与真实值比较得到一个标量损失(Loss)。
我们的目标,是调整网络中海量的参数(权重和偏置,它们本身也是张量),来让这个损失值最小。微积分告诉我们,实现这个目标的最佳路径是梯度下降——计算损失对每个参数的梯度,然后让参数沿着梯度的反方向更新一小步。
问题来了:如何计算这个梯度? 对于一个深达百层、参数过亿的庞然大物,损失函数 L L L 与某个深层参数 w w w 之间的函数关系链条极其漫长和复杂。手动求导已然是天方夜谭。那么,计算机是如何高效且精确地完成这项艰巨任务的呢?
答案并非某种神秘的黑魔法,而是我们早已熟知的链式法则的一种极其聪明的、工程化的实现。这个实现就是反向传播算法,其核心是一种名为自动微分的计算技术。今天,我们将一起揭开这个引擎盖,探究深度学习的心脏是如何跳动的。
第一部分:计算的蓝图 —— 计算图
要理解自动微分,我们首先需要引入一个至关重要的抽象工具——计算图 (Computational Graph)。
任何用计算机执行的数学表达式,无论多么复杂,都可以被分解为一系列基本运算的组合。计算图就是这种分解过程的可视化表示。它是一个有向无环图 (Directed Acyclic Graph, DAG),其中:
- 节点 (Nodes) 代表运算(如加、乘、指数、卷积等)或变量(输入数据、参数、常量)。
- 边 (Edges) 代表数据流(通常是张量),表示一个节点的输出是另一个节点的输入。
让我们从一个极其简单的例子开始。假设我们有这样一个函数: L = ( a ⋅ w + b − y t r u e ) 2 L = (a \cdot w + b - y_{true})^2 L=(a⋅w+b−ytrue)2。这可以看作一个最简单的线性回归模型在一个样本上的平方误差损失。
我们可以将它的计算过程分解并绘制成一个计算图:
在这个图中,w
, a
, b
, y_true
是输入变量(叶子节点),而×
, +
, -
, ²
是运算节点,L
是最终的输出节点。数据从左到右流动,这个过程就是前向传播 (Forward Pass)。
一个完整的神经网络,无论其结构多复杂(CNN, RNN, Transformer),其前向传播过程都可以被表示成一个巨大无比的计算图。这个图,就是我们进行梯度计算的“蓝图”。
第二部分:梯度计算的“三体”问题 —— 符号、数值与自动微分
在拥有计算图这个蓝图后,我们如何求解梯度,例如 ∂ L ∂ w \frac{\partial L}{\partial w} ∂w∂L?学术界主要有三种方法:
手动/符号微分 (Symbolic Differentiation)
这是我们高中和大学时学习的方法。使用一系列代数规则(如乘法法则、链式法则)来推导出一个梯度的数学表达式。例如,对于上面的例子,我们可以推导出 ∂ L ∂ w = 2 ( a w + b − y t r u e ) ⋅ a \frac{\partial L}{\partial w} = 2(aw+b-y_{true}) \cdot a ∂w∂L=2(aw+b−ytrue)⋅a。- 优点:得到的是精确的解析解。
- 缺点:表达式膨胀 (Expression Swell)。对于深度神经网络,最终的梯度表达式会变得异常庞大和复杂,生成和计算这个表达式本身的成本就高得无法接受。
数值微分 (Numerical Differentiation)
这种方法利用导数的定义: f ′ ( x ) = lim h → 0 f ( x + h ) − f ( x ) h f'(x) = \lim_{h \to 0} \frac{f(x+h) - f(x)}{h} f′(x)=limh→0hf(x+h)−f(x)。我们可以用一个很小的 h h h (例如 1 0 − 5 10^{-5} 10−5) 来近似计算梯度。要计算 ∂ L ∂ w \frac{\partial L}{\partial w} ∂w∂L,我们只需计算 L ( w + h ) L(w+h) L(w+h) 和 L ( w ) L(w) L(w),然后用差值除以 h h h。- 优点:实现简单,可以用来检验其他方法的正确性。
- 缺点:近似而非精确,存在截断误差和舍入误差;计算量巨大,为了计算梯度,对于网络中的每一个参数,我们都需要重新进行一次完整的前向传播,如果网络有N个参数,就需要N+1次前向传播,这对于动辄上亿参数的模型是毁灭性的。
自动微分 (Automatic Differentiation, AD)
这是一种介于符号微分和数值微分之间的“黄金方法”。它不像符号微分那样在计算前生成一个巨大的表达式,也不像数值微分那样进行近似计算。AD的核心思想是:在执行前向传播计算数值的同时,利用链式法则,精确地计算并记录下每一步的局部梯度信息。
自动微分有两种主要模式:前向模式 (Forward Mode) 和反向模式 (Reverse Mode)。
- 前向模式AD:它从输入到输出,计算一个输出相对于所有输入的导数。它在每次前向传播中,计算出某个节点的值的同时,也计算出这个节点的值相对于某个特定输入变量的导数。要得到损失L对所有N个参数的梯度,需要进行N次这样的前向传播。
- 反向模式AD:它从输出到输入,计算所有输入相对于一个输出的导数。这正是深度学习所需要的!我们的目标是计算一个标量输出(损失L)相对于所有N个参数的梯度。反向模式AD只需要一次前向传播(计算所有节点的值)和一次反向传播(计算所有梯度),就能得到所有参数的梯度。
由于其无与伦比的效率,反向模式自动微分成为了驱动深度学习训练的唯一选择。而反向传播算法,正是反向模式自动微分在神经网络领域的具体应用和命名。
反向模式自动微分:一场优雅的梯度之旅
让我们回到之前的计算图,用反向模式AD来手动计算 ∂ L ∂ w \frac{\partial L}{\partial w} ∂w∂L。这个过程分为两步:
Step 1: 前向传播 (Forward Pass)
假设输入值为 a = 2 , w = 3 , b = 4 , y t r u e = 11 a=2, w=3, b=4, y_{true}=11 a=2,w=3,b=4,ytrue=11。我们计算并记录每个节点的值。
mul
= a × w = 2 × 3 = 6 a \times w = 2 \times 3 = 6 a×w=2×3=6add
=mul
+ b = 6 + 4 = 10 b = 6 + 4 = 10 b=6+4=10sub
=add
- y t r u e = 10 − 11 = − 1 y_{true} = 10 - 11 = -1 ytrue=10−11=−1L
=sub
2 = ( − 1 ) 2 = 1 ^2 = (-1)^2 = 1 2=(−1)2=1
Step 2: 反向传播 (Backward Pass)
现在,我们从最终的输出 L L L 开始,沿着计算图反向传播梯度。梯度在这里的含义是“损失L对某个节点的偏导数”。
起点:损失对自身的梯度永远是1。即 ∂ L ∂ L = 1 \frac{\partial L}{\partial L} = 1 ∂L∂L=1。这是我们反向传播的初始梯度值。
从 L 到 pow:我们现在站在
pow
节点,收到了来自下游(这里是L)的梯度 ∂ L ∂ L = 1 \frac{\partial L}{\partial L}=1 ∂L∂L=1。我们需要计算损失L对pow
节点的输入sub
的梯度,即 ∂ L ∂ s u b \frac{\partial L}{\partial sub} ∂sub∂L。
根据链式法则: ∂ L ∂ s u b = ∂ L ∂ p o w ⋅ ∂ p o w ∂ s u b \frac{\partial L}{\partial sub} = \frac{\partial L}{\partial pow} \cdot \frac{\partial pow}{\partial sub} ∂sub∂L=∂pow∂L⋅∂sub∂pow。- ∂ L ∂ p o w \frac{\partial L}{\partial pow} ∂pow∂L 就是从下游传来的梯度,这里就是 ∂ L ∂ L = 1 \frac{\partial L}{\partial L}=1 ∂L∂L=1。
- ∂ p o w ∂ s u b \frac{\partial pow}{\partial sub} ∂sub∂pow 是
pow
节点的局部梯度。pow
的运算是 x 2 x^2 x2,其导数是 2 x 2x 2x。在前向传播时,sub
的值是-1,所以这里的局部梯度是 2 × ( − 1 ) = − 2 2 \times (-1) = -2 2×(−1)=−2。 - 因此, ∂ L ∂ s u b = 1 × ( − 2 ) = − 2 \frac{\partial L}{\partial sub} = 1 \times (-2) = -2 ∂sub∂L=1×(−2)=−2。我们将这个梯度值-2传递给
sub
节点。
从 pow 到 sub:
sub
节点收到了来自下游的梯度 ∂ L ∂ s u b = − 2 \frac{\partial L}{\partial sub}=-2 ∂sub∂L=−2。sub
的运算是add
-y_true
。我们需要计算损失L对sub
的两个输入add
和y_true
的梯度。- ∂ L ∂ a d d = ∂ L ∂ s u b ⋅ ∂ s u b ∂ a d d = ( − 2 ) ⋅ 1 = − 2 \frac{\partial L}{\partial add} = \frac{\partial L}{\partial sub} \cdot \frac{\partial sub}{\partial add} = (-2) \cdot 1 = -2 ∂add∂L=∂sub∂L⋅∂add∂sub=(−2)⋅1=−2。(因为
sub
对add
的局部梯度是1) - ∂ L ∂ y t r u e = ∂ L ∂ s u b ⋅ ∂ s u b ∂ y t r u e = ( − 2 ) ⋅ ( − 1 ) = 2 \frac{\partial L}{\partial y_{true}} = \frac{\partial L}{\partial sub} \cdot \frac{\partial sub}{\partial y_{true}} = (-2) \cdot (-1) = 2 ∂ytrue∂L=∂sub∂L⋅∂ytrue∂sub=(−2)⋅(−1)=2。(因为
sub
对y_true
的局部梯度是-1)
我们将梯度-2传递给add
节点,梯度2传递给y_true
节点。
- ∂ L ∂ a d d = ∂ L ∂ s u b ⋅ ∂ s u b ∂ a d d = ( − 2 ) ⋅ 1 = − 2 \frac{\partial L}{\partial add} = \frac{\partial L}{\partial sub} \cdot \frac{\partial sub}{\partial add} = (-2) \cdot 1 = -2 ∂add∂L=∂sub∂L⋅∂add∂sub=(−2)⋅1=−2。(因为
从 sub 到 add:
add
节点收到了梯度 ∂ L ∂ a d d = − 2 \frac{\partial L}{\partial add}=-2 ∂add∂L=−2。add
的运算是mul
+b
。- ∂ L ∂ m u l = ∂ L ∂ a d d ⋅ ∂ a d d ∂ m u l = ( − 2 ) ⋅ 1 = − 2 \frac{\partial L}{\partial mul} = \frac{\partial L}{\partial add} \cdot \frac{\partial add}{\partial mul} = (-2) \cdot 1 = -2 ∂mul∂L=∂add∂L⋅∂mul∂add=(−2)⋅1=−2。
- ∂ L ∂ b = ∂ L ∂ a d d ⋅ ∂ a d d ∂ b = ( − 2 ) ⋅ 1 = − 2 \frac{\partial L}{\partial b} = \frac{\partial L}{\partial add} \cdot \frac{\partial add}{\partial b} = (-2) \cdot 1 = -2 ∂b∂L=∂add∂L⋅∂b∂add=(−2)⋅1=−2。
我们将梯度-2传递给mul
节点,梯度-2传递给b
节点。
从 add 到 mul:
mul
节点收到了梯度 ∂ L ∂ m u l = − 2 \frac{\partial L}{\partial mul}=-2 ∂mul∂L=−2。mul
的运算是 a × w a \times w a×w。- ∂ L ∂ a = ∂ L ∂ m u l ⋅ ∂ m u l ∂ a = ( − 2 ) ⋅ w = ( − 2 ) ⋅ 3 = − 6 \frac{\partial L}{\partial a} = \frac{\partial L}{\partial mul} \cdot \frac{\partial mul}{\partial a} = (-2) \cdot w = (-2) \cdot 3 = -6 ∂a∂L=∂mul∂L⋅∂a∂mul=(−2)⋅w=(−2)⋅3=−6。(局部梯度是另一个输入 w w w)
- ∂ L ∂ w = ∂ L ∂ m u l ⋅ ∂ m u l ∂ w = ( − 2 ) ⋅ a = ( − 2 ) ⋅ 2 = − 4 \frac{\partial L}{\partial w} = \frac{\partial L}{\partial mul} \cdot \frac{\partial mul}{\partial w} = (-2) \cdot a = (-2) \cdot 2 = -4 ∂w∂L=∂mul∂L⋅∂w∂mul=(−2)⋅a=(−2)⋅2=−4。(局部梯度是另一个输入 a a a)
至此,我们已经完成了整个反向传播。我们得到了损失L对所有叶子节点的梯度: ∂ L ∂ a = − 6 \frac{\partial L}{\partial a}=-6 ∂a∂L=−6, ∂ L ∂ w = − 4 \frac{\partial L}{\partial w}=-4 ∂w∂L=−4, ∂ L ∂ b = − 2 \frac{\partial L}{\partial b}=-2 ∂b∂L=−2, ∂ L ∂ y t r u e = 2 \frac{\partial L}{\partial y_{true}}=2 ∂ytrue∂L=2。
我们来验证一下手动求导的结果: ∂ L ∂ w = 2 ( a w + b − y t r u e ) ⋅ a = 2 ( 2 ⋅ 3 + 4 − 11 ) ⋅ 2 = 2 ( − 1 ) ⋅ 2 = − 4 \frac{\partial L}{\partial w} = 2(aw+b-y_{true}) \cdot a = 2(2 \cdot 3 + 4 - 11) \cdot 2 = 2(-1) \cdot 2 = -4 ∂w∂L=2(aw+b−ytrue)⋅a=2(2⋅3+4−11)⋅2=2(−1)⋅2=−4。完全一致!
这个过程揭示了反向模式AD的精髓:
- 一次前向传播:计算并缓存所有中间变量的值。
- 一次反向传播:从后向前,利用链式法则和缓存的中间值,逐节点计算梯度。
- 局部性:每个节点在计算梯度时,只需要关心自己的运算类型(局部梯度)和从下游传来的梯度值,无需知道整个网络的结构。这使得该算法高度模块化和可扩展。
第三部分:反向传播 —— 神经网络的梯度交响乐
现在,我们可以正式给出结论:反向传播 (Backpropagation, BP) 算法,就是反向模式自动微分在神经网络上的应用。它不是一个与AD并列的概念,而是AD在特定领域(神经网络)的“艺名”。
在神经网络的语境下,计算图的节点不再是简单的+
或×
,而是整个层 (Layer),如全连接层、卷积层、激活函数层等。
层的视角:局部梯度与全局梯度
反向传播的美妙之处在于其优雅的“责任分工”。每一层都像一个独立的模块,它只需要做好两件事:
- 实现自己的前向传播逻辑:接收输入张量,根据自己的参数和运算规则,计算并输出张量。
- 实现自己的反向传播逻辑:接收来自下游(更靠近损失函数的那一侧)的、关于其输出的梯度(我们称之为全局梯度 ∂ L ∂ out \frac{\partial L}{\partial \text{out}} ∂out∂L),然后计算:
- 损失L关于其输入的梯度( ∂ L ∂ in = ∂ L ∂ out ⋅ ∂ out ∂ in \frac{\partial L}{\partial \text{in}} = \frac{\partial L}{\partial \text{out}} \cdot \frac{\partial \text{out}}{\partial \text{in}} ∂in∂L=∂out∂L⋅∂in∂out),并将其传递给上游。
- 损失L关于其内部参数(如权重W、偏置b)的梯度( ∂ L ∂ W = ∂ L ∂ out ⋅ ∂ out ∂ W \frac{\partial L}{\partial W} = \frac{\partial L}{\partial \text{out}} \cdot \frac{\partial \text{out}}{\partial W} ∂W∂L=∂out∂L⋅∂W∂out),并将其存储起来,用于后续的参数更新。
这里的 ∂ out ∂ in \frac{\partial \text{out}}{\partial \text{in}} ∂in∂out 和 ∂ out ∂ W \frac{\partial \text{out}}{\partial W} ∂W∂out 就是该层的局部梯度。
以一个全连接层为例,其前向传播为 out = in ⋅ W + b \text{out} = \text{in} \cdot W + b out=in⋅W+b。
其局部梯度(雅可比矩阵)为:
- ∂ out ∂ in = W T \frac{\partial \text{out}}{\partial \text{in}} = W^T ∂in∂out=WT
- ∂ out ∂ W = in T \frac{\partial \text{out}}{\partial W} = \text{in}^T ∂W∂out=inT
- ∂ out ∂ b = 1 \frac{\partial \text{out}}{\partial b} = 1 ∂b∂out=1
当反向传播发生时,该层接收到梯度 ∂ L ∂ out \frac{\partial L}{\partial \text{out}} ∂out∂L,它就会执行以下计算:
- 传递给上一层的梯度: ∂ L ∂ in = ∂ L ∂ out ⋅ W T \frac{\partial L}{\partial \text{in}} = \frac{\partial L}{\partial \text{out}} \cdot W^T ∂in∂L=∂out∂L⋅WT
- 需要更新的权重梯度: ∂ L ∂ W = in T ⋅ ∂ L ∂ out \frac{\partial L}{\partial W} = \text{in}^T \cdot \frac{\partial L}{\partial \text{out}} ∂W∂L=inT⋅∂out∂L
- 需要更新的偏置梯度: ∂ L ∂ b = ∑ ∂ L ∂ out \frac{\partial L}{\partial b} = \sum \frac{\partial L}{\partial \text{out}} ∂b∂L=∑∂out∂L (对batch维度求和)
这个时序图生动地描绘了神经网络中梯度流动的“交响乐”。前向传播构建了计算图并计算了所有值,而反向传播(由loss.backward()
触发)则像一个指挥家,从乐曲的末尾(Loss)开始,将梯度的“指令”逐层向后传递。每一层在收到指令后,演奏好自己的部分(计算参数梯度),并将指令传递给前一层,直到整个乐团(网络)的所有成员(参数)都得到了自己的梯度。
深度学习框架的角色
PyTorch、TensorFlow等现代深度学习框架,将这个过程自动化到了极致。作为开发者,我们只需要:
- 用框架提供的层和操作来定义网络结构(即动态或静态地定义计算图)。
- 执行前向传播,得到损失。
- 调用一个简单的命令,如
loss.backward()
。
框架在背后会自动完成:
- 在前向传播时,构建出完整的计算图,并缓存所有中间变量的值。
- 在调用
backward()
时,从损失节点开始,完美地执行反向模式自动微分,计算出损失对每一个参数(定义时被标记为requires_grad=True
的张量)的梯度。 - 将计算出的梯度值,存储在每个参数张量的
.grad
属性中。
之后,我们就可以将这些梯度交给优化器(如SGD, Adam),由优化器来执行参数更新的步骤:parameter = parameter - learning_rate * parameter.grad
。
融会贯通:微积分的深度进化
今天,我们完成了对微积分的深度学习“升级”。我们看到,驱动整个AI训练过程的,并非某种全新的数学理论,而是我们早已熟知的链式法则,被以一种极其高效和工程化的方式重新组织和实现。
- 计算图:将复杂的计算过程分解为模块化的“蓝图”,是自动微分得以实施的基础。
- 自动微分 (AD):特别是反向模式AD,提供了一种在计算效率和精度上都远超符号微分和数值微分的方法,是计算海量参数梯度的不二之选。
- 反向传播 (Backpropagation):就是反向模式AD在神经网络上的应用。它通过“局部计算,全局传播”的模式,优雅地解决了深层网络中的梯度计算难题。
反向传播算法的出现,才真正让“深度”学习成为可能。没有它,我们可能还停留在只有几层参数的浅层模型时代。它与梯度下降的关系是:反向传播负责高效地“算”出梯度,梯度下降负责使用这个梯度去“更新”参数。一个主内(计算),一个主外(优化)。
掌握了张量和自动微分,我们就掌握了深度学习模型的“表示”与“学习”两大核心。接下来,我们将继续深入,探讨在实际训练中会遇到的各种问题,比如梯度消失/爆炸,以及如何通过更先进的优化算法(如Adam)来应对这些挑战。这将是我们对“优化理论”的深度学习升级。
习题
第1题:手动反向传播
考虑一个简单的函数 y = ReLU ( w x + b ) y = \text{ReLU}(wx+b) y=ReLU(wx+b),其中ReLU函数定义为 ReLU ( z ) = max ( 0 , z ) \text{ReLU}(z) = \max(0, z) ReLU(z)=max(0,z)。假设输入 x = 2 x=2 x=2, 参数 w = 3 , b = − 7 w=3, b=-7 w=3,b=−7。
A. 请执行前向传播,计算出 y y y 的值。
B. 假设下游传来的梯度 ∂ L ∂ y = 5 \frac{\partial L}{\partial y} = 5 ∂y∂L=5。请执行反向传播,计算出损失L对参数 w w w 和 b b b 的梯度,即 ∂ L ∂ w \frac{\partial L}{\partial w} ∂w∂L 和 ∂ L ∂ b \frac{\partial L}{\partial b} ∂b∂L。
第2题:概念辨析
请用自己的话解释反向传播 (Backpropagation) 和梯度下降 (Gradient Descent) 的区别与联系。为什么说“反向传播是为梯度下降服务的”?
第3题:计算图与梯度
在一个深度神经网络中,如果某个参数 w w w 通过多条路径影响了最终的损失 L L L(例如,一个参数在循环神经网络中被多次使用),那么在使用反向传播计算 ∂ L ∂ w \frac{\partial L}{\partial w} ∂w∂L 时,会发生什么?
A. 只会计算其中一条路径的梯度。
B. 会分别计算每条路径的梯度,并取最大值。
C. 会分别计算每条路径的梯度,并将它们相加。
D. 会报错,因为梯度路径不唯一。
答案
第1. 答案:
A. 前向传播:
- 计算线性部分: z = w x + b = 3 × 2 + ( − 7 ) = 6 − 7 = − 1 z = wx + b = 3 \times 2 + (-7) = 6 - 7 = -1 z=wx+b=3×2+(−7)=6−7=−1。
- 应用ReLU激活函数: y = ReLU ( z ) = ReLU ( − 1 ) = max ( 0 , − 1 ) = 0 y = \text{ReLU}(z) = \text{ReLU}(-1) = \max(0, -1) = 0 y=ReLU(z)=ReLU(−1)=max(0,−1)=0。
所以, y = 0 y=0 y=0。
B. 反向传播:
计算 ∂ L ∂ z \frac{\partial L}{\partial z} ∂z∂L:
∂ L ∂ z = ∂ L ∂ y ⋅ ∂ y ∂ z \frac{\partial L}{\partial z} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial z} ∂z∂L=∂y∂L⋅∂z∂y。
我们已知 ∂ L ∂ y = 5 \frac{\partial L}{\partial y} = 5 ∂y∂L=5。
ReLU函数的局部梯度 ∂ y ∂ z \frac{\partial y}{\partial z} ∂z∂y 是:如果 z > 0 z>0 z>0,导数为1;如果 z < 0 z<0 z<0,导数为0。
在前向传播中,我们计算出 z = − 1 z=-1 z=−1,所以 ∂ y ∂ z = 0 \frac{\partial y}{\partial z} = 0 ∂z∂y=0。
因此, ∂ L ∂ z = 5 × 0 = 0 \frac{\partial L}{\partial z} = 5 \times 0 = 0 ∂z∂L=5×0=0。计算 ∂ L ∂ w \frac{\partial L}{\partial w} ∂w∂L 和 ∂ L ∂ b \frac{\partial L}{\partial b} ∂b∂L:
∂ L ∂ w = ∂ L ∂ z ⋅ ∂ z ∂ w = 0 ⋅ x = 0 ⋅ 2 = 0 \frac{\partial L}{\partial w} = \frac{\partial L}{\partial z} \cdot \frac{\partial z}{\partial w} = 0 \cdot x = 0 \cdot 2 = 0 ∂w∂L=∂z∂L⋅∂w∂z=0⋅x=0⋅2=0。
∂ L ∂ b = ∂ L ∂ z ⋅ ∂ z ∂ b = 0 ⋅ 1 = 0 \frac{\partial L}{\partial b} = \frac{\partial L}{\partial z} \cdot \frac{\partial z}{\partial b} = 0 \cdot 1 = 0 ∂b∂L=∂z∂L⋅∂b∂z=0⋅1=0。
所以, ∂ L ∂ w = 0 \frac{\partial L}{\partial w} = 0 ∂w∂L=0 且 ∂ L ∂ b = 0 \frac{\partial L}{\partial b} = 0 ∂b∂L=0。这个结果是符合逻辑的,因为输入的 z = − 1 z=-1 z=−1 导致ReLU函数输出为0,使得 w w w 和 b b b 的微小变化无法影响到输出 y y y(在 z z z 保持小于0的情况下),因此它们对最终损失的梯度贡献也为0。这种情况被称为“神经元死亡”。
第2. 答案:
区别:
- 梯度下降 (Gradient Descent) 是一种优化算法。它的作用是如何使用梯度来更新模型的参数,以最小化损失函数。其核心思想是
参数 = 参数 - 学习率 * 梯度
。它只关心“拿到梯度后该怎么走”,不关心“梯度是怎么来的”。 - 反向传播 (Backpropagation) 是一种梯度计算算法。它的作用是如何高效地计算损失函数对网络中所有参数的梯度。它是一个应用了链式法则的、系统性的过程。它只负责“算出梯度”,不关心“梯度算出来以后要干嘛”。
- 梯度下降 (Gradient Descent) 是一种优化算法。它的作用是如何使用梯度来更新模型的参数,以最小化损失函数。其核心思想是
联系:
它们是模型训练中紧密协作的两个环节。反向传播是梯度下降的“供应商”。在每次训练迭代中,模型首先通过反向传播计算出所有参数的梯度,然后将这些梯度交给梯度下降(或其变种如Adam)算法,由优化算法来完成参数的更新。因此,“反向传播是为梯度下降服务的”这句话是完全正确的,它为优化算法提供了最关键的输入——方向(梯度)。
第3. 答案:C
会分别计算每条路径的梯度,并将它们相加。
这是多元链式法则的直接体现,也是自动微分和反向传播算法正确处理计算图的内在要求。在计算图中,如果一个节点(参数 w w w)的输出流向了多个后续节点,那么在反向传播时,它会从所有这些后续节点分别接收到梯度。该节点(参数 w w w)的总梯度,是所有从不同路径传回来的梯度的总和。这确保了该参数对最终损失的全部影响都被正确地计算在内。