ネットワークをトレーニングする際に非常に奇妙な動作が見られました。数十万回の反復学習(8〜10時間)でうまく学習すると、すべてが壊れ、トレーニングの損失が増加します:
トレーニングデータ自体はランダム化され、それぞれ.tfrecord
サンプルを含む多くの1000
ファイルに分散され、入力ステージで再びシャッフルされ、200
サンプルにバッチ処理されます。
私は、4つの異なる回帰タスクを同時に実行するネットワークを設計しています。画像に表示されるオブジェクトの可能性を決定し、同時にその向きを決定します。ネットワークはいくつかの畳み込み層から始まり、一部は残余の接続を持ち、4つの完全に接続されたセグメントに分岐します。
最初の回帰では確率が生じるため、損失にはクロスエントロピーを使用していますが、他の回帰では古典的なL2距離を使用しています。ただし、その性質により、確率損失は0..1
程度であり、方向損失は0..10
のように大きくなる可能性があります。すでに入力値と出力値の両方を正規化し、クリッピングを使用しています
normalized = tf.clip_by_average_norm(inferred.sin_cos, clip_norm=2.)
事態が本当に悪化する可能性がある場合。
私は(成功して)Adamオプティマイザーを使用して、(reduce_sum
ingするのではなく)明確な損失をすべて含むテンソルを最適化しました。
reg_loss = tf.reduce_sum(tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES))
loss = tf.pack([loss_probability, sin_cos_mse, magnitude_mse, pos_mse, reg_loss])
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate,
epsilon=self.params.adam_epsilon)
op_minimize = optimizer.minimize(loss, global_step=global_step)
TensorBoardで結果を表示するには、実際に
loss_sum = tf.reduce_sum(loss)
スカラーの要約用。
Adamは学習率1e-4
およびepsilon 1e-4
に設定されています(epislonのデフォルト値で同じ動作が見られ、1e-3
で学習率を維持するとさらに速く壊れます)。正則化もこれに影響を与えません。ある時点でこのようなことを一貫して行います。
また、トレーニングを停止して最後のチェックポイントから再開すると(トレーニング入力ファイルも再びシャッフルされることを意味する)、同じ動作になることを追加する必要があります。トレーニングは常にその時点で同様に動作するようです。
はい。これはアダムの既知の問題です。
アダムの方程式は
t <- t + 1
lr_t <- learning_rate * sqrt(1 - beta2^t) / (1 - beta1^t)
m_t <- beta1 * m_{t-1} + (1 - beta1) * g
v_t <- beta2 * v_{t-1} + (1 - beta2) * g * g
variable <- variable - lr_t * m_t / (sqrt(v_t) + epsilon)
ここで、m
は平均勾配の指数移動平均であり、v
は勾配の二乗の指数移動平均です。問題は、長時間トレーニングしていて、最適に近い場合、v
が非常に小さくなる可能性があることです。その後、突然すべての勾配が再び増加し始めると、非常に小さな数で除算されて爆発します。
デフォルトではbeta1=0.9
およびbeta2=0.999
。したがって、m
はv
よりもはるかに速く変化します。 m
はまだ小さく、追いつかないので、v
は再び大きくなり始めることができます。
この問題を解決するには、epsilon
(10-8
デフォルトでは。したがって、ほぼ0で割る問題を停止します。ネットワークによっては、epsilon
の値が0.1
、0.01
、または0.001
は良いかもしれません。
はい、これはある種の非常に複雑な不安定な数値/方程式のケースである可能性がありますが、損失が25Kまで急速に減少し、同じレベルで大きく振動するため、トレーニング率は単に高いだけです。 0.1倍に減らして、何が起こるかを確認してください。さらに低い損失値に到達できるはずです。
探検を続けてください! :)