Toplu normalleştirme ve bırakma sıralaması?


118

Asıl soru, özellikle TensorFlow uygulamaları ile ilgiliydi. Ancak cevaplar genel olarak uygulamalar içindir. Bu genel cevap aynı zamanda TensorFlow için doğru cevaptır.

TensorFlow'da toplu normalleştirme ve bırakma kullanılırken (özellikle katkıda bulunan katmanlar kullanılarak) sipariş konusunda endişelenmem gerekir mi?

Bırakmayı ve hemen ardından toplu normalleştirmeyi kullanırsam, sorun olabilir gibi görünüyor. Örneğin, toplu normalizasyondaki kayma, eğitim çıktılarının daha büyük ölçekli sayılarına doğru ilerlerse, ancak daha sonra aynı değişim, daha küçük ölçek numaralarına (daha fazla çıktıya sahip olmanın telafisi nedeniyle), test sırasında bırakmadan uygulanırsa, o zaman vardiya kapalı olabilir. TensorFlow toplu normalleştirme katmanı bunu otomatik olarak telafi ediyor mu? Yoksa eksik olduğum bir nedenle bu olmaz mı?

Ayrıca, bu ikisini birlikte kullanırken dikkat etmeniz gereken başka tuzaklar var mı? Örneğin, yukarıdakilere göre onları doğru sırada kullandığımı varsayarsak ( doğru bir sipariş olduğunu varsayarak ), birden fazla ardışık katmanda hem toplu normalleştirmeyi hem de bırakmayı kullanmada sorun olabilir mi? Bununla ilgili hemen bir sorun görmüyorum, ancak bir şeyleri kaçırıyor olabilirim.

Çok teşekkürler!

GÜNCELLEME:

Deneysel Test görünüyor sipariş önermek yapar olsun. Aynı ağı yalnızca toplu iş normu ve bırakma tersi ile iki kez çalıştırdım. Bırakma parti normundan önce olduğunda, eğitim kaybı azaldıkça doğrulama kaybı artıyor gibi görünüyor. Diğer durumda ikisi de düşüyor. Ama benim durumumda hareketler yavaş, bu yüzden daha fazla eğitimden sonra işler değişebilir ve bu sadece tek bir test. Daha kesin ve bilinçli bir cevap yine de takdir edilecektir.

Yanıtlar:


143

In Ioffe ve Szegedy 2015 , yazarlar "biz herhangi bir parametre değerleri için, ağ her zaman istenen dağılımına sahip aktivasyonlar oluşturmasını sağlamaya istiyoruz" belirtmektedirler. Dolayısıyla, Toplu Normalleştirme Katmanı aslında bir Dönüşüm Katmanı / Tamamen Bağlı Katmanın hemen ardından, ancak ReLu (veya başka herhangi bir tür) aktivasyonuna beslenmeden önce eklenir. Daha fazla ayrıntı için bu videoyu yaklaşık 53 dakika izleyin .

Bırakma devam ettiği sürece, bırakmanın aktivasyon katmanından sonra uygulandığına inanıyorum. Gelen bırakma kağıdı Şekil 3b, gizli katmanlı l için bırakma faktörü / olasılık matrisi R (l) y (I) aktivasyon fonksiyonu f uygulandıktan sonra sonuç y (l), üzerine kendisine tatbik edilir.

Özetle, toplu normalleştirme ve bırakma kullanma sırası şöyledir:

-> CONV / FC -> BatchNorm -> ReLu (veya başka bir etkinleştirme) -> Dropout -> CONV / FC ->


63
Görünüşe göre Christian Szegedy bile artık BatchNorm'u ReLU'dan sonra (ondan önce değil) gerçekleştirmeyi seviyor . Keras'ın yazarı F. Chollet'ten alıntı: "Orijinal makalelerinde ne önerdiklerini kontrol etmek için geri dönmedim, ancak Christian tarafından yazılan son kodun BN'den önce relu uyguladığını garanti edebilirim. Hala bazen bir konudur. tartışmalı. " source
pseudomarvin

3
Havuzlamaya ne dersiniz, bu toplu form ve aktivasyon arasına girer mi?
wordsforthewise

5
Ayrıca, etkinleştirmeden sonra BN ile doğruluk daha yüksek olabilir gibi görünüyor: github.com/cvjena/cnn-models/issues/3
wordsforthewise

1
video bir şekilde silindi!
blitu12345

10
Bu makale , varyans kayması riskinden kaçınmak için bazı şartlandırma yapılmadıkça BN ile normalde bırakmanın daha kötü sonuçlara yol açtığını göstermektedir.
Haramoz

37

Yorumlarda belirtildiği gibi, katmanların sırasını okumak için harika bir kaynak burada . Yorumları inceledim ve internette bulduğum konu hakkında en iyi kaynak

2 sentim:

