Eser sahibi: Slav Ivanov
Çeviri: Wu Jindi
Redaksiyon: Ding Nanya
Bu makale hakkında 4400 kelime , 12 dakika okumanız tavsiye edilir.
Bu makale, sinir ağları oluşturma sürecinde hataya açık 37 noktayı listeler ve çözümler için öneriler sunar.
Bir ağ 12 saat eğitildi. Her şey iyi görünüyor: gradyan yavaş yavaş değişiyor ve kayıp azalıyor. Ancak bir sonraki tahmin: tümü sıfırdır ve tüm görüntü arka planları algılanmaz. "Neyi yanlış yaptım?" - Bilgisayarıma sordum ama cevap vermedi.
Modelinizin çöp çıktısı verip vermediğini kontrol etmeye nereden başlıyorsunuz (örneğin, tahmin ortalama değeri veriyor mu yoksa doğruluğu gerçekten kötü)?
Pek çok nedenden dolayı, sinir ağları eğitilemeyebilir. Çoğu hata ayıklama sürecinde kendimi aynı kontrolleri yaparken buluyorum. Deneyimlerimi ve en iyi fikirlerimi bu kullanışlı listede derledim ve sizin için yararlı olacağını umuyorum.
Pek çok şey ters gidebilir. Ancak bazılarının diğerlerine göre korunma olasılığı daha yüksektir. Acil bir ilk yanıt olarak genellikle aşağıdaki kısa listeyle başlıyorum:
Yukarıdaki adımlar sorunu çözmezse, aşağıdaki listeye göre tek tek doğrulayın.
Ağa girdiğiniz verilerin mantıklı olup olmadığını kontrol edin. Örneğin, görüntünün genişliğini ve yüksekliğini birden fazla kez karıştırdım. Bazen, 0 verinin tamamını yanlış giriyorum. Ya da aynı partiyi defalarca kullanacağım. Bu nedenle, doğru olduklarından emin olmak için birkaç grup girdi ve hedef çıktı yazdırın / görüntüleyin.
Hatanın aynı olup olmadığını görmek için gerçek veriler yerine rastgele sayılar aktarmayı deneyin. Öyleyse, bu, ağınızın verileri bir noktada çöpe çevirdiğine dair kesin bir işarettir. Neyin yanlış gittiğini görmek için katman veya işlem bazında hata ayıklamayı deneyin.
Verileriniz iyi olabilir, ancak girişi ağa ileten kod yanlış olabilir. Herhangi bir işlemden önce ilk katmanın girişini yazdırın ve kontrol edin.
Bazı giriş örneklerinin doğru etiketlere sahip olup olmadığını kontrol edin. Aynı zamanda, giriş örneğini karıştırmanın yolunun çıktı etiketiyle aynı olduğundan emin olun.
Belki girdi-çıktı ilişkisinin rastgele olmayan kısmı, rastgele kısma kıyasla çok küçüktür (hisse senedi fiyatının böyle olduğu düşünülebilir). Yani, girdi ve çıktı yeterince ilişkilendirilmemiştir. Bunu tespit etmek için evrensel bir yöntem yoktur, çünkü bu, verilerin doğasına bağlıdır.
Bu, bir yemek web sitesinden bir görüntü veri setini aldığımda başıma geldi. Web'in öğrenemeyeceği birçok kötü etiket var. Etiketin normal olup olmadığını görmek için bir grup giriş örneğini manuel olarak kontrol edin.
Kesme noktası tartışmalıdır çünkü bu makale (https://arxiv.org/pdf/1412.6596.pdf) MNIST'i% 50'den fazla doğru yapmak için% 50 hasarlı bir etiket kullanır.
Veri kümeniz karıştırılmazsa ve belirli bir sıraya sahipse (etikete göre sıralanırsa), bunun öğrenme üzerinde olumsuz bir etkisi olabilir. Bu durumu önlemek için veri kümenizi karıştırın. Giriş ve etiket karıştırma sırasının aynı olduğundan emin olun.
Her B kategorisi resmi 1000 A kategorisi resmine karşılık geliyor mu? O zaman kayıp fonksiyonunuzu dengelemeniz veya diğer dengesiz yöntemleri denemeniz gerekebilir. (Https://machinelearningmastery.com/tactics-to-combat-imbalanced-classes-in-your-machine-learning-dataset/)
Bir ağı sıfırdan eğitiyorsanız (yani, ince ayar yapmıyorsanız), çok fazla veriye ihtiyacınız olabilir. Görüntü sınıflandırması için, insanlar her sınıfın 1000 veya daha fazla görüntü gerektirdiğini düşünüyor.
(Https://stats.stackexchange.com/questions/226672/how-few-training-examples-is-too-few-when-training-a-neural-network/226693#226693)
Bu, sıralı bir veri kümesinde gerçekleşebilir (yani, ilk 10k örnek aynı sınıfı içerir). Veri setini karıştırarak çözmek kolaydır.
Bu makale (https://arxiv.org/abs/1609.04836), daha büyük bir parti boyutunun modelin genelleme yeteneğini azaltacağına işaret etmektedir.
1 hariç. Standart veri setlerini kullanın (ör. Mnist, cifar10)
Teşekkürler @hengcherkeng:
Yeni ağ mimarilerini test ederken veya yeni kod yazarken, önce kendi verileriniz yerine standart veri kümelerini kullanın. Bunun nedeni, bu veri setleri için birçok referans sonucunun bulunması ve bunların "çözülebilir" oldukları kanıtlanmış olmasıdır. Etiket gürültüsü, eğitim / test dağıtım farklılıkları ve veri seti zorluğu gibi sorunlar yoktur.
Girdiyi sıfır ortalamaya ve birim varyansa standartlaştırdınız mı?
Geliştirmenin düzenleyici bir etkisi vardır. Diğer düzenleme biçimleriyle (ağırlık L2, bırakma, vb.) Çok fazla birleştirildiğinde ağ uyumsuzluğuna neden olur.
Önceden eğitilmiş bir model kullanıyorsanız, eğitim sırasında kullanılan modelle aynı normalleştirme ve ön işlemeyi kullandığınızdan emin olun. Örneğin, bir görüntü pikselinin içinde mi yoksa aralık içinde mi olması gerektiği.
CS231n, yaygın bir tuzağa dikkat çekti:
"... Herhangi bir ön işleme istatistiği (ör. Veri ortalaması) yalnızca eğitim verileri üzerinden hesaplanmalı ve ardından doğrulama / test verilerine uygulanmalıdır. Örneğin, ortalamayı hesaplayın ve tüm veri kümesindeki her bir görüntüden çıkarın, ardından verileri ekleyin Eğitim setine / doğrulama setine / test setine bölmek bir hatadır. "
Ek olarak, her bir numunenin veya partinin farklı ön işlemlerini kontrol edin.
Bu, sorunun bulunmasına yardımcı olacaktır. Örneğin, hedef çıktı bir nesne sınıfı ve koordinatlarsa, tahmini nesne sınıfıyla sınırlandırmaya çalışın.
Ayrıca mükemmel CS231n'den: küçük parametre başlatma kullanın, düzenleme yok. Örneğin, 10 sınıfımız varsa, rasgele, doğru sınıfı% 10 oranında alacağımız anlamına gelir ve Softmax kaybı, doğru sınıfın olasılığının logaritmasının tersidir, yani: -ln (0.1) = 2.302.
Bundan sonra, kaybı artıracak olan düzenlilik gücünü artırmaya çalışın.
Kendi kayıp fonksiyonunuzu uygularsanız, lütfen hata olup olmadığını kontrol edin ve birim testleri ekleyin. Normalde, kayıp değerim biraz yanlış olacak ve ağ performansını bir miktar azaltacaktır.
Çerçeve tarafından sağlanan kayıp işlevini kullanıyorsanız, beklenen değeri ilettiğinizden emin olun. Örneğin, PyTorch'ta, NLLLoss ve CrossEntropyLoss'u karıştıracağım çünkü ilki softmax girişi gerektiriyor ve ikincisi gerektirmiyor.
Kayıp birkaç küçük kayıp işlevinden oluşuyorsa, her bir kayıp işlevinin boyutuna göre doğru olduklarından emin olun. Bu, farklı kayıp ağırlıklarının bir kombinasyonunun test edilmesini gerektirebilir.
Bazen, ağınızın normal eğitim alıp almadığına karar vermek için kayıp en iyi öngörü değildir. Mümkünse, lütfen doğruluk gibi diğer ölçütleri kullanın.
Ağın belirli bir katmanını kendiniz mi uyguladınız? Beklendiği gibi çalıştıklarından emin olmak için lütfen iki kez kontrol edin.
Öğrenilmesi gereken bazı katmanların / değişkenlerin gradyan güncellemesini yanlışlıkla devre dışı bırakıp bırakmadığınızı kontrol edin.
Belki ağınızın ifade gücü, hedef işlevi yakalamak için yeterli değildir. Tamamen bağlı katmana daha fazla katman veya daha fazla gizli birim eklemeye çalışın.
Girişiniz (k, H, W) = (64, 64, 64) ise, yanlış boyutla ilgili hataları göz ardı etmek kolaydır. Girdi boyutları için garip sayılar kullanın (örneğin, her boyut için farklı asal sayılar kullanın) ve bunların ağa nasıl yayıldığını kontrol edin.
Gradyan inişini manuel olarak uygularsanız, gradyan kontrolü geri yayılımınızın düzgün çalıştığından emin olabilir. Daha fazla bilgi için, bkz:
1
2
3https: //www.coursera.org/lecture/machine-learning/gradient-checking-Y3s6r
5. Eğitim sorunları
Verilerin küçük bir bölümünü aşırı doldurun ve düzgün çalıştığından emin olun. Örneğin, yalnızca 1 veya 2 örnek eğitin ve ağınızın bunları ayırt etmeyi öğrenip öğrenemeyeceğine bakın. Her kategori için daha fazla örnek eklemeye devam edin.
Emin değilseniz, lütfen yeniden başlatmak için Xavier veya He'yi kullanın. Ek olarak, başlatmanız yanlış yerel minimumlara neden olabilir, bu nedenle farklı bir başlatma deneyin ve yardımcı olup olmadığına bakın.
Belki özellikle kötü bir hiperparametre seti kullanıyorsunuzdur. Mümkünse, ızgara aramayı deneyin.
Çok fazla düzenleme, ciddi ağ uyumsuzluğuna neden olur. Bırakma, parti normu, ağırlık / önyargı L2 regülasyonu vb. Gibi düzenliliği azaltın. Mükemmel "Programcı Uygulaması Derin Öğrenme" kursunda, Jeremy Howard önce uygun olmayanlardan kurtulmayı öneriyor. Bu, aşırı uyum sorununu çözmeden önce eğitim verilerini yeterince fazla sığdırmanız gerektiği anlamına gelir.
Belki de ağınızın anlamlı tahminler yapmaya başlamadan önce eğitilmesi daha uzun sürüyor. Kaybınız giderek azalıyorsa, daha fazla zaman için çalışın.
Bazı çerçeveler Toplu Norm ve Bırakma gibi katmanlara sahipken, diğer katmanlar eğitim ve test sırasında farklı davranır. Uygun moda geçmek, ağınızın doğru şekilde tahmin etmesine yardımcı olabilir.
"Ağırlıklar için, bu histogramlar bir süre sonra yaklaşık bir Gauss (normal) dağılıma sahip olmalıdır. Sapmalar için, bu histogramlar genellikle 0'da başlar ve genellikle yaklaşık bir Gauss dağılımı ile biter (LSTM bir istisnadır). Bu sapmaları not edin +/- parametreleri. Bu çok büyük ofsetlere dikkat edin. Kategorilerin dağılımı çok dengesizse, bazen çıktı katmanında sınıflandırılabilir. "
Katmanları güncellemeler için kontrol edin, bir Gauss dağılımı oluşturmaları gerekir.
Özellikle kötü hiper parametreleri seçmediğiniz sürece, seçtiğiniz optimize edici ağınızın eğitim almasını engellememelidir. Ancak, uygun bir görev optimize edici, en kısa sürede en fazla eğitimi almanıza yardımcı olur. Kağıt, kullandığınız algoritmanın bir optimize edici belirtmesi gerektiğini belirtir. Değilse, Adam'ı veya sıradan SGD'yi ivme ile kullanma eğilimindeyim.
Gradyan iniş iyileştirici hakkında daha fazla bilgi edinmek için Sebastian Ruder tarafından yazılan bu mükemmel makaleye göz atın.
Düşük bir öğrenme oranı, modelinizin çok yavaş yakınsamasına neden olacaktır.
Yüksek bir öğrenme oranı, başlangıçta kaybı hızla azaltacaktır, ancak iyi bir çözüm bulmak zor olabilir.
Sorunu çözmek için mevcut öğrenme oranınızı 0,1 veya 10 ile çarpın.
RNN'yi eğitirken, bildiğim kadarıyla, bir NaN (Sayı Olmayan) almak daha büyük bir sorundur. Bazı çözümler:
Bir şey mi kaçırıyorum? Bir sorun mu var? Lütfen bana bildirmek için aşağıya bir yorum bırakın.
Merhaba arkadaşım, ben Slav, girişimci ve geliştiriciyim. Ayrıca, SaaS şirketi Encharge-pazarlama otomasyon yazılımının kurucu ortağıyım.
Orijinal Başlık: Nöral Ağınızın çalışmamasının 37 nedeni
Orijinal bağlantı: https://blog.slavv.com/37-reasons-why-your-neural-network-is-not-working-4020854bd607
Editör: Wang Jing
Redaksiyon: Lin Yilin
Çevirmen Profili
Wu Jindi , Syracuse Üniversitesi Bilgisayar Bilimleri Yüksek Lisansının ilk yılı. Zorluklarla yüzleşmek benim için en rahat durumdur, yapamadığım şeylere katlanmaya meyilliyim. Amacım erken yatıp erken kalkan bir Havalı Kız olmak.
Tsinghua-Qingdao Veri Bilimi Enstitüsü'nün resmi WeChat kamu platformunu takip edin " THU Veri Pastası "Ve kız kardeş numarası" Veri Pastası THU "Daha fazla ders avantajı ve kaliteli içerik elde edin.