Theano如何实现计算每个函数的梯度?

4

我有一个关于Theano实现的问题。下面这个函数(T.grad)是如何获取每个损失函数的梯度的?谢谢你的帮助。

 gparams = T.grad(cost, self.params) 

几乎在 theano 中可以使用的每个运算符都包含有关其自身导数的信息。在您的情况下,“cost”可能是这些操作的连接。梯度是通过简单地应用链式规则和原子操作的导数知识来获得的。 - eickenberg
2个回答

10

编辑:这个答案在说Theano使用符号微分方面是错误的。我表示歉意。

Theano实现了反向模式自动微分,但令人困惑的是他们称其为“符号微分”。这很误导人,因为符号微分是完全不同的东西。让我们来看看两者的区别。

符号微分:给定一个表示函数 f(x) 的图,它使用链式法则计算一个新的图表示该函数的导数 f'(x)。他们称这个过程为编译 f(x)。符号微分的一个问题是它可能会输出非常低效的图,但是Theano会自动简化输出的图。

例子:

"""
f(x) = x*x + x - 2
Graph =
          ADD
         /   \
        MUL  SUB
       /  \  /  \
       x  x  x  2

Chain rule for ADD=> (a(x)+b(x))' = a'(x) + b'(x)
Chain rule for MUL=> (a(x)*b(x))' = a'(x)*b(x) + a(x)*b'(x)
Chain rule for SUB=> (a(x)-b(x))' = a'(x) - b'(x)
The derivative of x is 1, and the derivative of a constant is 0.

Derivative graph (not optimized yet) =
          ADD
         /   \
       ADD    SUB
      /  |    |  \
   MUL  MUL   1   0
  /  |  |  \
 1   x  x   1

Derivative graph (after optimization) =
          ADD
         /   \
       MUL    1
      /   \
     2     x

So: f'(x) = 2*x + 1
"""

反向模式自动微分:通过对计算图进行两次遍历来实现,首先从输入到输出进行前向遍历,然后使用链式规则进行反向遍历(如果您熟悉反向传播,那么这正是它计算梯度的方式)。

查看这篇出色的文章以获取有关各种自动微分解决方案及其优缺点的更多详细信息。


1
查找“自动微分”和其中用于高效计算梯度的“反向模式”。
Theano 是我所见过的代码重写和基于操作符方法之间的混合体。它使用 Python 中的操作符重载来构建计算图,然后对其进行优化,并从该图(经过优化)生成操作序列以评估所需的派生物种类。

你确定它是反向模式自动微分吗?Theano的文档提到“编译”表示函数的图并输出另一个图。听起来像符号微分? - MiniQuark
符号微分产生导数的公式。自动/算法微分产生评估导数的过程。图形是解析器的结果,在两种情况下都相同。区别在于输出的大小,AD将评估函数的大小增加约3倍。符号微分可能具有指数级字符串长度增长。 - Lutz Lehmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接