Çok uzun süre antrenman yaparken Adam optimizer ile garip davranış


11

Ben 64 rastgele oluşturulan veri noktalarında tek bir algılayıcı (1000 giriş birimleri, 1 çıkış, hiçbir gizli katmanları) eğitmek çalışıyorum. Adam optimizer kullanarak Pytorch kullanıyorum:

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()

Başlangıçta, kayıp beklendiği gibi hızla azalır:

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

Yaklaşık 300 yineleme, hata sıfıra yaklaşır:

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

Bu birkaç bin yineleme için devam eder. Ancak, çok uzun süre egzersiz yaptıktan sonra hata tekrar artmaya başlar:

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

Bu neden oluyor?


Aşırı takmanın bunu açıkladığını sanmıyorum - eğitim kaybı artıyor, doğrulama kaybı değil. Örneğin, bu sadece SGD ile SGD kullanılırken gerçekleşmez.
Bai Li

Model 1000 parametreye sahiptir ve sadece 1 veri noktası vardır, bu nedenle model verilere tam olarak uymalı ve kayıp sıfır olmalıdır.
Bai Li

Üzgünüm, haklısın. 64 veri noktası vardır.
Bai Li

64 veri noktası (yani, kısıtlamalar) ve 1000 parametre vardır, bu nedenle hatanın sıfır olması için parametreler için seçenekler bulmak mümkündür (ve bunu analitik olarak yapmak kolaydır). Benim sorum Adamdem neden bunu bulamıyor.
Bai Li

Yanıtlar:


19

Yakınsama sonundaki bu küçük istikrarsızlık, Adem'in (ve RMSProp) bir özelliğidir, çünkü son adımlara göre ortalama gradyan büyüklüklerini nasıl tahmin eder ve bunlara böler.

Adam'ın yaptığı bir şey, son degradelerin ve degradelerin karelerinin yuvarlanan geometrik ortalamasını korumaktır. Degradelerin kareleri, mevcut basamağa karar vermek için mevcut degradeyi bölmek (başka bir yuvarlanma ortalaması) bölmek için kullanılır. Bununla birlikte, gradyanınız haline geldiğinde ve sıfıra çok yakın olduğunda, bu, gradyanın karelerinin o kadar düşük olmasını sağlar ki, büyük yuvarlama hatalarına sahip olurlar veya etkili bir şekilde sıfır olurlar, bu da kararsızlığa neden olabilir (örneğin, uzun vadeli kararlı bir gradyan bir boyut diğer parametrelerdeki değişiklikler nedeniyle ile arasında nispeten küçük bir adım oluşturur ) ve adım boyutu yeniden yerleşmeden önce atlamaya başlar.1010105

Bu aslında Adem'i, hesaplamalarınız sorununuza izin verdiği için sıfır kaybına sayısal olarak yaklaşmak istediğinizi varsayarsak, probleminiz için daha temel degrade inişten daha az kararlı ve daha kötü hale getirir.

Derin öğrenme problemleri üzerinde pratikte, bunu yakınsamaya yakınlaştırmazsınız (ve erken durma gibi bazı düzenleme teknikleri için, yine de istemezsiniz), bu yüzden genellikle problem türleri için pratik bir endişe değildir. Adam için tasarlandı.

Aslında farklı RMSProp için bunun farklı optimizasyonların karşılaştırılmasında görebilirsiniz (RMSProp siyah çizgidir - hedefe ulaştığında son adımları izleyin):

resim açıklamasını buraya girin

Öğrenme oranını azaltarak Adem'i daha istikrarlı hale getirebilir ve gerçek yakınlaşmaya yaklaşabilirsiniz. Örneğin

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

Optimize etmek daha uzun sürecektir. lr=1e-5Kararsızlığı görmeden önce 20.000'den fazla yineleme için kullanmanız gerekir ve kararsızlık daha az dramatiktir, değerler civarında seyreder .107


Bu muhteşem bir görselleştirme, Neil. Gerçek boyutlar nelerdir? X ve y neyi temsil eder? Çerçeveler, kare başına delta t veya n dönemleri midir? Ben yıldız seçilen iki parametreye göre eşitsizliğin (hata) topografik bir sunumda küresel optimum olduğunu tahmin ediyorum. Tahminim doğru mu?
Douglas Daseeco

Bu benim görselleştirmem değil, birçok yerde bulacaksınız. Boyutlar, bir test fonksiyonuna isteğe bağlı giriş parametreleri birimleridir ve grafik, bu fonksiyon için kontur çizgileri gösterir (yine NN'nin çalışması için rasgele birimlerde muhtemelen ölçeklendirilmiş). Her kare bir ağırlık güncelleme adımıdır. Muhtemelen bir mini-toplu güncelleme ile eşdeğerdir ve SGD'nin davranışı nedeniyle, aslında test fonksiyonunun gerçek gradyanını kullanarak tam olarak çözülmesini beklerim - yani veri kümesi veya örnekleme yoktur.
Neil Slater

1

Nedeni, diğer cevapta da belirtildiği gibi, bu problemi küçük gradyanlar etrafında önlemek için daha küçük bir öğrenme oranı kullanmak için büyük bir öneridir.

Birkaç yaklaşım düşünebilirim:

  1. Degradeleri bir üst / alt sınırla kırpabilirsiniz, ancak bu, yakınsamayı garanti etmez ve bazı yerel minimalarda sıkışıp kalarak eğitimin donmasına neden olabilir.

  2. Daha yüksek parti boyutu, daha fazla dönem ve azaltılmış bir öğrenme oranı ile eğitim alın. Şimdi, bir parti boyutunu arttırmanın daha iyi degradelerle sonuçlandığına dair pratik bir kanıtım yok, ancak sizinkiyle benzer sorunlarla karşılaşarak gözlemlediğimden, bunu yapmak neredeyse her zaman yardımcı oldu.

İstatistiklere göre en uygun öğrenme oranını bulmaya çalışan başka yöntemler ( döngüsel öğrenme oranı vb.) Olduğundan eminim .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.