Sinir ağım öğrenemediğinde ne yapmalıyım?


147

Bir sinir ağı eğitimi alıyorum ama eğitim kaybı azalmıyor. Bunu nasıl düzeltebilirim?

Fazla abartma ya da düzenli olma hakkında soru sormuyorum. Ağımın performansının eğitim setinde düzelmediği problemi nasıl çözeceğimi soruyorum .


Bu soru kasıtlı olarak geneldir, böylece bir sinir ağını nasıl eğiteceğiniz hakkındaki diğer sorular, bunun bir kopyası olarak kapatılabilir; "bir erkeğe balık verirseniz, onu bir gün boyunca beslerseniz, ancak bir şey öğretirseniz" Balık tutmak için, hayatının geri kalanında onu besleyebilirsiniz. " Bir tartışma için bu Meta başlığına bakın: "Sinir ağım çalışmıyor, lütfen düzeltin" sorularını yanıtlamanın en iyi yolu nedir?

Sinir ağınız iyi genelleşmiyorsa, bakınız: Sinir ağım iyi genellemediğinde ne yapmalıyım?


1
İşte NN'in ilerleyemediği bir durum. youtu.be/iakFfOmanJU?t=144
Joshua

4
Ivanov'un blogu " Sinir Ağınızın neden çalışmadığının sebepleri ", özellikle II, III ve IV. Bölümler yardımcı olabilir.
user5228

Yanıtlar:


187

Ünite Testi Arkadaşınız

Yazarlar arasında “Tüm yazılar yeniden yazmaktır” diye bir söz vardır - yani, yazının büyük kısmı gözden geçirilir. Programcılar için (veya en azından veri bilimcileri) ifade, "Tüm kodlama hata ayıklama" şeklinde yeniden ifade edilebilir.

Ne zaman kod yazıyorsanız, kullanım amacına uygun olduğunu doğrulamanız gerekir. Doğruluğunu onaylamak için şimdiye kadar bulduğum en iyi yöntem, kodunuzu küçük bölümlere ayırmak ve her bölümün çalıştığını doğrulamaktır. Bu, segment çıktısını, doğru cevap olduğunu bildiğinizle karşılaştırarak yapılabilir. Buna birim testi denir . İyi birim testleri yazmak, iyi bir istatistikçi / veri bilimci / makine öğrenimi uzmanı / sinir ağı pratisyeni olmanın anahtar bir parçasıdır. Sadece hiçbir yedek yoktur.

Ağ performansını ayarlamadan önce, kodunuzun hatasız olup olmadığını kontrol etmeniz gerekir! Aksi takdirde, RMS Titanic'teki şezlongları yeniden düzenliyor olabilirsiniz .

Doğrulamayı, diğer makine öğrenim tiplerine veya istatistiksel modellere göre daha önemli kılan iki sinir ağı özelliği vardır.

  1. Yapay sinir ağları rasgele orman veya lojistik regresyonun olduğu gibi “kullanıma hazır” algoritmalar değildir. Basit, ileri beslemeli ağlar için bile, kullanıcı ağın nasıl yapılandırıldığı, bağlandığı, başlatıldığı ve optimize edildiği konusunda çok sayıda karar vermek için büyük ölçüde kullanıcı üzerindedir. Bu kod yazma, kod yazma ise hata ayıklama anlamına gelir.

  2. Bir sinir ağı kodu bir istisna oluşturmadan çalıştırsa bile, ağda hala hatalar olabilir! Bu hatalar, ağın eğitim alacağı sinsi tür bile olabilir, ancak optimal olmayan bir çözümde sıkışıp kalmış veya ortaya çıkan ağ istenen yapıya sahip değildir. ( Bu, sözdizimsel ve anlamsal hata arasındaki farkın bir örneğidir .)

Bu Orta posta yazısında, Chase Roberts tarafından " Makine öğrenme kodunun nasıl test edileceğini " yazıyor. Makaleden buggy kodu örneğini ödünç aldım:

def make_convnet(input_image):
    net = slim.conv2d(input_image, 32, [11, 11], scope="conv1_11x11")
    net = slim.conv2d(input_image, 64, [5, 5], scope="conv2_5x5")
    net = slim.max_pool2d(net, [4, 4], stride=4, scope='pool1')
    net = slim.conv2d(input_image, 64, [5, 5], scope="conv3_5x5")
    net = slim.conv2d(input_image, 128, [3, 3], scope="conv4_3x3")
    net = slim.max_pool2d(net, [2, 2], scope='pool2')
    net = slim.conv2d(input_image, 128, [3, 3], scope="conv5_3x3")
    net = slim.max_pool2d(net, [2, 2], scope='pool3')
    net = slim.conv2d(input_image, 32, [1, 1], scope="conv6_1x1")
    return net

