【问题标题】:How does theano implement computing every function's gradient?theano 是如何实现计算每个函数的梯度的?
【发布时间】:2015-02-03 12:52:36
【问题描述】:

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

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

【问题讨论】:

  • 几乎可以在 theano 中使用的每个运算符都包含有关其自身导数的信息。在您的情况下,cost 可能是此类操作的串联。梯度是通过链式法则的简单应用和原子操作导数的知识获得的。

标签: python math gradient theano automatic-differentiation


【解决方案1】:

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

Theano 实现了reverse mode 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:在计算图上分两次运行,首先通过图向前(从输入到输出),然后使用链式规则向后(如果您熟悉使用反向传播,这正是它计算梯度的方式)。

有关各种自动差异化解决方案及其优缺点的更多详细信息,请参阅this great post

【讨论】:

    【解决方案2】:

    查找自动微分,那里有用于有效评估梯度的反向模式

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

    【讨论】:

    • 你确定它是向后模式 autodiff 吗? Theano 的文档提到“编译”表示函数的图并输出另一个图。对我来说,这听起来像是象征性的区分?
    • 符号微分产生导数的公式。自动/算法微分产生评估导数的过程。该图是解析器的结果,在两种情况下都相同。不同之处在于输出的大小,AD 将评估函数的大小增加了大约 3 倍。符号微分可以使字符串长度呈指数增长。
    猜你喜欢
    • 2015-09-16
    • 2017-03-17
    • 2016-04-01
    • 2016-03-29
    • 2015-11-27
    • 2019-11-01
    • 1970-01-01
    • 2017-05-30
    • 2016-07-01
    相关资源
    最近更新 更多