反向传播是“误差反向传播”的简写,它是一种优雅方法,可用于计算神经网络的任意权重或偏差的变化会如何影响模型预测的准确性。它对于使用监督学习、半监督学习或自我监督学习来训练神经网络至关重要。
虽然反向传播的等价对象和前身算法早在 20 世纪 60 年代便已在不同背景下独立提出,但 David E. Rumelhart、Geoffrey Hinton 和 Ronald J. Williams 却首先发布了形式学习算法。他们在 1986 年发表的论文《Learning representations by back-propagating errors》提供了在现代机器学习环境下使用和理解的反向传播算法的推导。
反向传播的逻辑是,人工神经网络中的神经元层本质上是一系列嵌套的数学函数。在训练过程中,这些相互关联的方程被嵌套到另一个函数中:“损失函数”,用于测量给定输入的期望输出(或“真实数据”)与神经网络实际输出之间的差异(或“损失”)。
因此,我们可以使用“链式法则”,一种可以追溯到17世纪的微积分原理,来计算每个神经元对整体损失的贡献率。这样,就可以计算出这些神经元所代表的方程中任何变量(即任何权重或偏差)的变化所产生的影响。
就数学角度而言,反向传播会从输出开始进行反向工作,以便有效计算损失函数的“梯度”:网络中每个方程的导数向量。此梯度可告知优化算法(如“梯度下降”)要调整哪些方程,以及在哪个方向对其进行调整以减少损失。
这三个相互交织的流程(其一为用于跟踪不同输入中模型误差的损失函数,其二为反向传播该误差以了解网络的不同部分是如何导致该误差的,其三则是可相应调整模型权重的梯度下降算法)便是深度学习模型的“学习”方式。因此,从最基本的多层感知器到用于生成式 AI 的复杂深度神经网络架构,反向传播都是训练神经网络模型的基础所在。
由于反向传播过程是神经网络训练的基础,因此,要对这一过程进行有用的解释,就必须对神经网络如何进行预测有所了解。
最重要的是,了解“权重”和“偏差”的目的和背景很有用:通过反向传播和梯度下降优化的可调整模型参数。
神经网络旨在大致模拟人类大脑的结构。它们由按层排列的众多互连节点(或神经元)所构成。一旦原始输入数据在整个网络中进行“前向传播”,神经网络便会进行预测。
“输入层”中的神经元接收输入数据,通常以向量嵌入的形式,每个输入神经元都接收输入向量的单独特征。例如,处理 10x10 像素灰度图像的模型的输入层通常有 100 个神经元,每个输入神经元对应一个单独的像素。因此,神经网络通常需要固定大小的输入,尽管池化或归一化等技术可以提供一定的灵活性。
在标准的前馈神经网络中,输入层的每个神经元均与下一层的每个神经元相连,而下一层的神经元又与再下一层的神经元相连,依此类推,直至到达输出层(在此层做出最终预测)。输入层与输出层之间的中间层被称为网络的隐藏层,而这些层也是“学习”最为活跃的地方。
虽然某些专用神经网络架构(例如,专家模型或卷积神经网络的混合)会给这一简单的安排带来变化、补充或例外,但所有神经网络均会采用此核心结构。
尽管每个神经元都会接收来自上一层每个节点的输入,但并非所有这些输入都具有相同的重要性。两个神经元之间的每个连接都被赋予一个唯一的“权重”:一个乘数,用于增加或减少一个神经元对下一层神经元的贡献。
每个单独的神经元也可被赋予一个“偏差”:追加到上一层神经元的加权输入之和的一个常数值。
反向传播和梯度下降的最终目标是计算产生最佳模型预测的权重和偏差。与准确预测显着相关的数据特征所对应的神经元会被赋予更大的权重;其他连接可赋予接近零的权重。
现代深度神经网络通常具有数十个隐藏层,每个隐藏层都包含许多神经元,可能包含数千、数百万甚至数十亿个此类可调整参数(在大多数大型语言模型 (LLM) 的情况下)。
每个神经元均被配置为对它从前一层节点接收的不同加权输入的总和执行名为“激活函数”的数学运算。激活函数会引入“非线性”,以便模型能捕获输入数据中的复杂模式,并产生可进行优化的梯度。仅使用线性激活函数本质上会将神经网络折叠为回归模型。
神经网络中常见的激活函数包括:
假设一个神经网络的第二层有 3 个输入节点(a、b 和 c),输入层的隐藏单元 z 具有 tanh 激活函数和偏置项 t。输入节点和节点 z 之间的每个连接都具有唯一的权重 w。我们可以使用简化的方程 z = tanh ( w a z *a + w bz *b + w cz * c + t ) 来描述节点 z 将传递给下一层神经元的输出值。
神经元 z 会与下一层的神经元相连。因此,z 的方程是下一层中激活函数的其中一部分,进而也是任意后续层中所有神经元的激活函数的一部分。
正如下文所述,反向传播是一种非常快速、高效的算法,可以解开神经网络中大量相互关联的变量和方程。
为了说明反向传播的效率,Michael Nielsen 在其在线教科书《神经⽹络与深度学习》中,将此算法与计算神经网络损失函数梯度的一种简单直观的替代方法进行了比较。
正如 Nielsen 所解释的,人们可轻松估计网络中任意特定权重 wj 的变化所产生的影响,而具体方法则是:只需在保持所有其他参数不变的情况下,对两个略有不同的 wj 值进行前向传播,并比较每次传播所产生的损失即可。通过将该流程形式化为一个简单的等式并用 Python 实现几行代码,便可对网络中的每个权重自动执行该流程。
但是,现在想象一下,模型中有 100 万个权重,这对于现代深度学习模型来说是相当适中的。要计算整个梯度,需要通过网络完成 1,000,001 次前向传递:1 次用于建立基线,然后另一次传递用于评估百万权重中每个权重的变化。
反向传播可通过 2 次传播实现相同的目标:1 次为前向传播,另 1 次则为反向传播。
为了简化反向传播的工作原理的解释,首先简要回顾一些核心的数学概念和术语会有所帮助。
链式法则对于计算神经网络中激活函数的导数至关重要,而激活函数则是由前几层中其他神经元的激活函数的输出所组成。
虽然反向传播背后的逻辑相对简单,但其所用的数学方法和符号却可能会变得非常复杂,尤其是对于那些不熟悉变量微积分的人群来说。
从模型的输出向后传播,反向传播应用“链规则”,计算每个神经网络参数的变化对模型预测总体误差的影响。
抽象地说,反向传播的目的是训练神经网络通过监督学习做出更优质的预测。而更根本的是,反向传播的目标是确定如何调整模型权重和偏差,从而最小化由“损失函数”衡量的误差。
在技术和数学层面上,反向传播的目标是计算损失函数相对于神经网络各个参数的梯度。简单来说,反向传播使用链式法则来计算损失随网络中特定权重(或偏差)的任何变化而变化的速率。
一般来说,使用反向传播训练神经网络需要以下步骤:
神经网络通过前向传播输出预测结果。前向传播本质上是一系列长嵌套方程,其中一层神经元的激活函数输出作为下一层神经元激活函数的输入。
模型训练通常会从权重和偏差的随机初始化开始。模型的超参数(例如,隐藏层数、每层的节点数以及特定神经元的激活函数)均为手动配置,而不受训练影响。
每次前向传递都会从训练数据集中采样一个输入。输入层的节点接收输入向量,然后每个节点将其值(乘以一些随机的初始权重)传递给第一个隐藏层的节点。隐藏单位将这些输出值的加权总和作为激活函数的输入,激活函数的输出值(由随机初始权重决定)则用作下一层神经元的输入。这种情况一直持续到输出层,并在那里进行最终预测。
以以下神经网络(可将输入划分为 5 个类别之一)的简化示例为例:
在训练良好的网络中,该模型会持续为正确的分类输出高概率值,并为其他错误的分类输出低概率值。但是,该神经网络尚未经过训练。此时,它的权重和偏差均为随机初始值,因此其预测通常会不准确。
每次前向传播后,“损失函数”便会测量模型对给定输入的预测输出与该输入的正确预测(或“标准答案”)之间的差异(或“损失”)。换言之,它会测量模型的实际输出与所需输出之间的差异。
在使用标记数据的监督学习中,标准答案将通过手动注释来提供。在自监督学习中,系统会通过重建来掩盖或转换未标记数据样本和任务模型的一部分,而原始样本则会用作标准答案。
该损失函数的目标是量化不准确性,而所用具体方法能适当反映模型输出对每个输入的误差的性质和量级。不同的损失数学公式最适合特定的任务:例如,均方误差的变体非常适合回归问题,而交叉熵损失的变体则适合分类问题。
由于损失函数将神经网络的输出作为输入,而神经网络的输出是由许多嵌套的单个神经元激活函数组成的复合函数,因此,对损失函数求导需要对整个神经网络进行求导。为此,反向传播使用链式法则。
“损失函数”、“成本函数”还是“误差函数”?
须注意的是,在某些情况下,成本函数或误差函数一词会用于代替损失函数,即用“成本”或“误差”来代替“损失”。
尽管一些机器学习文献对每个术语都赋予了独特的细微差别,但通常这些数据都可以互换。1目标函数是一个广义的术语,指我们希望最小化或最大化的任何此类评估函数。损失函数、成本函数或误差函数特指我们想要最小化的术语。
从最后一层开始,“后向传递”对损失函数求导,以计算网络中每个参数对单个输入的整体误差的影响。
回到前面的分类器模型示例,我们将从最后一层的 5 个神经元开始,我们将其称为 L 层。每个输出神经元的 softmax 值表示输入属于其类别的可能性(满分为 1)。在完美训练的模型中,代表正确分类的神经元的输出值接近 1,其他神经元的输出值接近 0。
现在,我们会重点介绍表示正确预测的输出单元,而我们会将其称为 Lc。Lc 的激活函数是一个复合函数,其中包含整个神经网络从输入层到输出层的众多嵌套激活函数。最小化损失函数需在整个网络中进行调整,以使 Lc 的激活函数的输出更接近于 1。
为此,我们需知晓先前层中的任一更改会如何改变 Lc 自己的输出。换言之,我们需找到 Lc 的激活函数的偏导数。
Lc 的激活函数的输出取决于它从倒数第二层(我们称之为 L-1 层)的神经元接收到的贡献。改变 L c 输出的方法之一是改变 L-1和L c 中神经元之间的权重。通过计算每个 L-1 权重相对于其他权重的偏导数,我们可以看到增加或减少其中任何一个权重将如何使 Lc 的输出更接近(或更远离)1。
但这并不是改变L c输出的唯一方法。Lc 从 L-1 神经元获得的贡献不仅取决于应用于 L-1 输出值的权重,还取决于实际(预权重)输出值本身。反过来,L-1 神经元的输出值会受到应用于它们从 L-2 接收的输入的权重的影响。因此,我们可以对 L-1 中的激活函数进行微分,以找到应用于 L-2 贡献的权重的偏导数。这些偏导数将向我们展示 L-2 权重的任何变化会如何影响 L-1 的输出,进而影响 Lc 的输出值,并因此影响损失函数。
按照同样的逻辑,我们还可以通过调整 L-2 神经元从 L-3 神经元接收到的贡献,来影响 L-1 神经元从 L-2 神经元接收的输出值。我们在 L-3 中找到偏导数,依此类推,递归重复这个过程,直到我们到达输入层。完成之后,我们会得到损失函数的梯度:网络中每个权重和偏差参数的偏导数向量。
现在,我们已完成单个训练示例的前向传播和反向传播。但是,我们的目标是训练模型以对新输入进行良好泛化。为此,需通过大量样本进行训练,而这些样本可反映输入的多样性和范围;系统会要求此模型在训练后对输入进行预测。
现在我们已经有损失函数相对于网络中每个权重和偏差参数的梯度,我们可以通过使用梯度下降来更新模型参数,从而最小化损失函数,进而优化模型。
向下移动(下降)损失函数的梯度将减少损失。由于我们在反向传播期间计算的梯度包含每个模型参数的偏导数,因此我们知道向哪个方向“步进”每个参数以减少损失。
每一步都反映了模型对其训练数据的“学习”。我们的目标是迭代更新权重,直至达到最小梯度。梯度下降算法的目标是找到能让我们最有效地沿着梯度下降的特定参数调整。
每个步骤的大小是一个可优化的超参数,称为学习率。 选择合适的学习率对于高效且有效的训练非常重要。
请记住,神经网络中的激活函数是非线性的。某些梯度可能大致为 U 形:沿着一个方向迈进会使梯度向下移动,但继续沿该方向迈进最终会使梯度向上移动。
低学习率可确保我们始终朝着正确的方向前进,但计算如此多的变更既耗时又昂贵。学习率越高,计算效率就越高,但有超过最小值的风险。
梯度下降中的另一个考虑因素是更新权重的频率。一种选择是计算训练数据集中每个示例的梯度,然后取这些梯度的平均值并用它来更新参数。该过程在一系列训练周期中反复重复,直到错误率稳定下来。这种方法称为批量梯度下降。
当训练数据集规模很大时(在深度学习领域常常如此),批量梯度下降需要极长的处理时间。为权重更新的每次迭代计算数百万个样本的梯度时,效率会变得较为低下。在随机梯度下降 (SGD) 中,每个时期均会对每个步骤使用一个训练示例。虽然损失可能会在不同时期中出现波动,但在很多更新中,它却能快速收敛到最小值。
小批量梯度下降 是一种中间方法。训练示例以固定大小的批次随机采样,然后计算它们的梯度并取平均值。这减轻了批量梯度下降的内存存储要求,同时还降低了 SGD 的相对不稳定性。
使用面向 AI 构建器的新一代企业级开发平台 IBM watsonx.ai,可以训练、验证、调整和部署生成式 AI、基础模型和机器学习功能。使用一小部分数据,即可在很短的时间内构建 AI 应用程序。
借助 IBM 业界领先的人工智能专业知识和解决方案组合,让人工智能在您的业务中发挥作用。
通过增加 AI 重塑关键工作流程和运营,最大限度提升体验、实时决策和商业价值。
¹ “Deep Learning”,Goodfellow 等人,MIT Press,2016.
IBM web domains
ibm.com, ibm.org, ibm-zcouncil.com, insights-on-business.com, jazz.net, mobilebusinessinsights.com, promontory.com, proveit.com, ptech.org, s81c.com, securityintelligence.com, skillsbuild.org, softlayer.com, storagecommunity.org, think-exchange.com, thoughtsoncloud.com, alphaevents.webcasts.com, ibm-cloud.github.io, ibmbigdatahub.com, bluemix.net, mybluemix.net, ibm.net, ibmcloud.com, galasa.dev, blueworkslive.com, swiss-quantum.ch, blueworkslive.com, cloudant.com, ibm.ie, ibm.fr, ibm.com.br, ibm.co, ibm.ca, community.watsonanalytics.com, datapower.com, skills.yourlearning.ibm.com, bluewolf.com, carbondesignsystem.com, openliberty.io