Ölçeklendirme ile CNN Modelinin Doğruluk ve Verimliliğini Artırma: EfficientNet

Source: Deep Learning on Medium

Ölçeklendirme ile CNN Modelinin Doğruluk ve Verimliliğini Artırma: EfficientNet

“Nasıl düşüneceğini bilmek, sadece ne düşüneceğini bilenlerin çok daha ötesinde olmanı sağlayacaktır.” — Neil deGrasse Tyson

Rethinking Model Scaling for Convolutional Neural Networks

Görsel

🎯 Bu makale 2019 yılında International Conference on Machine Learning (ICML)’de yayınlandı. ImageNet sınıflandırma probleminde 66M parametre hesaplama yükü ile %84.4‘lük doğruluğa ulaşarak state-of-the art modeller arasında yerini aldı! EfficientNet, bir grup evrişimli sinir ağı modeli olarak düşünülebilir. Ama tabi ki incelikleri sayesinde adından da anlaşılacağı gibi kendisinden önceki modellerin çoğundan efektif/verimli (efficient)dir.

Hesaplanan parametre ve ImageNet Top-1 doğruluk karşılaştırması

EfficientNet grubu B0-B7 arasında 8 tane modelden oluşur ve sayı büyüdükçe hesaplanan parametre sayısı ve doğruluk artar. O zaman “efektif olan ne?” diye sorası geliyor insanın! Ama görüldü ki ImageNet veri setinde 2012 yılından sonra modeller karmaşıklaştıkça başarı yükseldi ama işlem yükü bakımından bir çoğu efektif değiller. Son yıllarda daha küçük modellerle daha verimli yaklaşımlar benimsenmeye çalışılıyor. Öyle ki, modeli küçültmeye çalışırken derinlik, genişlik ve çözünürlükten yalnızca birinde değil her üçünde de ölçekleme yapmak çok daha efektif sonuçlar üretmeyi sağlıyor. Evet, efektif 🙂 Demek ki bu modelde üç aşamada ölçeklendirme yapmak gerekecek!

❄️EfficientNet Nasıl Çalışır?

Üç temel adımda neden daha verimli olduğunu anlamak mümkün.

Depth ve Point wise Evrişimlerin temel gösterimi
  • Depthwise Evrişim + Pointwise Evrişim: Hesaplama maliyetini asgari doğruluk kaybıyla önemli ölçüde azaltmak için orijinal evrişimi iki aşamaya böler.
  • Ters çevrilmiş Res: Orijinal ResNet blokları, kanalları sıkıştıran (seqeeze) bir katmandan sonra kanalları genişleten (expand) bir katmandan oluşur. Böylece atlama bağlantıları (skip connections) ile zengin kanal katmanlarını bağlar. Ancak MBConv’da, bloklar önce kanalları genişleten, sonra bunları sıkıştıran bir katmandan oluşur, böylece daha az kanala sahip katmanlar atlanarak bağlanır.
  • Lineer darboğaz: ReLU’dan bilgi kaybını önlemek için her bloktaki son katmandaki lineer aktivasyonu kullanır.

EfficientNet için ana yapı taşı, ilk olarak MobileNetV2 olarak bilinen ters çevirilmiş darboğaz (bottleneck) MBConv’dur. Genişleme katmanlarına kıyasla çok daha az sayıda kanalı birbirine bağlayan darboğazlar arasındaki kısayolları kullanarak, hesaplamayı geleneksel katmanlara kıyasla neredeyse k² azaltan derinlemesine ayrılabilir evrişim ile birleştirildi. k’nin çekirdek boyutunu ifade ettiği yerde, 2 boyutlu evrişim penceresinin yüksekliğini ve genişliğini belirtir.

from keras.layers import Conv2D, DepthwiseConv2D, Adddef inverted_residual_block(x, expand=64, squeeze=16):
block = Conv2D(expand, (1,1), activation=’relu’)(x)
block = DepthwiseConv2D((3,3), activation=’relu’)(block)
block = Conv2D(squeeze, (1,1), activation=’relu’)(block)
return Add()([block, x])
Model Ölçeklendirme. (a) bir temel ağ örneğidir; (b)-(d) ağın sadece bir boyutunu artıran geleneksel ölçeklendirmedir: genişlik, derinlik veya çözünürlük. (e) her üç boyutu da sabit bir oranla eşit şekilde ölçeklendiren önerilen bileşik ölçeklendirme yöntemidir.
Temel Bir Modelin Ölçeklendirilmesi: Farklı ağ genişliği (w), derinlik (d) ve çözünürlük (r) Katsayıları

