Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python theano如何实现计算每个函数';s梯度?_Python_Math_Gradient_Theano_Automatic Differentiation - Fatal编程技术网

Python theano如何实现计算每个函数';s梯度?

Python theano如何实现计算每个函数';s梯度?,python,math,gradient,theano,automatic-differentiation,Python,Math,Gradient,Theano,Automatic Differentiation,我有一个关于Theano实施的问题。 theano如何通过下列函数(T.grad)得到每个损失函数的梯度?谢谢你的帮助 gparams = T.grad(cost, self.params) 查找自动微分,可以使用向后模式有效地评估梯度 据我所见,Theano是代码重写和基于运算符的方法的混合体。它使用python中的运算符重载来构造计算图,然后对其进行优化,并从该图生成(优化的)操作序列,以评估所需的导数的INKD。Edit:这个答案说Theano使用符号微分是错误的。我道歉 Thean

我有一个关于Theano实施的问题。 theano如何通过下列函数(T.grad)得到每个损失函数的梯度?谢谢你的帮助

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

查找自动微分,可以使用向后模式有效地评估梯度


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

Edit:这个答案说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
"""
反向模式autodiff:在计算图形中分两次运行,首先在图形中前进(从输入到输出),然后使用链式规则后退(如果您熟悉反向传播,这正是它计算渐变的方式)


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

几乎您可以在theano中使用的每个运算符都包含有关其自身衍生产品的信息。在您的例子中,
cost
可能是此类操作的串联。梯度是通过简单应用链式规则和原子操作导数的知识得到的。你确定它是向后模式的自微分吗?Theano的文档提到“编译”表示函数的图形并输出另一个图形。听起来像是符号微分?符号微分产生了导数的公式。自动/算法微分生成求导程序。该图是解析器的结果,在这两种情况下都是相同的。不同之处在于输出的大小,AD将求值函数的大小增加了大约3倍。符号微分可以使字符串长度呈指数增长。