2016-05-31 6 views
1

私は、スキャン操作によって手動でウェイトベクトルに向かうスカラーコストの勾配を計算しようとします。しかし、それは仕事と常にサブテンソルは、勾配を算出することができることを確認するサブテンソルの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を含む配列を出力します。

+0

なぜこのような勾配を計算する必要がありますか?具体的な理由がある場合は、コード –

+0

でより広範な例を提供してください。これは例です。ヘッセ行列の対角を計算することができれば、これは基本的なステップの1つです。 –

+0

ああ、わかりました。計算コストが膨大で、巨大なものではなく必要なグラデーションを計算したいからです。 –

答えて

1

代わりに、各サブテンソルのためのスキャン機能の内部で勾配を計算しようとしているの、あなただけの事前勾配を計算し、次にあなたが

p2_grad = T.grad(cost,p2) 

def differentiate_element(i,p2): 
      p2element=p2[i] 
      return p2element 

p2elements_grads, h2_updates = theano.scan(differentiate_element, 
        sequences=T.arange(p2_grad.shape[0]), non_sequences=[p2_grad]) 

編集

を必要とするものを反復処理しなければなりませんヘッセ行列の対角を計算する際の主な関心事は、どのような場合でもヘッセ行列と計算資源を計算したくないということなので、Disconnected入力エラーを避けるためにできることは、disconnected_inputs='ignore' T.gradへのキーワードの入力

def differentiate_element(i, p2, c): 
    p2element = p2[i] 
    return T.grad(c, p2element, disconnected_inputs='ignore') 

h2, h2_updates = theano.scan(differentiate_element, 
          sequences=T.arange(p2.shape[0]), non_sequences=[p2, cost]) 
+0

しかし、p2の個々の要素のスキャンが機能しないのはなぜですか? –

+0

しかし、disconnected_inputsがなくても、そのようなスキャンは機能しません。それは微妙なことが分かりにくいという不満がある。 –

+1

エラーを再現する完全なコード例を提供できますか?私の場合、私は間違いがないからです。 –