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=(x−u)/(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+1
adı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.