Daha büyük genişlik, derinlik veya çözünürlüğe sahip daha büyük ağlar daha yüksek doğruluk elde etme eğilimindedir, ancak doğruluk kazanımı % 80’e ulaştıktan sonra hızlı bir şekilde doyurulur ve bu da tek boyutlu ölçeklendirmenin sınırlandırılmasını gösterir. Bu ayrı ayrı ölçeklendirme tekniğine bileşik ölçeklendirme (compound scaling) denir.

EfficientNetB0’dan EfficientNetB7’ye kadar FLOPS 2 kat artırmak istenildiginde (EfficientNetB1’in EfficientNetB0’a kıyasla 2x FLOPS’a sahip olmasını sağlamak için) aşağıdaki gibi bir yaklaşım yapmak gerekir.

derinlik (depth): d = α φ

genişlik (width): w = β φ

çözünürlük (resolution): r = γ φ s.t. α · β 2 · γ 2 ≈ 2

α ≥ 1, β ≥ 1, γ ≥ 1

❄️EfficientNet Modeli Oluşturmak

EfficientNet-B0 temel ağ yapısı

Adım 1️⃣: Temel bir model kurmak buna EfficientNet-B0 deniyor. Ters çevrilmiş MobileNet’in ters çevrilmiş Res darboğazlarının olduğu MBConv kullanılır.

EfficientNet-B0 temel ağ yapısı blok gösterim

Adım 2️⃣: ϕ=1’e ayarlanır ve B0dan B1’e ölçeklemek için α,β,γ için grid search yapılır.

Adım 3️⃣: α,β,γ ayarlanır. Böylece B2’den B7’ye ölçekleme için ϕ, 2~7 arasında seçilir.

Farklı ölçeklendirme yöntemlerine sahip modeller için Sınıf Aktivasyon Haritası (CAM) (Zhou ve diğerleri, 2016)

Görülmektedir ki bileşik ölçeklendirme (compound scaling) yöntemi nesneyle ilgili bölgelerde ayrıntılara daha verimli şekilde odaklanmaktadır. Bu yüzden denemeye değer 🤖 O halde deneyelim!

❄️EfficientNet’te Transfer Öğrenmenin Etkisi

🕊Bir kuşun öğrendiklerini size aktarabildiğini düşünün ya da sizin öğrendiklerinizi bir balığa, kulağa çılgınca geliyor değil mi? 🤓

Ya da şöyle diyelim ben bir bardağı tanımak için atalarımdan bu yana ve doğduğumdan beri öğrendiğim basit özellikler var (kenar, köşe, şekil, maddesel yapısı vb.) bunlardan yola çıkarak hiç görmediğim bardakları ya da hiç görmediğim bazı nesnelerin bardak olmadığına dair kararlar veriyorum. Yalnızca bu bilgiyi öğrenen bir makinenin bildiklerini başka bir makineye transfer edip tekrar öğrenme sürecini atlamasıdır desem!

Bu konuda daha detaylı bilgiye ulaşmak için daha önce paylaştığım uygulamalı fine-tuning ve transfer öğrenme anlatımıma buradan ulaşabilirsiniz!

Daha önce ImageNet gibi büyük bir veri kümesi üzerinde eğitilmiş kaydedilmiş modellere önceden eğitilmiş (pre-trained) diyoruz. Böylece öğrenilen öznitelikler (features), birçok yeni bilgisayarlı görme problemi için faydalı oluyor, ancak bu yeni problemler orijinal görevden tamamen farklı sınıflar içerebilir, bunu gözardı etmemek gerek. Örneğin, bir resim ImageNet’te (sınıfların çoğunlukla hayvanlar ve gündelik nesneler olduğu) bir ağı eğitebilir ve ardından bu eğitimli ağı resimlerdeki araba modellerini tanımlamak kadar uzak bir amaç için yeniden kullanabilir. Ancak ImageNet içinde hiç olmayan verileri sınıflamak için probleminize özgü farklı yaklaşımlara ihtiyacınız olacaktır.

🌈Uygulamaya Google Colab üzerinden ulaşabilirsiniz.

⚠️Bu makale incelemesi yazımda, evrişimli sinir ağlarının başarılı sonuç vermesinin model karmaşıklığı ile doğru orantılı bir ilişkisi olmadığını vurgulamaya özen gösterdim. Makalede sistematik bir ölçeklendirmeden bahsedilmiştir. Böylece başarım artmaya devam ederken hız bakımından da pozitif yol alınmıştır.