Hatayı görüyor musun? Farklı işlemlerin çoğu aslında kullanılmaz, çünkü önceki sonuçlar yeni değişkenlerle yazılmıştır. Bir ağda bu kod bloğunun kullanılması hala çalışacak ve ağırlıklar güncellenecek ve kayıp bile düşebilir - ancak kod kesinlikle amaçlananı yapmıyor. (Yazar aynı zamanda tek veya çift tırnak kullanılması konusunda tutarsız ancak bu tamamen stilize.)

Yapay sinir ağlarına ilişkin en yaygın programlama hataları

  • Değişkenler oluşturulur ancak asla kullanılmaz (genellikle kopyala-yapıştır hataları nedeniyle);
  • Degrade güncellemeleri için ifadeler yanlıştır;
  • Ağırlık güncellemeleri uygulanmaz;
  • Kayıp fonksiyonları doğru ölçekte ölçülmez (örneğin, çapraz entropi kaybı olasılık veya logit olarak ifade edilebilir)
  • Kayıp görev için uygun değildir (örneğin, bir regresyon görevi için kategorik çapraz entropi kaybının kullanılması).

Yürüymeden Önce Sürün; Koşmadan Önce Yürü

Geniş ve derin sinir ağları ve egzotik kablolamalı sinir ağları şu anda makine öğreniminde Sıcak Şey. Ancak bu ağlar tamamen oluşmuş bir şekilde yayılmadı; tasarımcıları kendilerine daha küçük birimlerden inşa ettiler. İlk önce, tek bir gizli katmana sahip küçük bir ağ kurun ve doğru çalıştığını doğrulayın. Sonra adım adım ilave model karmaşıklığı ekleyin ve bunların her birinin de çalıştığını doğrulayın.

  • Bir katmandaki çok az sayıda nöron , şebekenin öğrendiği gösterimini kısıtlayarak yetersiz uyuma neden olabilir. Çok fazla nöron aşırı uyuşmaya neden olabilir, çünkü ağ eğitim verilerini "ezberler".

    Bir problemi modellemek için gerekli matematiksel olarak sadece az sayıda nöron olduğunu kanıtlasanız bile, genellikle "birkaç daha fazla" nöronun olması , optimizer'ın "iyi" bir konfigürasyon bulmasını kolaylaştırır . (Ancak bunun neden böyle olduğunu tam olarak anlayabileceğini sanmıyorum.) Buna XOR problemi bağlamında bir örnek vereceğim: İterasyonlarımın NE'yi XOR için MSE <0.001 ile çok yüksek olması gerekmez mi? .

  • Gizli katmanların sayısını seçmek, ağın ham verilerden bir soyutlama öğrenmesini sağlar. Derin öğrenme bugünlerde bütün öfke ve çok sayıda katmana sahip ağlar etkileyici sonuçlar göstermiştir. Ancak çok fazla gizli katman eklemek, riskin fazla takılmasına neden olabilir veya ağı optimize etmeyi çok zorlaştırabilir.

  • Akıllı bir ağ kablosu seçmek sizin için işin çoğunu yapabilir. Veri kaynağınız özel ağ mimarilerine uygun mu? Evrişimli sinir ağları "yapılandırılmış" veri kaynakları, görüntü veya ses verileri üzerinde etkileyici sonuçlar elde edebilir. Tekrarlayan sinir ağları, doğal dil veya zaman serisi verileri gibi sıralı veri türlerinde iyi yapabilir. Artık bağlantılar derin ileri beslemeli ağları iyileştirebilir.

Yapay Sinir Ağı Eğitimi Kilit Toplama Gibi

Son teknolojiye ulaşmak veya hatta sadece iyi sonuçlar elde etmek için, birlikte iyi çalışacak şekilde yapılandırılmış tüm parçaları ayarlamanız gerekir . Aslında öğrenen bir sinir ağı yapılandırması ayarlamak, bir kilit seçmek gibi bir şeydir: tüm parçaların tam olarak sıralanması gerekir . Doğru yerde tek bir tamburun olması yeterli olmadığı gibi, sadece mimarinin veya yalnızca en iyi duruma getiricinin doğru şekilde ayarlanmış olması da yeterli değildir.

Yapılandırma seçeneklerinin ayarlanması, bir tür yapılandırma seçeneğinin (örneğin, öğrenme hızı) diğerlerinden daha az ya da çok önemli olduğunu söylemek kadar basit değildir, çünkü bu seçeneklerin tümü diğer seçeneklerin tümü ile etkileşime girer. seçim, başka bir yerde yapılan başka bir seçenekle birlikte iyi yapabilir .

Düzenleme seçenekleri veya sayısal optimizasyon seçenekleri olmayan konfigürasyon seçeneklerinin kapsamlı bir listesidir.

Bu konuların tümü aktif araştırma alanlarıdır.

Dışbükey olmayan optimizasyon zordur

