我有一个关于Theano实现的问题。下面这个函数(T.grad)是如何获取每个损失函数的梯度的?谢谢你的帮助。
gparams = T.grad(cost, self.params)
我有一个关于Theano实现的问题。下面这个函数(T.grad)是如何获取每个损失函数的梯度的?谢谢你的帮助。
gparams = T.grad(cost, self.params)
编辑:这个答案在说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
"""
反向模式自动微分:通过对计算图进行两次遍历来实现,首先从输入到输出进行前向遍历,然后使用链式规则进行反向遍历(如果您熟悉反向传播,那么这正是它计算梯度的方式)。
查看这篇出色的文章以获取有关各种自动微分解决方案及其优缺点的更多详细信息。