web-dev-qa-db-ja.com

Adamオプティマイザーは20万回のバッチ処理の後、調子が悪くなり、トレーニングの損失が増大します

ネットワークをトレーニングする際に非常に奇妙な動作が見られました。数十万回の反復学習(8〜10時間)でうまく学習すると、すべてが壊れ、トレーニングの損失が増加します

Loss explodes

トレーニングデータ自体はランダム化され、それぞれ.tfrecordサンプルを含む多くの1000ファイルに分散され、入力ステージで再びシャッフルされ、200サンプルにバッチ処理されます。

背景

私は、4つの異なる回帰タスクを同時に実行するネットワークを設計しています。画像に表示されるオブジェクトの可能性を決定し、同時にその向きを決定します。ネットワークはいくつかの畳み込み層から始まり、一部は残余の接続を持ち、4つの完全に接続されたセグメントに分岐します。

最初の回帰では確率が生じるため、損失にはクロスエントロピーを使用していますが、他の回帰では古典的なL2距離を使用しています。ただし、その性質により、確率損失は0..1程度であり、方向損失は0..10のように大きくなる可能性があります。すでに入力値と出力値の両方を正規化し、クリッピングを使用しています

normalized = tf.clip_by_average_norm(inferred.sin_cos, clip_norm=2.)

事態が本当に悪化する可能性がある場合。

私は(成功して)Adamオプティマイザーを使用して、(reduce_sumingするのではなく)明確な損失をすべて含むテンソルを最適化しました。

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で学習率を維持するとさらに速く壊れます)。正則化もこれに影響を与えません。ある時点でこのようなことを一貫して行います。

また、トレーニングを停止して最後のチェックポイントから再開すると(トレーニング入力ファイルも再びシャッフルされることを意味する)、同じ動作になることを追加する必要があります。トレーニングは常にその時点で同様に動作するようです。

27
sunside

はい。これはアダムの既知の問題です。

アダムの方程式は

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。したがって、mvよりもはるかに速く変化します。 mはまだ小さく、追いつかないので、vは再び大きくなり始めることができます。

この問題を解決するには、epsilon10-8デフォルトでは。したがって、ほぼ0で割る問題を停止します。ネットワークによっては、epsilonの値が0.10.01、または0.001は良いかもしれません。

42
patapouf_ai

はい、これはある種の非常に複雑な不安定な数値/方程式のケースである可能性がありますが、損失が25Kまで急速に減少し、同じレベルで大きく振動するため、トレーニング率は単に高いだけです。 0.1倍に減らして、何が起こるかを確認してください。さらに低い損失値に到達できるはずです。

探検を続けてください! :)

3
Simanas