初学者常常对训练深度学习神经网络模型所使用的算法感到困惑。
人们经常听到神经网络使用“误差反向传播”算法或“随机梯度下降”来学习。有时,这两种算法中的任何一种都被用作神经网络如何在训练数据集上拟合的简称,尽管在许多情况下,人们对这些算法是什么、它们如何相关以及它们如何协同工作感到非常困惑。
本教程旨在阐明随机梯度下降和反向传播算法在网络之间训练中的作用。
在本教程中,您将了解随机梯度下降与反向传播算法之间的区别。
完成本教程后,您将了解:
- 随机梯度下降是一种优化算法,用于最小化预测模型相对于训练数据集的损失。
- 反向传播是一种自动微分算法,用于计算神经网络图结构中权重的梯度。
- 随机梯度下降和误差反向传播算法一起用于训练神经网络模型。
让我们开始吧。

反向传播与随机梯度下降的区别
照片由Christian Collins拍摄,部分权利保留。
教程概述
本教程分为三个部分;它们是:
- 随机梯度下降
- 反向传播算法
- 带有反向传播的随机梯度下降
随机梯度下降
梯度下降是一种优化算法,用于找到目标函数的一组输入变量,该函数会产生目标函数的最小值,称为函数的最小值。
顾名思义,梯度下降涉及计算目标函数的梯度。
您可能还记得,微积分中的函数一阶导数计算函数在给定点的斜率或曲率。从左到右读取,正导数表明目标函数正在向上倾斜,负导数表明目标函数正在向下倾斜。
- 导数:目标函数相对于函数特定输入值的斜率或曲率。
如果目标函数具有多个输入变量,则可以将它们一起作为变量向量。处理向量和矩阵被称为线性代数,用线性代数中的结构进行微积分称为矩阵微积分或向量微积分。在向量微积分中,一阶导数(偏导数)的向量通常称为目标函数的梯度。
- 梯度:目标函数相对于输入变量的偏导数向量。
梯度下降算法需要计算目标函数相对于特定输入值值的梯度。梯度指向向上,因此沿着负梯度方向向下移动,以获得每个变量的新值,从而使目标函数的值降低。
步长用于缩放梯度并控制每个输入变量相对于梯度的变化量。
- 步长:学习率或 alpha,用于控制每个输入变量相对于梯度的变化量的超参数。
此过程重复进行,直到找到目标函数的最小值、评估了最大数量的候选解或满足其他停止条件。
梯度下降可以应用于最小化预测模型在训练数据集上的损失函数,例如分类模型或回归模型。这种应用称为随机梯度下降。
- 随机梯度下降:梯度下降优化算法的扩展,用于最小化预测模型在训练数据集上的损失函数。
目标函数被视为数据集上的损失或误差函数,例如回归的均方误差或分类的交叉熵。模型的参数被视为目标函数的输入变量。
- 损失函数:正在最小化的目标函数。
- 模型参数:正在优化的损失函数的输入参数。
该算法之所以被称为“随机”,是因为目标函数相对于输入变量的梯度是嘈杂的(例如,概率近似)。这意味着梯度的评估可能存在统计噪声,可能会掩盖真实的底层梯度信号,这是由于训练数据集中的稀疏性和噪声引起的。
随机梯度下降的见解是,梯度是期望值。期望值可以使用少量样本进行近似估计。
— 第151页,深度学习,2016年。
随机梯度下降可用于训练(优化)许多不同类型的模型,如线性回归和逻辑回归,尽管通常已经发现了更有效的优化算法,并且可能应该使用它们。
随机梯度下降(SGD)及其变体可能是机器学习尤其是深度学习中最常用的优化算法。
— 第294页,深度学习,2016年。
随机梯度下降是训练人工神经网络最有效的算法,其中权重是模型参数,目标损失函数是平均一个、一个子集(batch)或整个训练数据集的预测误差。
几乎所有的深度学习都由一个非常重要的算法驱动:随机梯度下降或SGD。
— 第151页,深度学习,2016年。
有许多流行的随机梯度下降扩展旨在改进优化过程(在更少的迭代次数中获得相同或更好的损失),例如动量、均方根传播(RMSProp)和自适应移动估计(Adam)。
使用随机梯度下降训练神经网络时的一个挑战是如何计算网络隐藏层节点(例如,距离模型输出层一步或多步的节点)的梯度。
这需要微积分中的一种特定技术,称为链式法则,以及一种实现链式法则的有效算法,该算法可用于计算网络中任何参数的梯度。这种算法称为反向传播。
反向传播算法
反向传播,也称为“backpropagation”或简称“backprop”,是一种用于计算模型变量相对于损失函数的梯度的算法。
- 反向传播:计算模型变量相对于损失函数的梯度的算法。
您可能还记得,微积分中函数相对于特定输入变量值的导数是函数相对于该输入的导数变化率或曲率。当一个函数有多个输入变量时,它们构成一个向量,一阶导数(偏导数)的向量称为梯度(即向量微积分)。
- 梯度:目标函数相对于特定输入值的偏导数向量。
反向传播用于训练神经网络模型,以计算模型中每个权重的梯度。然后,优化算法使用该梯度来更新模型权重。
该算法是专门为从图的输出向图的输入反向计算梯度而开发的,通过反向传播误差来计算每个变量的梯度。
反向传播算法,通常简称为 backprop,允许信息从成本反向流经网络,以计算梯度。
— 第204页,深度学习,2016年。
损失函数代表模型的误差或误差函数,权重是函数的变量,因此误差函数相对于权重的梯度称为误差梯度。
- 误差函数:训练神经网络时最小化的损失函数。
- 权重:网络中被视为损失函数输入值的参数。
- 误差梯度:损失函数相对于参数的一阶导数。
这使得该算法得名“反向传播”,有时也称为“误差反向传播”或“误差反向传播”。
- 误差反向传播:关于从输出层开始,梯度如何通过网络图递归地反向计算的说明。
该算法涉及微积分链式法则(不同于概率中的链式法则)的递归应用,该法则用于在已知父函数导数的情况下计算子函数的导数。
微积分的链式法则 […] 用于计算由复合其他已知导数的函数形成的函数的导数。反向传播是一种计算链式法则的算法,其操作顺序经过了高度优化。
— 第205页,深度学习,2016年。
- 链式法则:一种微积分公式,用于计算具有已知导数的相关函数的复合函数的导数。
还有其他计算链式法则的算法,但反向传播算法是用于神经网络的特定图结构的高效算法。
公平地说,反向传播算法是一种自动微分算法,它属于一类称为反向累积的微分技术。
此处所述的反向传播算法只是自动微分的一种方法。它是称为反向模式累积的更广泛技术类别的一个特例。
— 第222页,深度学习,2016年。
尽管反向传播是为了训练神经网络模型而开发的,但无论是反向传播算法本身,还是它高效实现的链式法则公式,都可以更普遍地用于计算函数的导数。
此外,反向传播经常被误解为专门用于多层神经网络,但原则上它可以计算任何函数的导数……
— 第204页,深度学习,2016年。
带有反向传播的随机梯度下降
随机梯度下降是一种可用于训练神经网络模型的优化算法。
随机梯度下降算法需要计算模型中每个变量的梯度,以便计算变量的新值。
反向传播是一种自动微分算法,可用于计算神经网络中参数的梯度。
结合使用反向传播算法和随机梯度下降算法可以训练神经网络。我们可以称之为“带有反向传播的随机梯度下降”。
- 带有反向传播的随机梯度下降:对用于训练神经网络的通用算法的更完整描述,参考了优化算法和梯度计算算法。
从业者通常说他们使用反向传播来训练模型。从技术上讲,这是不正确的。即使作为一种简写,这也是不正确的。反向传播不是优化算法,也不能用于训练模型。
反向传播一词通常被误解为是多层神经网络的整个学习算法。实际上,反向传播仅指计算梯度的方法,而使用另一个算法,例如随机梯度下降,来执行使用该梯度的学习。
— 第204页,深度学习,2016年。
可以公平地说,神经网络使用随机梯度下降作为简写来训练或学习,因为假定在优化过程中使用反向传播算法来计算梯度。
即便如此,也可以使用不同的算法来优化神经网络的参数,例如不需要梯度的遗传算法。如果使用随机梯度下降优化算法,则可以使用不同的算法来计算损失函数相对于模型参数的梯度,例如实现链式法则的替代算法。
尽管如此,“带有反向传播的随机梯度下降”组合被广泛使用,因为它是迄今为止为拟合神经网络模型而开发的最高效且最有效的通用方法。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
书籍
- 深度学习, 2016.
- 《用于模式识别的神经网络》, 1995.
- 模式识别与机器学习, 2006.
文章
总结
在本教程中,您了解了随机梯度下降与反向传播算法的区别。
具体来说,你学到了:
- 随机梯度下降是一种优化算法,用于最小化预测模型相对于训练数据集的损失。
- 反向传播是一种自动微分算法,用于计算神经网络图结构中权重的梯度。
- 随机梯度下降和误差反向传播算法一起用于训练神经网络模型。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
“可以公平地说,反向传播算法是一种自动微分算法”
请查阅1986年的原始反向传播论文。完全没有提及“自动微分”。该论文的伟大发明是可以使用链式法则来计算隐藏单元的误差。所以我认为它是反向传播,无论你是手动还是自动计算导数。
同意,但从现代自动微分方法的角度回顾反向传播,反向传播看起来是一种原始的自动微分方法。这正是我的评论的意图。
另请参阅维基百科的这段引用
我同意Laszlo的观点。我认为通过了解科学和术语的历史,而不是称一种引用方式为“错误”而另一种为“正确”,可以使情况更加清晰。
谢谢Doug。
亲爱的 Jason,
您对Laszlo的回复对我来说并不方便。
我同意“自动微分”这个术语,因为它通过层将子函数的微分平滑地转移到目标函数。
我也喜欢它,因为它对学生有吸引力,并且可以帮助他们认识到训练的核心是SGD,而反向传播是“自动”利用它。
感谢分享。
一样
我很想知道您为什么认为它们是同一件事?也许我遗漏了什么?
你好,我想分步学习和介绍机器学习。
您可以从这里开始
https://machinelearning.org.cn/start-here/#getstarted
非常深刻的教程,我很喜欢!非常感谢!
谢谢!
我喜欢这个教程。非常有信息量。感谢分享!
谢谢!
我想知道您对使用Levemberg Marquardt算法训练神经网络的看法。谢谢
没有看法。如果您想使用它,可以尝试一下,看看它对您选择的模型和数据集的效果如何。
我总能从您的文章中学到东西(很多)。谢谢。
谢谢!
从您的文章中学到东西
谢谢!
谢谢Jason,补充一点。函数(也包括损失函数)的梯度向量总是指向损失函数图上给定点处最陡峭的斜率方向。因此,负梯度指向最陡峭下降的反方向。这个方向在算法的每一步都会改变。
不客气。
是的,没错。
感谢Jason解开了许多文献来源中不清楚的技术术语。
感谢您一贯努力教育我们。
不客气!
做得好。非常感谢您的解释。
Hussein,非常欢迎!