Bırakma, nöronların birlikte uyum sağlamadığından emin olmak için belirli nöronlardan gelen bilgileri tamamen bloke etmek anlamına gelir. Bu nedenle, toplu normalleştirme, bırakmadan sonra olmalıdır, aksi takdirde bilgileri normalleştirme istatistiklerinden geçirirsiniz.

Bunu düşünürseniz, tipik makine öğrenimi problemlerinde, tüm veriler üzerinde ortalama ve standart sapmayı hesaplamamamızın ve ardından bunları eğitim, test ve doğrulama setlerine bölmemizin nedeni budur. İstatistikleri tren seti üzerinden ayırıp hesaplıyor ve doğrulama ve test veri setlerini normalleştirmek ve ortalamak için kullanıyoruz

bu yüzden Şema 1'i öneriyorum (Bu , kabul edilen cevapla ilgili sözde karvin'in yorumunu dikkate alır)

-> CONV / FC -> ReLu (veya başka bir etkinleştirme) -> Dropout -> BatchNorm -> CONV / FC

Şema 2'nin aksine

-> CONV / FC -> BatchNorm -> ReLu (veya başka bir aktivasyon) -> Dropout -> CONV / FC -> kabul edilen cevapta

Lütfen bunun, Şema 2 altındaki ağın Şema 1 kapsamındaki ağa kıyasla fazla uydurma göstermesi gerektiği anlamına geldiğini, ancak OP'nin söz konusu olduğu gibi bazı testler yürüttüğünü ve Şema 2'yi desteklediklerini unutmayın.


BatchNorm yerleştirme ile ilgili reddit tartışması: reddit.com/r/MachineLearning/comments/67gonq/…
saetch_g

3
Ancak, bırakma uygulandıktan sonra bunları hesaplayacağınız için, bu BN istatistiklerinizi bozmaz mı, test zamanında durum böyle olmayacak mı?
ZakJ

@ZakJ Sanırım değil. Birim başına BN'yi hesapladığımızdan (her dahili özellik için) ve dahası, bırakmayı telafi etmek için ölçeklenir.
coşku

@ZakJ doğru. Mohammad adel'in cevabına ve bu makaleye buradan bakın: arxiv.org/pdf/1801.05134.pdf . Aslında, Toplu Normalleştirme katmanları, Test zamanında Bırakma kapatıldığında artık var olmayan verilerdeki ortak değişken kaymayı önlemeyi öğrenir.
skeller88

@ skeller88 Gazeteyi okumadım. Başımın üstünde, eğer bırakmadan önce BN'ye sahipseniz, BN'nin işlevi bir sonraki katmana standartlaştırılmış veri sağlamak olduğundan, temelde BN katmanının amacını mahveder.
MiloMinderbinder

12

Genellikle, Dropout(sahip olduğunuzda BN) bırakın :

  • "BN Dropout, bazı durumlarda ihtiyacı ortadan kaldırır, çünkü BN sezgisel olarak Bırakma ile benzer düzenleme faydaları sağlar"
  • "ResNet, DenseNet gibi mimariler kullanmıyor Dropout

Daha fazla ayrıntı için, yorumlarda @ Haramoz tarafından daha önce bahsedildiği gibi [ Bırakma ve Toplu Normalleştirme arasındaki Uyumsuzluğu Varyans Kayması ile Anlamak ] başlıklı makaleye bakın.


MLP'lerden ne haber onları birleştirmek faydalıdır.
DINA TAKLIT

1
@DINATAKLIT Yeterli antrenman verisine sahip olmadığınızda, bence EVET.
xtluo

@xtulo, küçük bir tarih olduğunda bu çalışmayı mı kastediyorsunuz? Toplu normalleştirmenin büyük veri kümeleriyle daha iyi çalıştığını okumuş gibi! Kafam biraz karıştı :!
DINA TAKLIT

1
@DINATAKLIT Önceki yorumunuzda what about MLPs is it useful to combine thembunu mu demek istediniz Is it useful to combine Dropout and BN when using MLPs? Bu konudaki düşüncem, esas olarak modelinizin boyutuna ve sahip olduğunuz eğitim verilerinin miktarına bağlı olmasıdır.
xtluo

@xtulo evet Demek istediğim, Droupout ve BN'yi birleştirmek yararlı mı, evet, son cevabınıza katılıyorum.
DINA TAKLIT

6

Dropout ve Batch Norm (BN) arasındaki uyumsuzluğu açıklayan bir kağıt buldum. Ana fikir, "varyans değişimi" dedikleri şeydir . Bunun nedeni, eğitimden ayrılmanın eğitim ve test aşamaları arasında farklı bir davranışa sahip olması ve BN'nin öğrendiği girdi istatistiklerini değiştirmesidir. Ana fikir, bu makaleden alınan bu şekilde bulunabilir . görüntü açıklamasını buraya girin

Bu defterde bu etki için küçük bir demo bulunabilir .


3
Bu soruya nasıl cevap veriyor?
nbubis

1
Kağıt, 2 potansiyel strateji sağlar: - Tüm BN katmanlarından sonra
Bırakmayı