Bir sinir ağının nesnel işlevi sadece gizli birimler olmadığında, tüm aktivasyonların doğrusal olduğu ve tasarım matrisinin tam dereceli olduğu durumlarda dışbükeydir - çünkü bu konfigürasyon aynı şekilde sıradan bir regresyon problemidir.

Diğer tüm durumlarda, optimizasyon sorunu dışbükey değildir ve dışbükey olmayan optimizasyon zordur. Sinir ağlarını eğitmenin zorlukları iyi bilinmektedir (bakınız: Derin sinir ağlarını eğitmek neden bu kadar zor? ). Ek olarak, sinir ağları, bizi yalnızca birinci dereceden yöntemlerle kısıtlayan çok sayıda parametreye sahiptir (bakınız: Neden Newton'un yöntemi makine öğrenmesinde yaygın olarak kullanılmıyor? ). Bu çok aktif bir araştırma alanı.

  • Öğrenme hızını çok fazla ayarlamak, optimizasyonun farklılaşmasına neden olacaktır, çünkü "kanyonun" bir tarafından diğerine sıçrayacaksınız. Bunu çok küçük olarak ayarlamak, gerçek bir ilerleme kaydetmenizi önleyecektir ve SGD'de bulunan gürültünün degrade tahminlerinizi bastırmasına izin verecektir.

  • Degrade kırpma , bazı eşiğin üstünde olduğunda degradenin normunu yeniden ölçeklendirir. Bunun tipik olarak 1.0 değerinde bir set ve unut parametresi olduğunu düşünürdüm, ancak LSTM dil modelini 0.25 olarak ayarlayarak çarpıcı biçimde daha iyi hale getirebileceğimi öğrendim. Bunun neden olduğunu bilmiyorum.

  • Öğrenme hızı planlaması , eğitim süresince öğrenme oranını azaltabilir. Tecrübelerime göre, zamanlamayı kullanmaya çalışmak regex'e çok benziyor : bir problemle (“belli bir dönemin ardından nasıl devam edeceğimi öğrenirim?”) İki problemle (“Belirli bir dönemin ardından devam etmeyi nasıl öğrenirim?”) ? "ve" İyi bir program nasıl seçerim? "). Diğer insanlar, zamanlamanın şart olduğu konusunda ısrar ediyor. Karar vermene izin vereceğim.

  • İyi bir minibatch boyutu seçmek , öğrenme sürecini dolaylı olarak etkileyebilir, çünkü daha büyük bir mini parti, daha küçük bir mini partiden daha küçük bir varyansa ( sahip olma eğiliminde olacaktır . Mini partinin degradenin yönü hakkında bilgilendirici olacak kadar büyük, SGD'nin ağınızı düzenleyebileceği kadar küçük olmasını istiyorsunuz.

  • Vanilya SGD'sini geliştirmek için momentum, adaptif öğrenme oranları, Nesterov güncellemeleri vb. Kullanan stokastik gradyan inişlerinde çeşitli varyasyonlar vardır . Daha iyi bir optimize edici tasarlamak çok aktif bir araştırma alanıdır. Bazı örnekler:

  • İlk çıktığında, Adam optimizer çok ilgi yarattı. Ancak bazı yeni araştırmalar, momentumlu SGD'nin sinir ağları için uyarlamalı gradyan yöntemleri gerçekleştirebildiğini buldu. " Machine Learning'de Adaptif Gradyan Yöntemlerinin Marjinal Değer Ashia C. Wilson, Rebecca Roelofs'un Mitchell Stern, Nathan Srebro Benjamin Recht tarafından"

  • Ancak öte yandan, bu çok yeni makale, adaptif oran yöntemleri ile SGD arasındaki boşluğu momentum ile kapatan sözde yeni bir adaptif öğrenme hızı optimizeri önermektedir. " Derin Sinir Ağları Eğitiminde Uyarlamalı Gradyan Yöntemlerinin Genelleştirme Boşluğunun Kapatılması", Jinghui Chen, Quanquan Gu

    Öğrenme hızını otomatik olarak ayarlamak için tarihsel gradyan bilgisini benimseyen uyarlamalı gradyan yöntemlerinin, derin sinir ağlarının eğitiminde momentum ile stokastik gradyan inişinden (SGD) daha kötü genelleme yaptığı gözlemlenmiştir. Bu, adaptif gradyan yöntemlerinin genelleme boşluğunun açık bir problemin nasıl kapatılacağını bırakır. Bu çalışmada, Adam, Amsgrad gibi uyarlamalı gradyan yöntemlerinin bazen "aşırı uyarlanmış" olduğunu gösteriyoruz. Her iki dünyanın da en iyisini elde etmek için Adam / Amsgrad'ı SGD ile birleştiren Kısmen uyarlamalı momentum tahmin yöntemi (Padam) adlı yeni bir algoritma tasarlıyoruz. Standart kriterler üzerinde yapılan deneyler, Padam'ın, derin sinir ağlarının eğitiminde SGD'nin yanı sıra genelleme yaparken Adam / Amsgrad gibi hızlı yakınsama oranını koruyabildiğini göstermektedir.

normalleştirme

Verilerin ölçeği eğitim konusunda büyük bir fark yaratabilir.

Düzenlileştirme

Ağ düzenini seçmek ve ayarlamak, iyi bir şekilde genelleşen bir model oluşturmanın (yani, eğitim verilerine uygun olmayan bir model) inşa etmenin kilit bir parçasıdır. Bununla birlikte, ağınızın eğitim verilerindeki kaybı azaltmak için uğraştığı sırada - ağ öğrenmediğinde - düzenli olma sorunun ne olduğunu gizleyebilir.

Ağım öğrenemediğinde, tüm düzenlileştirmeyi kapatırım ve düzenli olmayan ağın düzgün çalıştığını doğrularım. Sonra her bir düzenleme parçasını geri ekledim ve bunların her birinin yol boyunca çalıştığını doğruladım.

Bu taktik, bazı düzenlileşmelerin zayıf olarak belirlenebileceği yerleri belirleyebilir. Bazı örnekler

Bir Kayıt Defteri Deneyimi Tutun

Bir sinir ağı kurduğumda hiçbir parametre ayarını zorlamıyorum. Bunun yerine, çalışma zamanında ağ yapılandırma ayrıntılarını doldurmak için kullanılan ve kullanılan bir yapılandırma dosyasında (örn. JSON) yapıyorum. Bütün bu konfigürasyon dosyalarını saklıyorum. Herhangi bir parametre değişikliği yaparsam, yeni bir yapılandırma dosyası yaparım. Son olarak, eğitim ve onaylama için tüm dönem başına kayıpları yorum olarak ekliyorum.

Eski sonuçları korumak konusunda bu kadar takıntılı olmamın nedeni, bunun önceki deneyleri tekrar gözden geçirmeyi ve gözden geçirmeyi çok kolaylaştırmasıdır. Ayrıca, aynı çıkmaz denemeyi yanlışlıkla tekrarlamaya karşı da önlem alır. Psikolojik olarak, geriye bakıp gözlemlemenizi de sağlar: "Proje bugün olmasını istediğim yerde olmayabilir, ama haftalar öncesine göre ilerleme kaydediyorum ."k

Örnek olarak, LSTM dil modelleri hakkında bilgi edinmek istedim, bu yüzden diğer Twitter kullanıcılarına cevap olarak yeni tweet yazan bir Twitter botu yapmaya karar verdim. Bu konuda boş zamanlarında, yüksek okul ve iş arasında çalıştım. Yaklaşık bir yıl sürdü ve istediğimi yapan bir modele geçmeden önce yaklaşık 150 farklı model yineledim: (tür) bir anlam ifade eden yeni bir İngilizce metin oluşturun. (Önemli bir kilitlenme noktası ve bu kadar çok girişimde bulunma nedeninin bir parçası, erken düşük kayıplı modeller eğitim verilerini ezberlemeyi başardığı için örneklem dışı bir kayıp elde etmenin yeterli olmamasıydı, bu yüzden sadece istemlere cevap olarak almanca yazılmış metin bloklarını yeniden üretiyordu - modeli daha spontan ve hala düşük kayıplı hale getirmek için biraz ince ayar yapıldı.)


11
Orada pek çok iyi tavsiye var. Yorumlarınızın çoğunun, MCMC örnekleme programları ile karmaşık modeller için parametre tahminleri veya tahminleri hata ayıklama ile ilgili yaptığım (veya başkalarının yaptığı gibi) yorumlarına benzemesi ilginç. (Örneğin, kod doğru şekilde uygulanmadığında işe yarayabilir.)
Glen_b

11
@Glen_b En iyi uygulamaları kodlamanın çoğu istatistikte / makine öğrenme müfredatında yeterince vurgu aldığını sanmıyorum, bu yüzden bu noktayı çok fazla vurguladım. OP'nin “oh şimdi bir hata buldum” gibi bir yorum bıraktığı çok sayıda NN mesajı gördüm.
Sycorax

7
Python'da veri bilimi dersi için programlama öğretiyorum ve aslında ilk gün, temel kavramlar olarak fonksiyonlar ve birim testleri yapıyoruz. İyi dövüşle savaşmak.
Matthew Drury

8
"Tüm kodlama hata ayıklama" için +1. SO ile ilgili kaç posterin kodlamanın az çaba gerektiren basit bir alıştırma olduğunu düşündüğü görünüyor; ilk çalıştırdıklarında kodlarının doğru çalışmasını bekleyen; ve olmadığında kim devam edemiyor gibi görünüyor. Kodlama: komik bir şey onlar yarı haklısın olmasıdır olduğunu kolay - ama programlama zordur.
Bob Jarvis

41

Gönderilen cevaplar harika ve geçmişte bana çok yardımcı olan birkaç "Sanity Checks" eklemek istedim.

1) Modelinizi tek bir veri noktası üzerinde eğitin. Bu işe yararsa, farklı çıkışlara sahip iki girişe eğitin.

Bu birkaç şeyi doğrular. Öncelikle, modelinizin verilerinize uygun olup olmadığını kontrol ederek modelinizin öğrenebildiğini hızlı bir şekilde gösterir. Benim durumumda, ikili tahminler için Dense(1,activation='softmax')vs yapmakta sürekli aptalca hatalar yapıyorum Dense(1,activation='sigmoid')ve birincisi çöp sonuçları veriyor.

Modeliniz birkaç veri noktasını geçemiyorsa, ya çok küçük (bugünün yaşlarında pek mümkün değildir) ya da yapısında ya da öğrenme algoritmasında yanlış bir şey var.

2) İlk kaybınıza dikkat edin.

