4

我对 Theano 的实现有疑问。theano如何通过以下函数(T.grad)获得每个损失函数的梯度?谢谢您的帮助。

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

2 回答 2

10

编辑:这个答案说 Theano 使用符号微分是错误的。我很抱歉。

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

符号微分:给定一个表示函数的图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
"""

反向模式 autodiff:通过计算图进行两次传递,首先通过图向前(从输入到输出),然后使用链式法则向后(如果您熟悉反向传播,这正是它计算梯度的方式)。

有关各种自动差异化解决方案及其优缺点的更多详细信息,请参阅这篇精彩的帖子。

于 2016-08-22T14:33:40.580 回答
1

查找自动微分和用于有效评估梯度的向后模式。

在我看来,Theano 是代码重写和基于运算符的方法之间的混合体。它使用 python 中的运算符重载来构建计算图,然后对其进行优化并从该图(优化)生成操作序列以评估所需的导数。

于 2015-02-03T14:49:35.437 回答