私は、コスト関数の期待値の誤差を使用して確率モデルを更新し、重みのランダムサンプルを描画する必要がある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に同じ実行中に値を再計算するように指示する方法はありますか?これを実装する効果的な方法を考えてもいいですか? ありがとう!
私はそうすることによって、参照の問題は、この実装は簡単に空間の膨大な量を取ることができるということです。 NNの各重みに対して10のベクトルを持ちます。これは、異なる重みを持つ10 NNを持つことに相当します。 フォワードパスごとに別の乱数を生成し、コストの合計を(または他の方法で)計算して、NNのサイズを同じに保つことができれば、より良いでしょう。 – Simon
私はこれがあなたの最初のアイデアのようにスペース効率が良いと思います。値を生成するためにtf.random_uniform()を使用しているだけで、変数として格納していません。私はこれが役立つことを願っています、私はそれを行うためのよりよい方法を想像することはできません:) – rvinas