2017-07-18 4 views
1

ニューラルネットワークのバッチトレーニングに関する質問はほとんどありません。バッチトレーニングは更新の合計を使用しますか?または更新の平均?

まず、バッチトレーニングを使用してウェイトを更新すると、変化量はバッチサイズの累積勾配です。この場合、変化量は、勾配の合計であるか?または勾配の平均?

答えは勾配の和である場合には量が蓄積されているので、変化量は、オンライントレーニングよりもはるかに大きくなります。この場合、重みを最適化することはできません。

答えは勾配の平均値である場合にはそれ以外の場合は、うまく重みを最適化するために、非常に合理的なようです。しかし、この場合、データのバッチサイズに対して1回の重みしか更新しないため、オンライントレーニングよりもはるかに多くの時間を訓練する必要があります。

第2質問では、次のようにMNISTのTensorflowのCNNサンプルコードを使用すると、重みが非常に速く最適化できるため、トレーニングの精度は2番目のステップでも90%を超えます。

============================================== =========================

train_step = tf.train.GradientDescentOptimizer(0.001).minimize(cross_entropy) accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) for i in range(1000): batch = mnist.train.next_batch(100) if i%100 == 0: train_accuracy = sess.run(accuracy, feed_dict={x:batch[0], y_:batch[1], keep_prob: 1.0}) sess.run(train_step, feed_dict={x: batch[0], y_:batch[1], keep_prob:1.0})

================ ========================================== ======

Tensorflowはどのようにして重量を非常に速く最適化するのか説明してください。

答えて

0

この質問に対する回答は、あなたの損失機能によって異なります。

loss_elementは、バッチの一つの要素のためのあなたの損失関数である場合は、あなたのバッチの損失は、すべての個々の損失の一部の機能になります。

たとえば、tf.reduce_meanを使用すると、損失はバッチのすべての要素で平均化されます。グラデーションもそうです。 tf.reduce_sumを使用すると、グラデーションはすべてのグラデーションの要素ごとの合計になります。

0

これは、後で最も可能性の高い勾配の平均でバッチサイズによってアカウントへの分割を取る良い学習率を見つけなければならないので、勾配または平均勾配の合計を使用すると同じです。

しかし、バッチにわたる平均を使用すると、異なるバッチサイズを使用して、2回のトレーニングの間に匹敵する損失を有するという利点を有します。

関連する問題