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

Iss*_*sac 4 python math gradient automatic-differentiation theano

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

 gparams = T.grad(cost, self.params) 
Run Code Online (Sandbox Code Playgroud)

Min*_*ark 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
"""
Run Code Online (Sandbox Code Playgroud)

反向模式autodiff:通过计算图两次通过,首先通过图形(从输入到输出),然后使用链规则向后(如果你熟悉反向传播,这正是它计算渐变的方式) ).

见这个伟大的职位对各种自动分化的解决方案及其利弊的更多细节.