L=0.3ln(0.5)0.7ln(0.5)0.7

0.3ln(0.99)0.7ln(0.01)=3.2

Bunu, modelinizin birkaç bin örnek üzerinde tahmin etmesini sağlayarak ve ardından çıktıları histogramlatarak daha fazla çalışabilirsiniz. Bu özellikle verilerinizin doğru şekilde normalleştirildiğini kontrol etmek için kullanışlıdır. Örnek olarak, çıktınızın 0'a doğru çok fazla eğrilmesini beklerseniz, beklenen çıktının kareköklerini alarak beklenen çıktılarınızı (egzersiz verilerinizi) dönüştürmek iyi bir fikir olabilir. Bu, çıktıda doymuş sigmoidlerin gradyan sorunlarını önleyecektir.

3) Model çıktılarınızı hata ayıklamak için genelleştirin

Örnek olarak, zaman serisi verilerinden tahminler yapmak için bir LSTM kullandığınızı düşünün. Belki de sizin örneğinizde, sadece en son tahminde bulunuyorsunuz, bu yüzden LSTM'niz bir sekans değil tek bir değer üretir. Her adımda tahminleri döndürmek için LSTM'yi değiştirin (keras cinsinden bu return_sequences=True). Daha sonra her adımdan sonra gizli durum çıkışlarınıza bir göz atabilir ve gerçekten farklı olduklarından emin olabilirsiniz. Bunun bir uygulaması, dizilerinizi maskelediğiniz zaman (yani eşit uzunlukta yapmak için bunları verilerle doldururken) LSTM'nin maskelenmiş verilerinizi doğru şekilde görmezden geldiğinden emin olmaktır. Modelinizi genelleştirmeden bu sorunu asla bulamazsınız .

