Adam Optimizer ile eğitim kaybı ve iterasyondaki ani artışların açıklaması


16

İ) SGD ve ii) Adam Optimizer kullanarak bir sinir ağı eğitimi alıyorum. Normal SGD kullanırken, aşağıda görüldüğü gibi (kırmızı olan) iterasyon eğrisine karşı pürüzsüz bir eğitim kaybı yaşarım . Ancak, Adam Optimizer'ı kullandığımda, eğitim kaybı eğrisinde bazı artışlar var. Bu ani yükselişlerin açıklaması nedir?

Model Detayları:

14 giriş düğümü -> 2 gizli katman (100 -> 40 birim) -> 4 çıkış birimi

Adam 'varsayılan parametreleri kullanıyorum beta_1 = 0.9, beta_2 = 0.999, epsilon = 1e-8ve batch_size = 32.

i) SGD ile ii) Adam ileSGD ile Adam ile


Gelecekte haber vermek için, ilk öğrenme oranınızı düşürmek
cesur

Yanıtlar:


12

Sivri uçlar, Adam ( batch_size=32) 'da Mini Toplu Gradyan İnişinin kaçınılmaz bir sonucudur . Bazı mini partiler optimizasyon için 'tesadüfen' şanssız verilere sahiptir, bu da Adam'ı kullanarak maliyet işlevinizde gördüğünüz ani artışlara neden olur. Stokastik gradyan inişini denerseniz (kullanmakla aynıdır batch_size=1) maliyet fonksiyonunda daha da fazla artış olduğunu görürsünüz. Aynı durum (Tam) Parti GD için de geçerli değildir, çünkü her bir optimizasyon çağındaki tüm eğitim verilerini kullanır (yani, parti boyutu eğitim setinizin kardinalitesine eşittir). İlk grafiğinizde olduğu gibi maliyet tekdüze bir şekilde azalıyor ( i) SGD ile ) yanlış görünüyor ve SGD yerine (Tam) Toplu Gradient Descent kullanıyorsunuz.

Coursera'daki harika Derin Öğrenme kursunda Andrew Ng bunu aşağıdaki görüntüyü kullanarak ayrıntılı olarak açıklıyor:

Maliyet fonksiyonları


2
'SGD ... tüm eğitim verilerini kullanıyor' - bundan emin misiniz? Bu, tüm veriler ileri beslendikten sonra ağırlıkların güncellendiği anlamına gelir, ancak buna sgd yerine tam toplu gd denir. Stokastik minibatch ima ediyor
Alex

@Alex'e hatamı işaret ettiğiniz için teşekkür ederim, düzelttim ve daha fazla bilgi için cevabı referansla geliştirdim.
xboard

@xboard - Hayır, birincisi için mini-toplu degrade iniş kullanıyorum.
Abdul Fatir

8

Patlayan degradeleri ve benzer davranışları ayıklamak için çılgınca zaman harcadım. Cevabınız kayıp fonksiyonuna, verilere, mimariye vb. Bağlı olacaktır. Yüzlerce nedeni var. Birkaçını adlandıracağım.

  • Zarar bağımlı. Mantıksallık kayıplarının kırpılması gerekir, eğer değilse, log(0)veri kümesindeki kötü tahminler / aykırı değerlerin yakınlarını değerlendirerek patlayan degradelere neden olabilir. Çoğu paket (meşale, tensorflow vb.) Kayıpları için varsayılan olarak kırpma uygular.
  • Veri kümesinde aykırı değerler.
  • Küçük parti ve büyük epsilon (hiperparametre) ile BatchNorm . gibi toplu işlerde , küçük ve yüksekϵy=(xu)/(s+ϵ)sϵy
  • Veri kümesinin toplu işle bölünememesi durumunda bir çağdaki son parti küçük olabilir. Meşale veri yükleyicide bir bayrak var drop_last. Küçük seri = yüksek varyans

Şimdi neden SGD ile değil Adam ile görüyorsunuz? Açıkçası Adam'la daha az zarara ulaştın. Daha önce belirtildiği gibi, veri kümesinin% 99,9'u bazı gözlemler dışında bir noktada optima'ya sahipse, bu gözlem "HAYIR" diye bağırıyor ve rastgele bir partiye seçildiğinde yerel minimadan atlıyor olabilir. Her dataset_size//batch_size+1adımda görürseniz, muhtemelen son toplu işin küçük olması nedeniyle. Bahse girerim, daha düşük zarara ulaşmasına izin verirseniz SGD'nin de yükseleceğini göreceksiniz.

Bonus: Momentum optimizer (Adam) ile gerçekten hızlı düşüşünüz, bazı katmanların (giriş katmanı? Çıkış katmanı?) Ölçek dışına (büyük / küçük ağırlıklara) başlatıldığı anlamına gelebilir.

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.