İyi soru.
Bu fenomenle birkaç kez karşılaştım. İşte gözlemlerim:
Gradyan patlaması
Sebep: Büyük gradyanlar öğrenme sürecini yoldan çıkarır.
Beklemeniz gerekenler: Çalışma zamanı günlüğüne baktığınızda, yineleme başına kayıp değerlerine bakmalısınız. Kaybın yinelemeden yinelemeye önemli ölçüde artmaya başladığını fark edeceksiniz , sonunda kayıp bir kayan nokta değişkeni ile temsil edilemeyecek kadar büyük olacak ve bu hale gelecektir nan
.
Ne yapabilirsiniz:base_lr
(çözücü.prototxt dosyasında) bir büyüklük sırasıyla (en azından) azaltın . Birkaç kayıp katmanınız varsa, gradyan patlamasından hangi katmanın sorumlu olduğunu görmek için günlüğü incelemeniz loss_weight
ve genel katman yerine o belirli katman için (in train_val.prototxt) değerini azaltmanız gerekir base_lr
.
Kötü öğrenme oranı politikası ve parametreleri
Sebep: caffe geçerli bir öğrenme oranını hesaplayamaz ve alır 'inf'
veya 'nan'
onun yerine, bu geçersiz oran tüm güncellemeleri çarparak tüm parametreleri geçersiz kılar.
Beklemeniz gerekenler: Çalışma zamanı günlüğüne baktığınızda, öğrenme oranının kendisinin olduğunu görmelisiniz 'nan'
, örneğin:
... sgd_solver.cpp:106] Iteration 0, lr = -nan
Ne yapabilirsiniz:'solver.prototxt'
Dosyanızdaki öğrenme oranını etkileyen tüm parametreleri düzeltin .
Örneğin, kullanırsanız lr_policy: "poly"
ve max_iter
parametre tanımlamayı unutursanız , sonuçta lr = nan
...
Kafede öğrenme oranı hakkında daha fazla bilgi için bu konuya bakın .
Hatalı Kayıp işlevi
Sebep: Bazen kayıp katmanlarındaki kayıp hesaplamaları nan
s görünmesine neden olur . Örneğin, InfogainLoss
normalize edilmemiş değerlere sahip Besleme katmanı, hatalarla özel kayıp katmanı kullanma vb.
Beklemeniz gerekenler: Çalışma zamanı günlüğüne baktığınızda muhtemelen olağandışı bir şey fark etmeyeceksiniz: kayıp yavaş yavaş azalıyor ve aniden bir nan
beliriyor.
Ne yapabilirsiniz: Hatayı yeniden üretip üretemeyeceğinizi görün, çıktıyı kayıp katmanına ekleyin ve hatayı ayıklayın.
Örneğin: Bir keresinde cezayı bir partide etiket oluşma sıklığına göre normalleştiren bir kayıp kullandım. Öyle oldu ki, eğitim etiketlerinden biri partide hiç görünmüyorsa - hesaplanan kayıp nan
s. Bu durumda, yeterince büyük partilerle çalışmak (setteki etiketlerin sayısına göre) bu hatayı önlemek için yeterliydi.
Hatalı giriş
Sebep:nan
İçinde bir girdiniz var!
Beklemeniz gerekenler: öğrenme süreci bu hatalı girdiye "ulaştığında" - çıktı olur nan
. Çalışma zamanı günlüğüne baktığınızda muhtemelen olağandışı bir şey fark etmeyeceksiniz: kayıp yavaş yavaş azalıyor ve birdenbire nan
ortaya çıkıyor.
Ne yapabilirsiniz: giriş veri kümelerinizi yeniden oluşturun (lmdb / leveldn / hdf5 ...) eğitim / doğrulama kümenizde kötü görüntü dosyalarının bulunmadığından emin olun. Hata ayıklama için, giriş katmanını okuyan, üzerinde sahte bir kayıp olan ve tüm girişleri çalıştıran basit bir ağ oluşturabilirsiniz: eğer bunlardan biri hatalıysa, bu sahte ağ da üretmelidir nan
.
"Pooling"
katmanda çekirdek boyutundan daha büyük adımlarla ilerlemek
Bazı nedenlerden dolayı, havuzlama için stride
> seçilmesi s kernel_size
ile sonuçlanabilir nan
. Örneğin:
layer {
name: "faulty_pooling"
type: "Pooling"
bottom: "x"
top: "y"
pooling_param {
pool: AVE
stride: 5
kernel: 3
}
}
nan
s ile sonuçlanır y
.
Dengesizlikler "BatchNorm"
Bazı ayarlar "BatchNorm"
katmanında nan
sayısal kararsızlıklardan dolayı çıktı verilebileceği bildirildi .
Bu sorun bvlc / caffe'de ortaya çıktı ve PR # 5136 bunu düzeltmeye çalışıyor.
Kısa bir süre önce, debug_info
işaretin ayarlanması debug_info: true
, 'solver.prototxt'
caffe print'in eğitim sırasında daha fazla hata ayıklama bilgisini (gradyan büyüklükleri ve aktivasyon değerleri dahil) günlüğe kaydetmesini sağlayacaktır: Bu bilgi , eğitim sürecindeki gradyan patlamalarını ve diğer sorunları tespit etmeye yardımcı olabilir .