当我阅读有关创建新操作的文档时,我无法理解示例http://deeplearning.net/software/theano/extending/extending_theano.html#example-op-definition中的grad()。为什么他们返回output_grads[0] * 2
而不是2
?什么是output_grads[0]
代表什么?
如果output_grads [0]表示相对于输入x的链导数,则在下一个示例http://deeplearning.net/software/theano/extending/extending_theano.html#example-props-definition中,为什么grad()返回a * output_grads[0] + b
(它应该是self.a * output_grads[0] + self.b
)不是self.a * output_grads[0]
?
更复杂的自定义操作怎么样?像y = exp(x1)/(a*(x1**3)+log(x2))
一样,如何写出它的grad()?此外,如果输入是向量或矩阵,如何写入grad()?
答案 0 :(得分:1)
正如the extended .grad()
documentation指出的那样,output_grads
参数是
(其中 f 是您Op
的输出之一, C 是您调用theano.tensor.grad(...)
的费用
该页面还说明.grad(...)
的{{1}}方法必须返回
(其中 x 是Op
的输入)
我认为Op
示例是错误的。如果您查看实际代码,例如Sigmoid或XLogX,
它似乎只是实施了连锁规则。
免责声明:到目前为止,我还没有实现自定义ax+b
,我自己正在研究这个问题,这就是我理解它的方式。