Theano 是否使用反向传播?

机器算法验证 神经网络 深度学习 梯度下降
2022-03-22 20:28:09

我正在关注以下教程:

http://deeplearning.net/tutorial/mlp.html

这是关于为 MNIST 数据集训练多层感知器 (MLP)。

据我了解,Theano所做的是使用符号微分来计算梯度。通过这个计算,很容易实现梯度下降,我相信 Theano 是通过以下几行来实现的: gparams = [T.grad(cost, param) for param in classifier.params]

现在我的问题是:鉴于反向传播是梯度下降的一种形式, Theano 实际上是否使用反向传播?换句话说,在某些情况下象征性地使用梯度下降和实际实现后向传递是否不同?它更稳定还是更容易出错?

我想在大多数情况下结果应该是相同的,但我想知道它。

在此先感谢并祝一切顺利,

2个回答

Theano 创建了一个符号图。该图允许它根据连接的输入、在变量上实现的操作和输出(由应用节点创建)计算导数。

import theano.tensor as T
x = T.dmatrix('x')
y = T.dmatrix('y')
z = x + y

Theano 符号图

Apply 节点为蓝色,Variables 为红色,Op 为绿色,Types 为紫色。

如theano官方文档中给出的,

具有图结构,计算自动微分很简单。tensor.grad() 唯一要做的就是通过所有应用节点(应用节点是那些定义图执行哪些计算的节点)将图形从输出返回到输入。对于每个这样的应用节点,其操作定义了如何计算节点输出相对于其输入的梯度。请注意,如果操作不提供此信息,则假定未定义梯度。使用链式法则可以组合这些梯度,以获得图输出相对于图输入的梯度表达式。

与 Python 语言相比,Apply 节点是 Theano 的函数调用版本,而 Op 是 Theano 的函数定义版本。

虽然手动寻找导数对于前馈神经网络来说很简单,但在递归神经网络和长期短期记忆细胞的情况下,它变得非常复杂,尤其是在网络很深的情况下。

我认为当你在这里提到“反向传播”时,你真正的意思是“自动微分”。另一种方法是“符号微分”,您可以在其中找到某个损失对某些参数的导数的公式,并根据该公式计算梯度。

Theano 将两者结合起来。每个 Op 定义了一个正向传递函数和一个反向传播梯度的函数,theano 负责在这些函数之间传递信号以实现反向传播。仅此一项就只是(反向模式)自动微分。

问题是 theano 还有一个优化器,可以简化表达式以减少计算(例如x1W+x2W(x1+x2)W) 或为了数值稳定性,这使它更像是符号微分。

这里有更多关于这个话题的讨论