トレーニングが長すぎる場合のAdamオプティマイザーの奇妙な動作


11

私は64個のランダムに生成されたデータポイントで単一のパーセプトロン(1000入力ユニット、1出力、非表示レイヤーなし)をトレーニングしようとしています。私はAdamオプティマイザを使用してPytorchを使用しています:

import torch
from torch.autograd import Variable

torch.manual_seed(545345)
N, D_in, D_out = 64, 1000, 1

x = Variable(torch.randn(N, D_in))
y = Variable(torch.randn(N, D_out))

model = torch.nn.Linear(D_in, D_out)
loss_fn = torch.nn.MSELoss(size_average=False)

optimizer = torch.optim.Adam(model.parameters())
for t in xrange(5000):
  y_pred = model(x)
  loss = loss_fn(y_pred, y)

  print(t, loss.data[0])

  optimizer.zero_grad()
  loss.backward()
  optimizer.step()

最初は、予想どおり損失が急速に減少します。

(0, 91.74887084960938)
(1, 76.85824584960938)
(2, 63.434078216552734)
(3, 51.46927261352539)
(4, 40.942893981933594)
(5, 31.819372177124023)

約300回の反復で、エラーはほぼゼロに達します。

(300, 2.1734419819452455e-12)
(301, 1.90354676465887e-12)
(302, 2.3347573874232808e-12)

これは数千回繰り返されます。ただし、トレーニングが長すぎると、エラーが再び増加し始めます。

(4997, 0.002102422062307596)
(4998, 0.0020302983466535807)
(4999, 0.0017039275262504816)

なんでこんなことが起こっているの?


オーバーフィッティングがそれを説明しているとは思いません-検証の損失ではなく、トレーニングの損失が増えています。たとえば、これはSGDを使用する場合には発生せず、Adamでのみ発生します。
Bai Li

モデルには1000個のパラメーターがあり、データポイントは1つしかないため、モデルはデータに正確に適合し、損失はゼロでなければなりません。
Bai Li

ああ、ごめんなさい。64個のデータポイントがあります。
Bai Li

64個のデータポイント(つまり、制約)と1000個のパラメーターがあるため、エラーがゼロになるようにパラメーターの選択肢を見つけることができます(これは分析的に簡単です)。私の質問は、アダムがこれを見つけられない理由です。
Bai Li

回答:


19

収束の最後でのこの小さな不安定性は、最近のステップでの平均勾配の大きさを推定してそれで除算する方法に起因する、Adam(およびRMSProp)の機能です。

1010105

これは実際には、計算が問題を許容するのと同じくらい数値的にゼロ損失に近づけたいと仮定すると、より基本的な勾配降下法よりも問題に対してAdamの安定性が低下し、悪化します。

ディープラーニングの問題の実践では、これは収束に近づきません(そして、早期停止などのいくつかの正則化手法では、とにかく使いたくありません)。そのため、通常、問題の種類に関する実用的な問題ではありません。アダムはのために設計されました。

実際には、さまざまなオプティマイザーの比較でRMSPropのこれが発生していることを確認できます(RMSPropは黒い線です-目標に到達したときの最後のステップに注意してください)。

ここに画像の説明を入力してください

学習率を下げることで、Adamをより安定させ、真の収束に近づけることができます。例えば

optimizer = torch.optim.Adam(model.parameters(), lr=1e-5)

lr=1e-5107


これは素晴らしい視覚化です、ニール。実際の寸法は?xとyは何を表していますか?フレームは、フレームごとにいくつかのデルタtまたはnエポックですか?星は、選択された2つのパラメーターに関連する視差(誤差)の地形表現において、全体的に最適であると思います。私の推測は正しいですか?
ダグラスダシーコ2018

それは私の視覚化ではありません、あなたはそれを多くの場所で見つけるでしょう。次元はテスト関数への入力パラメーターの任意の単位であり、グラフはその関数の等高線を示します(これも任意の単位で、おそらくNNが正常に機能するようにスケーリングされています)。各フレームは、重みの更新ステップです。これはおそらくミニバッチ更新と同等であり、SGDの動作により、実際にはテスト関数の真の勾配を使用して正確に解決されていると予想されます。つまり、データセットやサンプリングはありません。
Neil Slater

1

その理由は、他の回答で述べたとおりであり、小さな勾配の周りでこの問題を回避するために、より小さな学習率を使用するという大きな提案があります。

私はいくつかのアプローチを考えることができます:

  1. グラデーションを上限/下限でクリップできますが、これは収束を保証するものではなく、一部の極小値に閉じ込められてそれから抜け出すことができないため、トレーニングがフリーズする可能性があります。

  2. より高いバッチサイズ、より多くのエポック、および減衰した学習率でトレーニングします。今、私はバッチサイズを増やすとより良い勾配が得られるという実際的な証拠はありませんが、あなたと同じような問題に直面して観察したことから、そうすることはほとんど常に助けになります。

統計に基づいて最適な学習率を見つけようとする他の方法(循環学習率など)があると確信しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.