4) Bireysel katmanlara bakın

Tensorboard, katman çıktılarınızı görselleştirmek için kullanışlı bir yol sağlar . Bu, girişlerin / çıkışların her katta düzgün şekilde normalleştirildiğinden emin olmanıza yardımcı olabilir. Ayrıca buggy aktivasyonlarını da yakalayabilir. Ayrıca katman çıktılarını keraslar halinde bir tahminler kümesi üzerinde sorgulayabilir ve ardından şüpheli olarak eğrilmiş aktivasyonlara sahip katmanları arayabilirsiniz (tümü 0 veya tümü sıfır).

5) Önce daha basit bir model oluşturun

Sorununuzu çözmek için en iyi yaklaşımın, sınırlayıcı kutu dedektörüyle birleştirilmiş bir CNN kullanmak, görüntü bitkilerini daha fazla işleyen ve daha sonra her şeyi birleştirmek için bir LSTM kullanmak olduğuna karar verdiniz. GPU'nuzun modelinizi başlatması 10 dakika sürer.

Bunun yerine, bir yığın sahte veri yapın (aynı şekil) ve modelinizi bileşenlere ayırın. Ardından, her bir bileşenin yerine sahte modeller yapın ("CNN" iniz, yalnızca 2 adet gizli ünite bulunan LSTM, tek bir 2x2 20 adımlı evrişim olabilir). Bu, model yapınızın doğru olduğundan ve yabancı sorun olmadığından emin olmanıza yardımcı olacaktır. Bir süre böyle bir modelle mücadele ettim ve daha basit bir versiyon denediğimde, katmanlardan birinin bir keras böceği nedeniyle düzgün şekilde maskelenmediğini öğrendim. Dahili model katmanlarını kolayca (ve hızlı bir şekilde ) sorgulayabilir ve grafiğinizi doğru ayarlayıp ayarlamadığınızı görebilirsiniz.

6) Ön İşleme ve Paket Sürümlerinizi Standartlaştırın