@nbubis Sanırım dolaylı olarak yanıtlıyor. Bunların birlikte kullanılmamasını öneriyor gibi görünüyor ("Bırakma ve Toplu Norm (BN) arasındaki uyumsuzluğu açıklıyor").
NelsonGon


2

Doğru sıra şudur: Dönş> Normalleştirme> Etkinleştirme> Bırakma> Havuzlama


2

Dönş - Etkinleştirme - DropOut - BatchNorm - Havuz -> Test_loss: 0.04261355847120285

Dönş - Etkinleştirme - DropOut - Havuz - BatchNorm -> Test_loss: 0.050065308809280396

Dönş. - Etkinleştirme - BatchNorm - Havuz - DropOut -> Test_loss: 0.04911309853196144

Dönş - Etkinleştirme - BatchNorm - DropOut - Havuz -> Test_loss: 0.06809622049331665

Dönş. - BatchNorm - Etkinleştirme - DropOut - Havuz -> Test_loss: 0.038886815309524536

Dönş. - BatchNorm - Etkinleştirme - Havuz - DropOut -> Test_loss: 0.04126095026731491

Conv - BatchNorm - DropOut - Activation - Pool -> Test_loss: 0.05142546817660332

Dönş - Bırakma - Etkinleştirme - BatchNorm - Havuz -> Test_loss: 0.04827788099646568

Dönş - Bırakma - Etkinleştirme - Havuz - BatchNorm -> Test_loss: 0.04722036048769951

Dönüşüm - DropOut - BatchNorm - Etkinleştirme - Havuz -> Test_loss: 0.03238215297460556


MNIST veri kümesinde (20 epoch) 2 evrişimli modülle (aşağıya bakın) eğitildi, ardından her seferinde

model.add(Flatten())
model.add(layers.Dense(512, activation="elu"))
model.add(layers.Dense(10, activation="softmax"))

Evrişimli katmanların çekirdek boyutu (3,3), varsayılan dolgudur, etkinleştirme elu. Havuzlama, havuz kenarının MaxPoolingidir (2,2). Kayıptır categorical_crossentropyve iyileştirici öyledir adam.

Karşılık gelen Bırakma olasılığı sırasıyla 0.2veya şeklindedir 0.3. Özellik haritalarının miktarı sırasıyla 32veya 'dir 64.

Düzenleme: Bazı yanıtlarda önerildiği gibi Bırakmayı bıraktığımda, daha hızlı birleşti ancak BatchNorm kullandığımdan daha kötü bir genelleme yeteneğine sahipti ve .


NN'lerin stokastik doğası nedeniyle, sadece bir eğitimle oynamak yeterli değildir. Yaklaşık 100 eğitim yapıp ortalama aldığınızda - sonuçlar daha doğru olacaktır.
GensaGames

0

ConV / FC - BN - Sigmoid / tanh - bırakma. Etkinleştirme işlevi Relu veya başka bir durumsa, normalleştirme ve bırakma sırası görevinize bağlıdır


0

Https://stackoverflow.com/a/40295999/8625228 adresindeki cevap ve yorumlardaki önerilen kağıtları okudum

Ioffe ve Szegedy'nin (2015) bakış açısına göre, ağ yapısında sadece BN kullanın. Li vd. (2018), uygulayıcıların BN'den önce Dropout'u kullandıklarında bir varyans kayması olduğuna dair istatistiksel ve deneysel analizleri vermektedir. Böylece Li ve ark. (2018), tüm BN katmanlarından sonra Bırakma uygulanmasını önerir.

Ioffe ve Szegedy'nin (2015) bakış açısına göre, BN aktivasyon fonksiyonunun içinde / öncesinde yer almaktadır . Ancak Chen ve ark. (2019), bırakma ve BN'yi birleştiren bir IC katmanı kullanır ve Chen ve diğerleri. (2019), ReLU'dan sonra BN kullanılmasını önermektedir.

Güvenlik arka planında, Dropout veya BN'yi yalnızca ağda kullanıyorum.

Chen, Guangyong, Pengfei Chen, Yujun Shi, Chang-Yu Hsieh, Benben Liao ve Shengyu Zhang. 2019. "Derin Sinir Ağlarının Eğitiminde Toplu Normalleştirme ve Bırakma Kullanımının Yeniden Düşünülmesi." CoRR abs / 1905.05928. http://arxiv.org/abs/1905.05928 .

Ioffe, Sergey ve Christian Szegedy. 2015. "Toplu Normalleştirme: Dahili Değişken Değişimini Azaltarak Derin Ağ Eğitimini Hızlandırma." CoRR abs / 1502.03167.http://arxiv.org/abs/1502.03167 .

Li, Xiang, Shuo Chen, Xiaolin Hu ve Jian Yang. 2018. "Varyans Değişimine Göre Bırakma ve Toplu Normalleştirme Arasındaki Uyumsuzluğu Anlamak." CoRR abs / 1801.05134. http://arxiv.org/abs/1801.05134 .

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.