训练神经网络涉及迭代调整其权重和偏置,以最小化损失函数。如前所述,这种最小化通常通过优化算法实现,例如梯度下降,这些算法依赖于了解损失函数相对于网络参数的梯度。在可能多层的网络中高效计算这些梯度是反向传播算法的工作。每次训练迭代的核心是两个不同的阶段:前向传播和反向传播。理解这两个阶段是掌握网络如何学习的根本。前向传播:生成预测并计算损失前向传播是将输入数据送入网络以生成输出预测的过程。它本质上是网络执行其主要功能:根据输入进行推断。输入传播: 当一批输入数据 $X$ 呈现给输入层时,此过程开始。逐层计算: 数据按顺序流经网络的各层(输入层、隐藏层、输出层)。在每一层 $l$,通常会发生以下情况:计算线性组合:$$ z^{[l]} = W^{[l]} a^{[l-1]} + b^{[l]} $$ 其中 $a^{[l-1]}$ 是来自前一层的激活值(对于第一个隐藏层,则是输入 $X$),$W^{[l]}$ 是权重,$b^{[l]}$ 是当前层 $l$ 的偏置。应用激活函数 $g^{[l]}$ 以引入非线性:$$ a^{[l]} = g^{[l]}(z^{[l]}) $$输出生成: 最后一层生成网络的输出,通常表示为 $ \hat{y} $ 或 $ a^{[L]} $(其中 $L$ 是最后一层)。此输出表示网络对给定输入 $X$ 的预测。损失计算: 前向传播通过使用预定义的损失函数 $L(\hat{y}, y)$ 将网络的预测 $ \hat{y} $ 与真实目标值 $ y $ 进行比较而结束。此损失值量化了网络在此特定批次数据上的表现好坏。神经网络的前向传播过程通常需要存储或缓存各层的中间值,例如加权和 $z^{[l]}$ 和激活值 $a^{[l]}$。这些值是后续反向传播所需的。反向传播:计算和传播梯度一旦前向传播完成并计算出损失 $L$,反向传播便开始。其目标是确定网络中的每个权重 $W^{[l]}$ 和偏置 $b^{[l]}$ 对计算出的损失贡献了多少。这通过计算损失函数相对于这些参数的梯度来实现。起始点: 过程从网络的末端,即计算出的损失 $L$ 开始。初始梯度是损失相对于自身的导数,其值简单地为1;或更正式地说,是损失相对于最终输出激活值 $ \frac{\partial L}{\partial a^{[L]}} $ 的导数。应用链式法则: 反向传播的核心是重复应用微积分链式法则。它允许我们逐层计算梯度,从输出层向输入层反向移动。对于给定层 $l$,我们想计算 $ \frac{\partial L}{\partial W^{[l]}} $ 和 $ \frac{\partial L}{\partial b^{[l]}} $。为此,我们首先计算损失相对于该层输出激活值 $ \frac{\partial L}{\partial a^{[l]}} $ 的梯度,然后是相对于其加权和 $ \frac{\partial L}{\partial z^{[l]}} $ 的梯度。链式法则有助于关联这些梯度: $$ \frac{\partial L}{\partial z^{[l]}} = \frac{\partial L}{\partial a^{[l]}} \frac{\partial a^{[l]}}{\partial z^{[l]}} = \frac{\partial L}{\partial a^{[l]}} g'^{[l]}(z^{[l]}) $$ 并且利用 $ \frac{\partial L}{\partial z^{[l]}} $,我们可以找到相对于第 $l$ 层参数的梯度: $$ \frac{\partial L}{\partial W^{[l]}} = \frac{\partial L}{\partial z^{[l]}} \frac{\partial z^{[l]}}{\partial W^{[l]}} = \frac{\partial L}{\partial z^{[l]}} (a^{[l-1]})^T $$ $$ \frac{\partial L}{\partial b^{[l]}} = \frac{\partial L}{\partial z^{[l]}} \frac{\partial z^{[l]}}{\partial b^{[l]}} = \frac{\partial L}{\partial z^{[l]}} $$ 重要的是,继续反向传播到前一层 ($l-1$) 所需的梯度也推导而出: $$ \frac{\partial L}{\partial a^{[l-1]}} = \frac{\partial L}{\partial z^{[l]}} \frac{\partial z^{[l]}}{\partial a^{[l-1]}} = (W^{[l]})^T \frac{\partial L}{\partial z^{[l]}} $$梯度累积: 此过程将误差信号(梯度)反向传播通过网络。每一层都使用传入的梯度 $ \frac{\partial L}{\partial a^{[l]}} $(从其前一层计算得到)和在前向传播期间存储的中间值($z^{[l]}$,$a^{[l-1]}$)来计算其自身参数($W^{[l]}$,$b^{[l]}$)的梯度,以及 $ \frac{\partial L}{\partial a^{[l-1]}} $ 的梯度以进一步向后传递。梯度使用: 反向传播的最终结果是损失函数相对于网络中所有可训练参数的梯度($ \nabla_{\theta} L $,其中 $ \theta $ 代表所有 $W$ 和 $b$)。这些梯度正是优化算法(如梯度下降、Adam 或 RMSprop)更新网络参数以减少损失所需。更新规则通常遵循以下形式: $$ \theta_{new} = \theta_{old} - \eta \nabla_{\theta} L $$ 其中 $ \eta $ 是学习率。digraph G { rankdir=LR; node [shape=circle, style=filled, color="#adb5bd", width=0.8, fontsize=10]; edge [color="#495057", fontsize=9]; subgraph cluster_network { label="网络结构"; labelloc=b; bgcolor="#f8f9fa"; node [color="#ced4da"]; Input [label="输入\n(x)"]; Hidden [label="隐藏\n层"]; Output [label="输出\n(y_pred)"]; Input -> Hidden [label=" W_h, b_h"]; Hidden -> Output [label=" W_o, b_o"]; } subgraph cluster_loss { bgcolor="#ffe3e3"; Loss [label="损失\nL(y_pred, y_true)", shape=square, style=filled, color="#ff8787"]; } // 前向传播箭头 Input -> Hidden [penwidth=2, color="#339af0", fontcolor="#1c7ed6", label=" 前向传播\n (计算激活值)"]; Hidden -> Output [penwidth=2, color="#339af0"]; Output -> Loss [penwidth=2, color="#f03e3e", fontcolor="#d6336c", label=" 计算损失"]; // 反向传播箭头 (虚线, 反向) Loss -> Output [dir=back, style=dashed, penwidth=2, color="#ff922b", fontcolor="#f76707", label=" ∂L/∂y_pred"]; Output -> Hidden [dir=back, style=dashed, penwidth=2, color="#ff922b", fontcolor="#f76707", label=" 反向传播\n (传播梯度)\n ∂L/∂W_o, ∂L/∂b_o "]; Hidden -> Input [dir=back, style=dashed, penwidth=2, color="#ff922b", fontcolor="#f76707", label=" ∂L/∂W_h, ∂L/∂b_h"]; }示意图显示了一个简单神经网络中前向传播(实心蓝/红箭头)和反向传播(虚线橙色箭头)期间的信息流。前向传播计算预测和损失,而反向传播计算用于参数更新的梯度。总而言之,前向传播和反向传播是神经网络单次训练迭代的两个必要阶段:前向传播: 计算预测和由此产生的损失。反向传播: 计算损失相对于网络参数的梯度。这两个步骤在训练数据批次上重复执行,在优化算法的指导下,通过逐步调整权重和偏置,使网络能够学习。反向传播如何利用计算图和链式法则高效计算这些梯度的详细机制,将在下一节进行阐述。