CNN xavier ağırlık başlatma


14

Bazı derslerde, "Xavier" kilo başlatmanın (kağıt: Derin ileri beslemeli sinir ağlarını eğitmenin zorluğunu anlamanın ) sinir ağlarının ağırlıklarını başlatmanın etkili bir yolu olduğunu ifade ettim .

Tamamen bağlı katmanlar için bu öğreticilerde temel bir kural vardı:

Var(W)=2nin+nout,simpler alternative:Var(W)=1nin

burada , normal dağılımla başlatılan ve , , bir katman için ağırlıkların varyansıdır ve , üst ve mevcut katmandaki nöron miktarıdır.Var(W)ninnout

Evrişimsel katmanlar için benzer kurallar var mı?

Bir evrişimsel katmanın ağırlıklarını başlatmak için neyin en iyi olacağını bulmak için uğraşıyorum. Örneğin, ağırlıkların şeklinin olduğu bir katmanda (5, 5, 3, 8), böylece çekirdek boyutu, 5x5üç giriş kanalını (RGB girişi) filtrelemek ve 8özellik haritaları oluşturmak ... 3giriş nöronlarının miktarı olarak kabul edilir mi? Daha doğrusu 75 = 5*5*3, girdi 5x5her renk kanalı için yamalar olduğu için mi?

Her ikisini de, sorunu açıklığa kavuşturan belirli bir cevabı veya ağırlıkların doğru şekilde başlatılmasını ve tercihen kaynakları bağlamanın genel sürecini açıklayan daha "genel" bir cevabı kabul ediyorum.

Yanıtlar:


13

Bu durumda nöron miktarı olmalıdır 5*5*3.

Özellikle kıvrımlı katmanlar için yararlı buldum. Genellikle aralığında eşit bir dağılım da işe yarar. [c/(in+out),c/(in+out)]

Neredeyse tüm sinir ağı kütüphanelerinde bir seçenek olarak uygulanmaktadır. Keras'ın Xavier Glorot'un başlatılmasının uygulanmasının kaynak kodunu burada bulabilirsiniz.


1
Hmm .. başka tavsiyelerin var mı? Örneğin ağlarımdan birinde 480.000 nöron ile tam bağlantılı bir katman var. Xavier başlatmayı uygularsam, kabaca varyansıyla karşılaşırım ve ağım sadece bazı garip parazit kalıplarını öğrenir. Sanırım yerel asgari seviyeye düşüyor. Yani ağırlıklar gerçekten küçük. Çoğunlukla aralıktaki bir şeyle makul öğrenim yaşarım . Bununla ilgili bir fikrin var mı? Ben Xavier başlatma gerçekten büyük katmanlar için geçerli olmadığını düşünüyorum? 1106[0.1,0.01]
daniel451

@ascenator özür dilerim Antrenman sırasında ağırlıkların nasıl değiştiği hakkında fazla bir şey bilmiyorum. bazen çok büyük / küçük öğrenme oranlarından garip sonuçlar gelebilir.
dontloo

Birçok DL kütüphanesi, rastgele sayı oluşturma yöntemlerinin parametresi olarak bir varyans terimi değil, standart bir sapma terimi alır. Bu nedenle, varyans için , sonuçlarınızı açıklayabilecek standart sapmaya ihtiyacınız olacaktır . 106103
eric.mitchell

0

Eric'in cevabını burada ikinci olarak verdim. Ben sadece o terimi değil, terimin "sqrt" almak. Buna rağmen, ağınızdaki sigmoidi derinden "RelU" çıkışına bağladığınızda ... eğitimin durmasına neden olabilir. Bu sınırsız "Relu" çıktı nedeniyle sigmoid degrade 0'a düşmesini sağlayabilir ve hiçbir öğrenme gerçekleşmez. Yani, durumlarda, benim netleştirme için bir "scaleDown" faktörü var, bu başlatma faktörünü bu faktöre göre azaltacaktır. Öğrenme gerçekleşene kadar ağırlıkları ampirik olarak ayarlamaya devam ediyorum. Bulmanın basit bir yolu, modeli 1 yinelemeden hemen sonra kaydetmek ve RELU çıkışına (sigmoid'e bağlı) bir göz atmaktır. Bu RELU çıkışı makul olana kadar ağırlıkları ayarlamaya devam edin. Ve sonra bu ağırlıkları antrenman için kullanın. İyi bir başlangıç. Birkaç tekrardan sonra hala çöküyorsa, stabiliteye ulaşıncaya kadar hafifçe biraz daha tartın. Sadece kullandığım bir hack. Kurulumumda benim için çalıştı. Deneyimlerimi paylaşıyorum. Farklı kurulumlar için farklı şeyler işe yarar.

Yani ... İyi Şanslar!

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.