Derin Öğrenme En İyi Uygulamaları (1) - Ağırlık Başlatma | 2019-2020
Veri BilimiDerin ÖğrenmeMakine öğrenmeNöral ağlar
Temel bilgiler, ağırlık başlatma tuzaklar ve en iyi uygulamalar
Derin öğrenmeye yeni başlayan biri olarak, anladığım şeylerden biri, tüm derin öğrenme püf noktalarını tek bir yerde kapsayan çok fazla çevrimiçi belgenin olmadığıdır. Ağırlıkları başlatmak, düzenli hale getirmek gibi basit püf noktalardan, düzenli ve normal sinir ağlarını hata ayıklamak ve sinir ağlarını daha kolay ve verimli bir şekilde hata ayıklamak gibi karmaşık tekniklere kadar değişen birçok küçük uygulama vardır. Bu bana, derin öğrenmeyi sizin için daha basit hale getirmek için elimden geldiği kadar nüansı kapsayacağı bir dizi blog yazmam için ilham verdi.
Bu blogu yazarken, sinir ağlarının nasıl eğitildiği hakkında temel bir fikre sahip olduğunuz varsayımı. Ağırlıklar, önyargılar, gizli katmanlar, aktivasyonlar ve aktivasyon fonksiyonlarının anlaşılması içeriği daha net hale getirecektir. Temel bir derin öğrenme temeli oluşturmak istiyorsanız bu kursu öneririm.
Not - Ne zaman bir sinir ağının katmanlarına atıfta bulunursam, basit bir sinir ağının katmanlarını, yani tamamen bağlı katmanları ifade eder. Tabii ki bahsettiğim yöntemlerden bazıları, evrişimli ve tekrarlayan sinir ağlarına da uygulanmaktadır. Bu blogda, ağırlık matrislerinin başlatılması ile ilgili konular ve bunları azaltmanın yolları hakkında konuşacağım. Ondan önce, ileriye götüreceğimiz bazı temel bilgileri ve gösterimleri ele alalım.
Temel Bilgiler ve Notlar
L-1 gizli katmanları ve 1 çıkış katmanını içeren bir L katmanı sinir ağını düşünün. L tabakasının parametreleri (ağırlıklar ve önyargılar)
Ağırlıklara ve önyargılara ek olarak, eğitim sürecinde, aşağıdaki ara değişkenler hesaplanır
Bir sinir ağı eğitimi 4 adımdan oluşur:
Ağırlıkları ve önyargıları başlat.
İleriye doğru yayılma: X girişini kullanarak, Z ve A'yı hesapladığımız her katman için W ve önyargıları b ağırlıkları, son katmanda, sigmoid, softmax veya doğrusal bir fonksiyon olabilecek f (A ^ (L-1)) değerini hesapladık. A ^ (L-1) ifadesi ile bu, y_hat tahminini verir.
Kayıp işlevini hesaplayın: Bu, asıl etiketin y ve öngörülen etiketin y_hat işlevidir. Tahminlerimizin ne kadar uzakta olduğunu gerçek hedeften ele geçiriyor. Amacımız bu kayıp fonksiyonunu en aza indirmektir.
Geriye Doğru Yayılım: Bu adımda, f (y, y_hat) kayıp fonksiyonunun gradyanlarını dA, dW ve db olarak A, W ve b olarak hesapladık. Bu gradyanları kullanarak, parametrelerin değerlerini son katmandan birincisine kadar güncelleriz.
Tren verilerini değiştirmeden, kayıp fonksiyonunu en aza indirdiğimizi hissedene kadar yineleme / çağlar için 2-4. Adımları tekrarlayın (bundan sonra daha fazlası!)
2 katmanlı bir ağ, yani bir gizli katman için 2., 3. ve 4. adımlara hızlıca bir göz atalım. (Basitlik için önyargı terimlerini buraya eklemediğimi unutmayın):
Ağırlıkları sıfırlamak W
Ağınızı oluştururken dikkat etmeniz gereken başlangıç ​​noktalarından biri, ağırlık matrisinizi doğru şekilde başlatmaktır. Modeli eğitirken sorunlara neden olabilecek 2 senaryo düşünelim:
1. Tüm ağırlıkların 0 ile başlatılması
Şimdi onu ortaya koyalım - bu, modelinizi doğrusal bir modele eşdeğer yapar. Tüm ağırlığı 0 olarak ayarladığınızda, kayıp fonksiyonuna göre türev W ^ l'deki her w için aynıdır, dolayısıyla tüm ağırlıklar sonraki yinelemede aynı değerlere sahiptir. Bu, gizli birimleri simetrik yapar ve çalıştırdığınız tüm yinelemeler için devam eder. Böylece ağırlıkları sıfıra ayarlamak ağınızı doğrusal bir modelden daha iyi yapmaz. Önyargıların 0'a ayarlanmasının, sıfır olmayan ağırlıklar simetriyi kırma ile ilgilendiğinden ve önyargı 0 olduğunda bile, her nörondaki değerler hala farklı olduğundan, herhangi bir sıkıntı yaratmayacağına dikkat etmek önemlidir.
2. Ağırlıkları rasgele başlatmak
(Derin) bir ağla çalışırken standart normal dağılımı (np.random.randn (size_l, size_l-1) takip ederek) rasgele ağırlıkları başlatmak, derinlemesine kaybolan gradyanlar veya patlayan gradyanlar gibi 2 soruna yol açabilir.
a) Yokuş gradyanları - Derin ağlar olması durumunda, herhangi bir aktivasyon fonksiyonu için, geri yayılma sırasında her katmanla geriye doğru giderken abs (dW) küçülecektir. Daha önceki katmanlar böyle bir durumda yetiştirmek için en yavaştır.
Ağırlık güncellemesi küçüktür ve daha yavaş yakınsama ile sonuçlanır. Bu, kayıp fonksiyonunun optimizasyonunu yavaşlatır. En kötü durumda, bu sinir ağının daha ileri eğitim almasını tamamen durdurabilir.
Daha spesifik olarak, sigmoid (z) ve tanh (z) durumunda, ağırlıklarınız büyükse, o zaman degrade ufukta küçük olacak ve ağırlıkların değerlerini değiştirmesini etkili bir şekilde önleyecektir. Bunun nedeni, abs'nin (dW) çok az artması ya da her yinelemede küçülüp küçülmesidir. RELU (z) ile kaybolan gradyanlar genellikle gradyan negatif (ve sıfır) girişler için 0, pozitif girişler için 1 olduğundan sorun değildir.
b) Patlayan degradeler - Bu kaybolan degradelerin tam tersidir. Negatif olmayan ve büyük ağırlıklara ve küçük aktivasyonlara A sahip olduğunuzu düşünün (sigmoid (z) için olduğu gibi). Bu ağırlıklar katmanlar boyunca çarpıldığında, maliyette büyük bir değişikliğe neden olurlar. Böylece, gradyanlar da büyük olacaktır. Bu, W - ⍺ * dW ile W'deki değişikliklerin büyük adımlarla olacağı, aşağı doğru anın artacağı anlamına gelir.
Bu minima etrafında salınımla sonuçlanabilir veya hatta tekrar tekrar en iyi duruma getirme ile sonuçlanabilir ve model asla öğrenemez!
Patlayan gradyanların diğer bir etkisi, gradyanların büyük değerlerinin, yanlış hesaplamalar veya NaN’lerin tanıtımıyla sonuçlanan sayı taşmalarına neden olabileceğidir. Bu aynı zamanda NaN değerini alan kayıplara yol açabilir.
1. Etkinleştirme işlevi olarak RELU / sızdıran RELU'yu kullanmak, ufuk / patlayan degrade sorununa nispeten dayanıklıdır (özellikle çok derin olmayan ağlar için). Sızdıran RELU’lar söz konusu olduğunda, hiçbir zaman 0 gradyanı olmaz. Böylece asla ölmezler ve eğitim devam eder.
2. Derin ağlar için, doğrusal olmayan aktivasyon işlevine bağlı olarak ağırlıkları başlatmak için bir sezgisel tarama kullanabiliriz. Burada, standart normal dağılımdan çizim yapmak yerine, k'yi etkinleştirme fonksiyonuna bağlı olan k / n varyanslı normal dağılımdan W çekiyoruz. Bu buluşsal bulgular patlayan / kaybolan degradeler sorununu tam olarak çözmese de, büyük ölçüde azaltılmasına yardımcı olurlar. En yaygın olanları:
a) RELU (z) için - W'nin rastgele oluşturulmuş değerlerini şu ile çarpıyoruz:
b) Tanh (z) için - Sezgisel, Xavier'in başlatılması olarak adlandırılır. Bir öncekine benzer, ancak k'nin 2 yerine 1 olması dışında.
TensorFlow'da W = tf.get_variable ('W', [dims], başlatıcı) burada başlatıcı = tf.contrib.layers.xavier_initializer ()
c) Yaygın olarak kullanılan bir buluşsal yöntem:
Bunlar, başlatma için iyi bir başlangıç ​​noktasıdır ve patlayıcı veya kaybolan gradyanların şansını azaltır. Ağırlıkları ne 1'den çok daha büyük ne de 1'den çok daha az koydular. Bu nedenle degradeler hızlı bir şekilde kaybolmuyor veya patlamıyor. Yavaş yakınsamaların önlenmesine yardımcı olurlar, aynı zamanda minimumları salınım yapmadığımızdan emin olun. Yukarıdakilerin başka değişkenleri var, burada ana amaç yine parametrelerin varyansını en aza indirmektir.
3. Degrade Kırpma - Bu, patlayan degrade sorunuyla başa çıkmanın başka bir yoludur. Bir eşik değeri belirleriz ve degradenin seçilmiş bir işlevi bu eşikten büyükse, onu başka bir değere ayarlarız. Örneğin, L2 normu belli bir eşiği aştığında gradyanları normalleştirin - W = W * eşik / l2_norm (W), l2_norm (W)> eşik
Dikkat edilmesi gereken önemli bir nokta, W'nin çeşitli başlangıçları hakkında konuştuğumuz, ancak önyargılardan bahsettiğimizdir. B. Bunun nedeni, yanlılığa göre olan gradyanların, sadece bu tabakanın doğrusal aktivasyonuna bağlı olduğu ve daha derin tabakaların gradyanlarına bağlı olmadığıdır. Dolayısıyla, önyargı terimleri için azalan veya gradyan patlamaları yoktur. Daha önce belirtildiği gibi, güvenli bir şekilde 0 olarak başlatılabilirler.
Bu blogda, ağırlık başlatma tehlikelerine ve bazı azaltma tekniklerine yer verdik. Bu konuyla ilgili diğer yararlı görüşleri kaçırmış olsaydım, sizden öğrenmekten mutluluk duyarım! Bir sonraki blogda, takım elbise ve degrade kontrolünü azaltmak için düzenlileştirme yöntemlerinden - hata ayıklamayı daha basit hale getirmek için bir numaradan bahsedeceğim!
Yapay sinir ağları: geri yayılma ile eğitim - Jeremy Jordan
Sinir Ağlarında Patlayan Degradelere Nazik Bir Giriş Jason Brownlee
Ufuk gradyan problemi
Hakkımda: USF’de MS Data Science’dan mezun olmuş ve Computer Science’da lisans derecesini almış, öngörücü ve öneri algoritmaları oluşturma ve finans ve perakende müşterileri için ticari bilgiler alma konusunda 2 yıllık deneyime sahibim. Makine öğrenimi ve derin öğrenme bilgisini gerçek dünyadaki sorunlara uygulama fırsatlarından heyecan duyuyorum.
Diğer bloglarıma buradan göz atın!
Neden Gary Vee ile buluşmak başıma gelen en iyi şeydiEn İyi Bilgi Podcast'lerinin 7'si2018'de öğrenmek için en iyi 10 Programlama DilleriKodlamayı öğrenirken en iyi 50 kaynakEn İyi CBD Dozajı Nedir?