Özellikle sinir ağları, verilerinizdeki küçük değişikliklere karşı son derece hassastır. Örnek olarak, iki popüler resim yükleme paketi cv2ve PIL. Sadece bir JPEG açmak sayesinde , her iki paket de biraz farklı görüntüler üretecek . Farklılıklar genellikle çok küçüktür, ancak bu tür şeyler nedeniyle bazen model performansında düşüşler göreceksiniz. Ayrıca hata ayıklama kabusu yaratır: antrenman sırasında onaylama puanınız olur ve daha sonra farklı bir yükleyici kullanırsınız ve aynı lanet veri setinde farklı doğruluklar elde edersiniz.

Yani eğer birisinin modelini github'dan indiriyorsanız, ön işlemelerine çok dikkat edin. Hangi görüntü yükleyicileri kullanıyorlar? Hangi görüntü ön işleme yordamlarını kullanıyorlar? Bir resmi yeniden boyutlandırırken, hangi enterpolasyonu kullanıyorlar? Önce görüntüyü yeniden boyutlandırıp normalleştiriyorlar mı? Ya da tam tersi? RGB görüntüleri için kanal sırası nedir?

Paketleri standartlaştırmanın en güvenli yolu, requirements.txttüm paketlerinizi tıpkı eğitim sistemi kurulumunuzdaki gibi, keras==2.1.5sürüm numaralarına kadar gösteren bir dosya kullanmaktır . Teoride, Docker'ı antrenman sisteminizle aynı GPU ile birlikte kullanmak, aynı sonuçları vermelidir.


7
(+1) İlk kaybın kontrol edilmesi harika bir öneri. Cevabımın dışında bıraktığım için pişmanım.
Sycorax

7
Modelinizin üstesinden gelebileceğinden emin olmak mükemmel bir fikirdir. Aşırı güçlendirme hakkında bir zayıflık olarak düşünmeye çok alışkınım, çünkü açıkça söyleyemedim (siz söyleyene kadar), fazladan giyinme yeteneğinin aslında bir güç olduğunu düşünüyorum.
John Coleman,

15

Başlamak için bir sinir ağı eğitmeyin!

Tüm cevaplar harika, ancak belirtilmesi gereken bir nokta var: Verilerinizden öğrenebileceğiniz bir şey var mı? (bir çeşit test olarak kabul edilebilir).

Tahmin etmeye çalıştığınız etiket özelliklerinden bağımsızsa, eğitim kaybının azaltılmasında zorlanma olasılığı vardır.

Bunun yerine, doğrusal bir regresyon, rasgele bir orman (veya hiperparametrelerinin sayısı düşük ve davranışını anlayabileceğiniz herhangi bir yöntem) kalibre etmeye başlayın.

Ardından, bu modellerde iyi bir performans elde ederseniz (rastgele tahminden daha iyidir), sinir ağını ayarlamaya başlayabilirsiniz (@Sycorax'ın cevabı çoğu sorunu çözecektir).


5
xk

11

Özünde, bir NN / DNN modelinin eğitimi için temel iş akışı aşağı yukarı aynıdır:

  1. NN mimarisini tanımlayın (kaç katman, hangi tür katmanların, katmanlar arasındaki bağlantıları, etkinleştirme işlevlerini vb.)

  2. Bazı kaynaklardan (İnternet, veri tabanı, bir dizi yerel dosya, vb.) verileri okuyun, birkaç örneğe bakın (içe aktarma işleminin iyi gittiğinden emin olmak için) ve gerektiğinde / gerektiğinde veri temizliği yapın. Bu adım, insanların genellikle varsaydığı kadar önemsiz değildir. Bunun nedeni, DNN'ler için genellikle devasa veri kümeleriyle, alışkın olduğumuzdan daha büyük büyüklükteki bazı büyüklük dereceleriyle uğraşıyoruz, daha standart lineer olmayan parametrik istatistiksel modeller (NN'ler teorik olarak bu aileye ait).

  3. Verileri bir şekilde normalleştirmek veya standart hale getirmek. NN'ler doğrusal olmayan model olduğundan, verilerin normalleştirilmesi yalnızca sayısal kararlılığı değil, aynı zamanda eğitim süresini ve NN çıktılarını da etkileyebilir (normalleştirme gibi doğrusal bir işlev doğrusal olmayan bir hiyerarşik işlevle birleşmez).

  4. Çapraz onaylama kullanılıyorsa, verileri eğitim / onaylama / test kümesinde veya birden çok katlamada bölme.

  5. Sinir ağını eğitirken, aynı zamanda validasyon setindeki kaybı kontrol eder. Burada, herhangi bir çözümün olup olmadığını bilmediğiniz, birden fazla çözüm varsa, genelleme hatası açısından en iyi çözüm (ler) olan ve ne kadar yaklaştığınızı bilmiyorsanız, dışbükey olmayan optimizasyonun ruh anahtarı zevklerinin tadını çıkarabilirsiniz. o. Antrenman kaybı ve validasyon kaybı eğrisi arasındaki karşılaştırma elbette size rehberlik eder, ancak NN'lerin (ve özellikle DNN'lerin) ölüme karşı sert tutumunu küçümsemeyin; kodunuzda sakatlanan hatalar .

  6. Test setindeki doğruluğu kontrol edin ve bazı teşhis grafikleri / tablolar hazırlayın.

  7. Sonuçlar iyi olmadığı için 1. noktaya geri dönün. Reklam bulantısını tekrarla .

