Dropout katmanı ne iş yapar?

Derin öğrenme algoritmalarında hangi katman ne iş yapar veya o işlemi nasıl yapar? Bu sorunun cevabını bütün deep learning kurslarında bulabilirsiniz fakat iş modelin algoritmasını yazmaya geldiğinde birçok sıkıntı yaşarsınız. Çünkü önce hangi katmanı yazacağınızı veya hangi katmanları hangi sıra ile yazacağınızı tam anlamıyla bilemeyebilirsiniz.

Bu yazıda Evrişimsel sinir ağlarında dropout katmanını niçin kullanmamanız gerektiğinden bahsetmeye çalışacağım.

Dropout

Bu yazıda dropout katmanının ne olduğu ve nasıl çalıştığını bildiğiniz varsayılmıştır. Eğer bilmiyorsanız bu makaleyi okuyarak öğrenebilirsiniz. Kısaca özetlemek gerekirse eğitim sırasında aşırı öğrenmeyi(overfitting) engellemek için bazı nöronları unutmak için kullanılanılır diyebiliriz.
Eğer ağınız çok büyükse, çok uzun süre eğitim yapıyorsanız veya veri sayınız çok az ise aşırı öğrenme riski taşıdığınızı unutmamanız gerekir.

Dropout animation
Dropout'un çalışma şekli

Tabiki evrişimsel sinir ağınızın son katmanları olan Fully Connected katmanlarından sonra dropout kullanabilirsiniz.

Keras'ta kullanım şekli
keras.layers.Dropout(rate, noise_shape=None, seed=None)

Dropout’ 0.5 ten başlayarak model maksimum performansa ulaşıncaya kadar sayıyı azaltabilirsiniz. (Fine Tuning)

Örnek:
model=keras.models.Sequential()
model.add(keras.layers.Dense(150, activation="relu"))
model.add(keras.layers.Dropout(0.5))

Unutmayın Dropout evrişimsel sinir ağında sadece Fully Connected katmanlarında kullanılabilir fakat diğer bölgelerinde kullanmayın. Bunun yerine evrişim katmanınlarında batch normalization kullanabilirsiniz.  Bu modelinizi daha düzenli ve eğitim sırasında daha stabil olmasını sağlayacaktır. 

Batch Normalization

Batch normalization evrişimsel sinir ağını daha düzenli hale getirmek için kullanılan başka bir yöntemdir.
Düzenleyici bir etkinin yanı sıra, batch norm aynı zamanda evrişimsel sinir ağının eğitim sırasında yok olma gradyanına bir direnç de verir. Bu da eğitim süresini azaltabilir ve modelin daha iyi performans göstermesini sağlayabilir.

normalization
Normalizasyon işleminin gösterimi
Keras'ta kullanım şekli

Keras kütüphanesinde Batch Norm’u kullanmak için aşağıdaki kodu kullanabilirsiniz. Daha detaylı bilgi için kerasın kendi sayfasına bakabilirsiniz.

keras.layers.BatchNormalization()

Batch norm ile evrişimsel sinir ağı mimarisi oluştururken;

Ayrıca, aktivasyon fonksiyonundan sonra batch norm’u  ekleyebilirsiniz ancak yapılan çalışmalarda her iki yönteminde benzer performans gösterdiği gözlemlenmiştir. 

Örnek:
model.add(Conv2D(60,3, padding = "same"))
model.add(BatchNormalization())
model.add(Activation("relu"))

Batch Norm ve Dropout​

Eğer modelinizin aşırı öğrenme konusunda bir sıkıntı yaşamayacağından emin olsanız bile Batc norm kullanmnın diğer yararlarından faydalanabilirsiniz. Batch norm’un düzenleyici etkisinden ötürü modern Evrişimsel sinir ağı mimarilerinde Dropout katmanının yerini almıştır.

“We presented an algorithm for constructing, training, and performing inference with batch-normalized networks. The resulting networks can be trained with saturating nonlinearities, are more tolerant to increased training rates, and often do not require Dropout for regularization.”

Dropout’un niçin son uygulamalarda uygulamanın yararına çalışmadığını soracak olursanız ,
lk olarak, dropout genellikle konvolüsyon katmanlarını düzenlerken daha az etkilidir.
Neden mi? Konvolüsyon katmanlar çok az parametreye sahip olduklarından, başlangıçta daha az düzenli hale gelmeye ihtiyaç duyarlar.
Dahası, özellik haritalarında kodlanmış uzamsal ilişkiler nedeniyle, aktivasyonlar yüksek derecede ilişkili olabilir. Buda dropoutu etkisiz hale getirir. (kaynak)

İkinci olarak dropoutun iyi olduğu yanlar artık tarihe karışmaktadır. Vgg16 gibi kültleşmiş modellerin sonunda Fully Connected denilen katmanlar bulunur. Bu modellerde aşırı öğrenmeyi(overfitting) önlemek için fully connected katmanların arasına dropout eklenmiştir.

vgg16
Vgg16 mimarisi

Ne yazık ki, yeni mimariler bu fully connected katmanından uzaklaşmaya başladılar. Dense katmanlarını avg pooling katmanları ile değiştirerek hem modelin boyutu düşürülmüş hemde performansta önemli bir gelişme sağlanmıştır.

Gelin bunu bir örnekle açıklayalım

Batch norm’un, konvolüsyon katmanları arasına yerleştirildiğinde genelleme hatasını azalttığını test etmek için bir deneme oluşturuldu.

5 tane aynı yapıda model oluşturuldu ve her bir modelde konvolüsyon katmanları arasına sırası ile dropout, batch norm ve   hiç birşey eklenmeyecek şekilde (control) ayarlandı.

Her bir modeli Cifar100 veri seti eğiterek, aşağıdaki sonuçları elde edildi.

Yukarıdaki grafikte de olduğu gibi batch norm kullanılan mimari daha yüksek bir performans göstermiştir.
Tekrar etmek gerekirse konvolüsyon katmanları arasında kullanılan dropout, modelin performansını kötü yönde etkileme eğiliminde olduğu için bu katmanı kullanmamaya özen gösterin. 

Özet

Cnn Şeması
Örnek Cnn Mimarisi

Özet olarak yukarıdaki gibi bir cnn mimarisinde Feature Learning katmanlarında Dropout yerine Batch Norm’u tercih edin. Classification  katmanlarında ise Dropout kullanmaktan çekinmeyin. 


Kaynak: https://towardsdatascience.com/dont-use-dropout-in-convolutional-networks-81486c823c16