Python can';我不理解自定义Theano Op中的grad()方法

Python can';我不理解自定义Theano Op中的grad()方法,python,theano,Python,Theano,当我阅读有关创建新Op的文档时,我无法理解示例中的grad()。为什么它们返回output\u grads[0]*2而不是2?那么,output\u grads[0]代表什么 如果输出梯度[0]表示相对于输入x的链导数,在下一个示例中,为什么梯度()返回a*输出梯度[0]+b(它应该是self.a*输出梯度[0]+self.b)而不是self.a*输出梯度[0] 一个更复杂的定制Op怎么样?像y=exp(x1)/(a*(x1**3)+log(x2)),如何写入它的grad()?此外,如果输入是向

当我阅读有关创建新Op的文档时,我无法理解示例中的grad()。为什么它们返回
output\u grads[0]*2
而不是
2
?那么,
output\u grads[0]
代表什么

如果输出梯度[0]表示相对于输入x的链导数,在下一个示例中,为什么梯度()返回
a*输出梯度[0]+b
(它应该是
self.a*输出梯度[0]+self.b
)而不是
self.a*输出梯度[0]

一个更复杂的定制Op怎么样?像
y=exp(x1)/(a*(x1**3)+log(x2))
,如何写入它的grad()?此外,如果输入是向量或矩阵,那么如何编写grad()?

正如前面指出的,
输出\u grads
参数是

(其中f是
Op
的输出之一,C是调用
theano.tensor.grad(…)
的成本)

该页面还指出,
Op
.grad(…)
方法必须返回

(其中x是对
操作的输入)

我认为
ax+b
示例是错误的。如果您查看实际代码,例如, 它似乎只是实现了链式规则



免责声明:到目前为止,我还没有实现自定义的
Op
,我自己也在研究这个问题,这就是我对它的理解。

另请参见:谢谢!LDGN。我认为你是对的。输出_梯度[0]表示dC/df,其中f是Op的输出,即y1。如果没有下一级Op的输入包括y1,则输出_梯度[0]设置为1。