Tabii ki detaylar, belirli kullanım durumlarına göre değişecektir, ancak bu kaba tuval ile, neyin yanlış gitme ihtimalinin daha yüksek olduğunu düşünebiliriz.

Temel Mimari kontrolleri

Bu bir sorun kaynağı olabilir. Genellikle bu ön kontrolleri yaparım:

  • Sorununuzda iyi sonuç veren basit bir mimariyi arayın (örneğin, görüntü sınıflandırması durumunda MobileNetV2) ve uygun bir başlatma uygulayın (bu seviyede, genellikle rastgele yapılacaktır). Bu, verileriniz üzerinde doğru şekilde çalışıyorsa, en azından veri kümesinde göz kamaştırıcı bir sorun olmadığını bilirsiniz. Durumunuzda çalışan basit, test edilmiş bir mimari bulamazsanız, basit bir temel düşünün . Örneğin, sınıflandırma için bir Naive Bayes sınıflandırıcısı (veya yalnızca her zaman en yaygın sınıfı sınıflandırması bile) veya zaman serisi tahmini için bir ARIMA modeli

  • Birim testleri oluşturun. Bunu yapmayı ihmal etmek (ve kanlı Jüpyter Dizüstü Bilgisayarın kullanımı) genellikle NN kodunda, özellikle modelin üretimde kullanılmasının beklendiği durumlarda gözden geçirmem istendiği sorunların temel nedenleridir. En çok cevaplanan cevap zaten birim testlerini kapsadığı için, NN için birim test gelişimini destekleyen bir kütüphane bulunduğunu ekleyeceğim (maalesef sadece Tensorflow'ta).

Eğitim Seti

Giriş verilerinizi iki kez kontrol edin. Antrenman setini ve test setini ters çevirdiyseniz, örneğin (bana bir kez -___- oldu) veya yanlış dosyayı içeri aktardıysanız, bakın. Birkaç giriş örneğine ve ilgili etiketlere bir göz atın ve onların mantıklı olduklarından emin olun. Normalleştirilmiş verilerin gerçekten normalleştirilmiş olup olmadığını kontrol edin (menzillerine bakın). Ayrıca, gerçek dünyadaki veri kümeleri kirli: sınıflandırma için, yüksek düzeyde etiket gürültüsü olabilir (yanlış sınıf etiketine sahip örnekler) veya çok değişkenli zaman serisi tahmini için, zaman serisi bileşenlerinden bazılarında çok sayıda eksik veri olabilir ( Bazı girdiler için% 94 kadar yüksek rakamlar gördüm.

Eğitim setinin eğitim sırasında net olarak beslendiği sıra etkili olabilir. Antrenman setinin rastgele bir karıştırmasını deneyin ( girişler ve çıkışlar arasındaki ilişkiyi kesmeden ) ve egzersiz kaybının düşüp düşmediğine bakın.

Son olarak, eğitim seti sorunlarınız olup olmadığını kontrol etmenin en iyi yolu başka bir eğitim seti kullanmaktır. Eğer görüntü sınıflandırma yapıyorsanız (veya IMAGEnet, toplanamayan resim yerine daha standart bir veri kümesi böyle CIFAR10 veya CIFAR100 kullanmak durumunda Bunun üzerinde eğitmek için göze). Bu veri setleri iyi test edilmiştir: eğer eğitim kaybınız buraya düşerse, ancak orijinal veri kümenizde değilse, veri kümesinde sorunlarınız olabilir.

Altın Testleri Yapın

NN'de eğitim almayan sorunları bulmak için çok yararlı olan Altın Testler olarak adlandırdığım iki test var:

  • Eğitim setini 1 veya 2 örneğe düşürün ve bu konuda eğitim alın. NN derhal antrenman setine çok geçmeli, antrenman setinde% 100 kesinliğe ulaşırken, validasyon / test setindeki doğruluğu% 0'a ulaşacaktır. Bu olmazsa, kodunda bir hata var.

  • tam tersi test: tam egzersiz setini koruyorsunuz, ancak etiketleri karıştırıyorsunuz. NN'nin şimdi öğrenebilmesinin tek yolu, eğitim setini ezberleyerek, yani eğitim kaybının çok yavaş düşeceği, test kaybının ise çok hızlı bir şekilde artacağı anlamına geliyor. Özellikle, test setindeki rastgele şans kaybına ulaşmalısınız . Bu, eğer 1000 sınıfınız varsa,% 0.1 kesinliğe ulaşmanız gerektiği anlamına gelir. Etiketlerin karıştırılmasından önceki ve sonraki eğitim kaybı arasında bir fark görmüyorsanız, kodunuzun buggy olduğu anlamına gelir (önceki adımda ayarlanan eğitimin etiketlerini zaten kontrol ettiğimizi unutmayın).

Eğitim metriğinizin anlamlı olduğunu kontrol edin

Eğer sınıf dengesizliğiniz kuvvetliyse, doğruluk (0-1 kayıp) berbat bir ölçümdür. Çapraz entropi kaybı gibi daha anlamlı bir şey deneyin: sadece doğru sınıflandırmak istemezsiniz, aynı zamanda yüksek doğrulukla sınıflandırmak istersiniz.

Büyük silahları getir

Hiçbir şey yardımcı olmadıysa, şimdi hiperparametrelerle uğraşmaya başlama zamanı. Bu kolayca NN eğitiminin en kötü parçasıdır, ancak bunlar dışbükey olmayan bir optimizasyon çözerek parametreleri uygun olan devasa, tanımlanamayan modellerdir, bu nedenle bu yinelemeler çoğu zaman önlenemez.

  • farklı optimizatörleri deneyin: SGD daha yavaş çalışıyor, ancak daha düşük bir genelleme hatasına neden oluyor, Adam daha hızlı çalışıyor, ancak test kaybı daha yüksek bir değerde duruyor
  • parti boyutunu azaltmayı deneyin
  • başlangıçta öğrenme oranını arttırın ve sonra çürüme yapın veya döngüsel bir öğrenme hızı kullanın
  • katman ekle
  • gizli birimler ekle
  • yavaş yavaş düzenlileşmeyi kaldırın (birkaç tabaka için parti normunu değiştirin). Eğitim kaybı şimdi azalmalı, fakat test kaybı artabilir.
  • Her katman için ağırlıkların ve önyargıların dağılımını görselleştirin. Buraya hiç gelmek zorunda kalmamıştım, ancak BatchNorm kullanıyorsanız, yaklaşık standart normal dağılımlar beklersiniz. Ağırlıkların normunun çağlarla anormal bir şekilde artmakta olup olmadığına bakın.
  • Eğer antreman sırasında bir hata ile karşılaşıyorsanız, bu hatayı google . Mükemmel çalışan bir mimariyi tamir etmeye çalışırken bir sabahını boşa harcadım, sadece kurduğum Keras sürümünün çok amaçlı GPU desteği aldığını ve güncellemek zorunda kaldığımı bulmak için harcadım. Bazen tam tersini yapmak zorunda kaldım (bir paket versiyonunu indirdim).
  • CV'nizi güncelleyin ve farklı bir iş aramaya başlayın :-)

+1, ama "kanlı Jüpyter Not Defteri"? Bu konuda yorum yapmak ister misiniz? :)
amip

2
İşte bu yüzden Jupyter Notebooklardan nefret ediyorum . TL; DR: gizli durum, farklılık bir acıdır, güvenlikle ilgilidir ve birim / regresyon / entegrasyon testlerinin kullanılmaması gibi kötü programlama uygulamalarını teşvik eder. NN'lerin eğitimi, programlamanın temellerini unutmadan insanlar zaten yeterince zor.
DeltaIV,

2
Muhtemelen çok olumsuz oluyorum, ama açıkçası Jüpyter Notebook'ları GitHub'dan klonlayan, kodları kullanım durumlarına uyarlamanın bir kaç dakika olacağını düşündüğüm ve daha sonra hiçbir şeyin işe yaramadığından şikayet edebileceğime inanıyorum. Kriptolar için PyCharm veya VisualStudio Code gibi gerçek bir IDE edinin ve bir Notebook hazırlamak yerine iyi yapılandırılmış bir kod oluşturun! Özellikle modeli üretime taşımayı planlıyorsanız, işleri daha kolay hale getirir.
DeltaIV

2
Lol. 'Jüpyter notebook' ve 'unit test' birbirleriyle koreledir.
Sycorax

2
(+1) Bu iyi bir yazı. Randomizasyon testlerine ilişkin öneriler, buged ağlarda ulaşmanın gerçekten harika yoludur.
Sycorax

6

Model öğrenmiyorsa, geri yayılımınızın işe yaramadığı iyi bir şans var. Ancak Sinir Ağı gibi bir kara kutu modelinde yanlış giden birçok şey var, kontrol etmeniz gereken birçok şey var. Bence Sycorax ve Alex, çok iyi ve kapsamlı cevaplar veriyor. Sadece henüz tartışılmamış bir teknik eklemek istiyorum.

ϵ

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.