在前面的课程中,您看到神经网络具有权重,并且训练会调整这些权重。但是网络“如何”知道要改变哪些权重以及改变多少?答案是反向传播——现代深度学习中最重要的算法。
安德烈·卡帕蒂 (Andrej Karpathy) 称其为“了解神经网络最重要的事情”。让我们看看为什么。
在前向传递期间,数据从左到右通过网络流动:
然后使用损失函数(在下一课中介绍)将预测与真实答案进行比较。损失是一个数字,表示:“这就是你的错误。”
想象一下你烤了一个蛋糕,味道很糟糕。你用了五种成分。问题是:哪种成分对不良味道影响最大,影响程度有多大?
反向传播正好回答了神经网络的这个问题。它通过询问“如果我稍微推动这个权重,损失会改变多少?”来将责备分配给每个权重。
这种变化率称为梯度,它来自微积分 - 具体来说,导数。
“人工智能教父”之一杰弗里·辛顿 (Geoffrey Hinton) 表示,反向传播是使深度学习变得实用的关键思想。如果没有它,训练具有数百万个参数的网络在计算上将是不可能的。
神经网络是由一系列简单操作组成的链。微积分中的链式法则告诉我们如何区分组合函数:
如果
y = f(g(x)),则dy/dx = f'(g(x)) × g'(x)。
日常类比: 你开车去一家商店。你的速度取决于你踩油门的力度。油门位置取决于交通状况。要了解交通状况如何影响您的速度,您可以乘以:(每次按下油门的速度) × (根据交通状况按下油门)。这就是链式法则——沿链乘局部变化率。
反向传播在 Rumelhart、Hinton 和 Williams 1986 年发表的具有里程碑意义的论文中得到普及,但反向模式自动微分的核心思想可以追溯到 20 世纪 60 年代。
像 PyTorch 这样的现代框架在前向传播过程中构建了一个计算图。每个操作 - 加法、乘法、ReLU - 都会成为一个节点。然后反向传播反向遍历该图,在每个节点应用链式法则来计算梯度。
把它想象成一个河流系统。损失就是最后的海洋。反向传播追踪上游的每个支流,以找出每个源(权重)对最终流量的贡献程度。
假设 L = (w × x - y)² 与 w = 2、x = 3、y = 10。
w × x = 6,然后6 - 10 = -4,然后(-4)² = 16。损失=16。dL/d(diff) = 2 × (-4) = -8,然后d(diff)/d(wx) = 1,所以dL/d(wx) = -8。d(wx)/dw = x = 3,所以**dL/dw = -8 × 3 = -24**。−24 的梯度告诉我们:*增加 w 将迅速减少损失。*这正是我们需要改进的信号。
在链式法则中,我们如何处理每个节点的局部导数?
在深层网络中,梯度必须穿过许多层。每层将梯度乘以其局部导数。这会产生两种危险的故障模式:
如果局部导数很小(例如 sigmoid 函数在 0 或 1 附近饱和),则重复相乘会使梯度收缩到零。早期层几乎没有学习——它们几乎没有接收到信号。这困扰着早期的深度网络。
如果局部导数很大,梯度会呈指数增长。权重收到巨大的更新,网络变得不稳定,产生 NaN 值。
ReLU 的导数为 0 或 1 - 它在激活时绝不会收缩梯度。为什么这个简单的属性对于训练深度网络来说可能是革命性的?
现代解决方案包括:
一旦反向传播计算出每个梯度,优化器(下一课)就会更新每个权重:
w_new = w_old - learning_rate × gradient
学习率控制步长。太大就会超调;太小了,训练需要很长时间。梯度告诉你方向;学习率告诉你要走多远。
是什么导致深度网络中梯度消失?
每当 ChatGPT 改进其下一个单词预测时,每次自动驾驶汽车改进其转向时,反向传播都会在下面运行。正是这种算法使得从错误中学习在数学上变得精确。
如果没有反向传播,我们就没有有效的方法来训练具有数百万或数十亿参数的网络。
关于权重,梯度告诉我们什么?
Karpathy 强调反向传播“只是链式法则的递归应用”。如果您了解链式法则和计算图,您就了解了反向传播。还有哪些复杂的系统可以通过将其分解为简单的、可组合的部分来理解?
登录 参与讨论