2016-09-01 4 views
0

私は、コスト関数の期待値の誤差を使用して確率モデルを更新し、重みのランダムサンプルを描画する必要があるNNの確率モデルに取り組んでいます(基本的に、Monte Carloサンプル)。つまり、さまざまなウェイトサンプルに対してNN回x回進む必要があり、コストの期待値を計算し、最後に期待値の誤差をバックプロパゲーティングする必要があります(すべて同じ実行)。 new_cost_sampleが一様分布からの別のランダムサンプリング数uと重み変数wを乗算した結果であるべき1回の実行で同じopの異なる結果を計算する効果的な方法はありますか?

w = tf.Variable(1.0) # the weights of the NN 
u = tf.random_uniform([1]) # Random generator 
cost = tf.mul(w,u) 

# here I wish to take 10 MC samples 
for i in range(9): 
    # this is the part which I dont know how to implement 
    cost = tf.add(cost,new_cost_sample) 

cost_mean = cost/10.0 

train = tf.train.GradientDescentOptimizer(lrate).minimize(cost_mean) 

with tf.Session() as sess: 
    tf.initialize_all_variables().run() 
    sess.run(train) 

: はここに私がしたいものの単純化した例です。

Tensorflowは同じ順路中に演算子の値を格納するため、costを複数回呼び出すことはできません。 sess.run(cost)を10回使用してその期待値を計算することができましたが、このエラーをトレーニングオペレーションに与える方法はわかりません。

ランダムジェネレータのプレースホルダを使用してネットワークにフィードする可能性もありますが、これは大きなNNのためにはかなりのスペースを必要とし、これが最もエレガントで効果的な方法ではないと思いますこれを実装する。

opに同じ実行中に値を再計算するように指示する方法はありますか?これを実装する効果的な方法を考えてもいいですか? ありがとう!

答えて

0

私はforループを使ってcost_meanを計算しません。それは効率的ではありません。代わりに、私はむしろtf.reduce_mean()で平均を計算するベクトル化実装を使用します。

w = tf.Variable(1.0) # the weights of the NN 
u = tf.random_uniform([10]) # Random generator 
cost = tf.mul(w, u) 
cost_mean = tf.reduce_mean(cost) 
+0

私はそうすることによって、参照の問題は、この実装は簡単に空間の膨大な量を取ることができるということです。 NNの各重みに対して10のベクトルを持ちます。これは、異なる重みを持つ10 NNを持つことに相当します。 フォワードパスごとに別の乱数を生成し、コストの合計を(または他の方法で)計算して、NNのサイズを同じに保つことができれば、より良いでしょう。 – Simon

+0

私はこれがあなたの最初のアイデアのようにスペース効率が良いと思います。値を生成するためにtf.random_uniform()を使用しているだけで、変数として格納していません。私はこれが役立つことを願っています、私はそれを行うためのよりよい方法を想像することはできません:) – rvinas

関連する問題