私は、スキャン操作によって手動でウェイトベクトルに向かうスカラーコストの勾配を計算しようとします。しかし、それは仕事と常にサブテンソルは、勾配を算出することができることを確認するサブテンソルのTheano勾配
微分可能ではないことをエラーで返していません:
T.grad(cost, p2)
は完璧に動作します。これは、p2がコストから切り離されていないことを意味します。私は次のことをしようとするただし、:
def differentiate_element(i,p2,c):
p2element=p2[i]
return T.grad(c,p2element)
h2, h2_updates = theano.scan(differentiate_element,
sequences=T.arange(p2.shape[0]), non_sequences=[p2, cost])
私はエラー「theano.gradient.DisconnectedInputErrorを得る:大学院方法は、コストの計算、グラフの一部ではない変数に対する勾配を計算するように頼まれました、または唯一の非微分演算子で使用されている:サブテンソル{}のint64 0.0'
この質問は、すでに前に頼まれていますDefining a gradient with respect to a subtensor in Theanoが、満足のいく答えはなかったです。つまり、示されているようにp2 [i]をそれ自身の変数に代入することはそのトリックを行いません。 、プリント
import numpy
import theano
import theano.tensor as T
p2=theano.shared(name="P2",value=numpy.zeros(100,dtype=theano.config.floatX),borrow=True)
x=T.scalar('x')
cost=T.sum(x*p2)
gradient=T.grad(cost,p2)
def differentiate_element(i, p2, c):
p2element = p2[i]
return T.grad(c, p2element, disconnected_inputs='ignore')
gradient2, grad2_updates = theano.scan(differentiate_element,
sequences=T.arange(p2.shape[0]),
non_sequences=[p2, cost])
f=theano.function([x],gradient)
g=theano.function([x],gradient2,updates=grad2_updates)
print(f(20))
print(g(20))
最初のもの:
実際にエラーを除去するインナーループに「無視する」=オプションdisconnected_inputsを添加しないが、以下の簡単な例に示すように、もはや正しい出力を生成します20を含む配列。 2番目の配列は0を含む配列を出力します。
なぜこのような勾配を計算する必要がありますか?具体的な理由がある場合は、コード –
でより広範な例を提供してください。これは例です。ヘッセ行列の対角を計算することができれば、これは基本的なステップの1つです。 –
ああ、わかりました。計算コストが膨大で、巨大なものではなく必要なグラデーションを計算したいからです。 –