Derin Öğrenme İçin Aktivasyon Fonksiyonlarının Karşılaştırılması
🌎 Please visit Towards Data Science for the English version of my article: Comparison of Activation Functions for Deep Neural Networks
Aktivasyon fonksiyonları sinir ağlarında kilit bir rol oynar, bu nedenle daha iyi performans elde etmek için avantajlarını ve dezavantajlarını anlamak esastır.
En iyi bilinen sigmoid fonksiyonuna alternatif olan lineer olmayan aktivasyon fonksiyonlarını tanıtarak işe başlamak gerek. Aktivasyon fonksiyonlarının son performanslarını değerlendirirken birçok farklı koşulun önemi olduğunu unutmamak gerekir. Matematiğin ve bu noktada türev işleminin önemine dikkat çekmek de gerek. O halde hazırsanız kolları sıvayalım ve biraz ellerimizi kirletelim!
Yapay sinir ağı neydi (emekti 😅 ), önce bunu bir hatırlayalım: Canlıların sinir sistemi vasıtasıyla öğrenme yapısının modellenmesi/taklit edilmesi üzerine kurulu yapay öğrenme tekniğidir. Canlı sinir yapısı hiyerarşik bir elektriksel akım sonucu algılama işlemleri gerçekleşmektedir. Almaçlardan alınan elektriksel dürtü ile gördüğümüz, duyduğumuz, hissettiğimiz ve düşündüğümüz her şeyi doğduğumuzdan bu yana öğrenmemizi, hatırlamamızı ve ezberlememizi sağlar. Sinirbilim oldukça derin ve merak uyandırıcı bir çalışma alanıdır. Biyolojik yapının matematiksel sürece geçişiyle ilgili detaylar için ŞU KARA KUTUYU AÇALIM: Yapay Sinir Ağları yazıma göz atabilirsiniz.
Aktivasyon Fonksiyonuna Neden İhtiyaç Duyarız?
Yapay sinir ağlarına doğrusal olmayan gerçek dünya özelliklerini tanıtmak için aktivasyon fonksiyonuna ihtiyaç duyarız. Temel olarak basit bir yapay sinir ağında x girdiler, w ağırlıklar olarak tanımlanır ve ağın çıkışına aktarılan değere f(x) yani aktivasyon işlemi uygularız. Daha sonra bu, nihai çıkış ya da bir başka katmanın girişi olacaktır.
Çıkışa Aktarılacak Bu Sinyali Neden Aktive Etmeden Yapamıyoruz?
Eğer aktivasyon fonksiyonu uygulanmazsa çıkış sinyali basit bir doğrusal fonksiyon olur. Doğrusal fonksiyonlar yalnızca tek dereceli polinomlardır. Aktivasyon fonksiyonu kullanılmayan bir sinir ağı sınırlı öğrenme gücüne sahip bir doğrusal bağlanım (linear regression) gibi davranacaktır. Ama biz sinir ağımızın doğrusal olmayan durumları da öğrenmesini istiyoruz. Çünkü sinir ağımıza öğrenmesi için görüntü, video, yazı ve ses gibi karmaşık gerçek dünya bilgileri vereceğiz. Çok katmanlı derin sinir ağları bu sayede verilerden anlamlı özellikleri öğrenebilir.
Öyleyse Neden Doğrusal Olmayan Fonksiyonlara İhtiyaç Var?
Birden fazla dereceye sahip olan fonksiyonlara doğrusal olmayan fonksiyonlar deriz. Yapay sinir ağları, evrensel fonksiyon yakınsayıcıları olarak tasarlanmış ve bu hedefte çalışması istenmektedir. Bu herhangi bir fonksiyonu hesaplayabilip öğrenme yetisine sahip olmaları gerektiği anlamına gelmektedir. Doğrusal olmayan aktivasyon fonksiyonları sayesinde ağların daha güçlü öğrenmesi sağlanabilir. Zaten bu yazı da tamamen bu konuyla ilgili 😇
Ağırlıklar ile ilgili hata değerlerini hesaplamak için yapay sinir ağında hatanın geriye yayılımı algoritması uygulanmaktadır. Optimizasyon stratejisini belirlemek ve hata oranını minimize etmek gerekmektedir. Uygun optimizasyon algoritmasını seçmek de ayrı bir konudur.
Her zaman yapılacak iş: Girişler ile ağırlıkları çarp, bias ile topla ve aktivasyon uygula!
AKTİVASYON FONKSİYONLARI
Basamak (Step) Fonksiyonu
İkili değer alan bir fonksiyondur ve tabiatı gereği ikili sınıflayıcı olarak kullanılır. Bu yüzden genellikle çıkış katmanlarında tercih edilir. Gizli katmanlarda türevi öğrenme değeri temsil etmediği için kullanılması tavsiye edilmez ve zaten karşınıza da çıkmayacaktır. Peki o zaman türevlenebilir bir fonksiyon düşünelim deyince akla hemen doğrusal (linear) fonksiyon geliyor.
Doğrusal (Linear) Fonksiyon
Bir dizi aktivasyon değeri üretir ve bunlar basamak fonksiyonundaki gibi ikili değerler değildir. Kesinlikle bir kaç nöronu (sinir hücresi) birbirine bağlamaya izin verir. Fakat bu fonksiyonun önemli bir sorunu var! Türevinin sabit olması. Peki neden türevine ihtiyacımız var ve sabit olmasının olumsuzluğu nedir? Ne demiştik; geriye yayılım (backpropagation) algoritması ile öğrenme işlemini nöronlar için gerçekleştirmiş oluyorduk. Bu algoritma türev alan bir sistemden oluşuyor. A=c.x, x’e göre türevi alındığında c sonucuna erişiriz. Bu x ile bir ilişkinin kalmadığı anlamına gelir. Peki türevi hep sabit bir değer çıkıyorsa öğrenme işlemi gerçekleşiyordur diyebilir miyiz? Maalesef, hayır!
Bir başka sorun daha var! Tüm katmanlarda doğrusal fonksiyon kullanıldığında giriş katmanı ile çıkış katmanı arasında hep aynı doğrusal sonuca ulaşılır. Doğrusal fonksiyonların doğrusal bir şekilde birleşimi yine bir başka doğrusal fonksiyondur. Bu en başta birbirine bağlayabiliriz dediğimiz nöronların yani ara katmanların işlevsiz kaldığı anlamına gelir. Yani ilk amacımız olan çok katmanda çalışma yeteneğimizi kaybettik! 🙄
Sigmoid Fonksiyonu
Düşünün ki doğadaki çoğu problem doğrusal değil ve sigmoid fonksiyonunun kombinasyonları da doğrusal değil. Bingo!
O halde katmanları sıralayabiliriz.😃 Peki ikili olmayan fonksiyonları düşünelim. Aynı şekilde basamak fonksiyonundan farklı olduğu için türevlenebilirdir. Bu da demek oluyor ki öğrenme olayı gerçekleşebilecek. Grafiği incelersek x, -2 ile +2 arasında iken y değerleri hızlı şekilde değişir. x’te yapılan küçük değişimler y’de büyük olacaktır. Bu iyi bir sınıflayıcı olarak kullanılabileceği anlamına gelir. Bu fonksiyonun bir diğer avantajı da doğrusal fonksiyonda olduğu gibi (-sonsuz, +sonsuz) ile karşılaşıldığında her zaman (0,1) aralığında değer üretir. Yani aktivasyon değeri uçmaz, bu güzel haber! 🎈
Sigmoid fonksiyonu en sık kullanılan aktivasyon fonksiyonu olmakla beraber birçok başka ve daha verimli alternatifleri de vardır.
Peki sigmoid fonksiyonunun sorunu ne?
Fonksiyonun uçlarına doğru grafiğe dikkatlice bakarsak, y değerleri x’teki değişikliklere çok az tepki vermektedir. Bu ne gibi bir problem doğurur, bir düşünelim! 🤔 Bu bölgelerde türev değerleri çok küçük olur ve 0'a yakınsar. Buna gradyanların ölmesi/kaybolması (vanishing gradient) denir ve öğrenme olayı minimum düzeyde gerçekleşir. 0 olursa gerçekleşmez! Yavaş bir öğrenme olayı gerçekleştiğinde hatayı minimize eden optimizasyon algoritması yerel (lokal) minimum değerlere takılabilir ve yapay sinir ağı modelinden alınabilecek maksimum performansı alamayız. O halde bu soruna alternatif aktivasyon fonksiyonu arayışımıza devam edelim! 🔎
Hiperbolik Tanjant Fonksiyonu
Sigmoid fonksiyonuna çok benzer bir yapıya sahiptir. Ancak fonksiyonun aralığı bu kez (-1,+1) olarak tanımlanmaktadır. Sigmoid fonksiyonuna göre avantajı ise türevinin daha dik olması yani daha çok değer alabilmesidir. Bu daha hızlı öğrenme ve sınıflama işlemi için daha geniş aralığa sahip olmasından dolayı daha verimli olacağı anlamına gelmektedir. Ama yine fonksiyonun uçlarında gradyanların ölmesi problemi devam etmektedir. Karşımıza çokça çıkan bir aktivasyon fonksiyonu olsa da daha iyisini bulma arayışımız devam edecek!
ReLU (Rectified Linear Unit) Fonksiyonu
İlk bakışta pozitif eksende doğrusal fonksiyon ile aynı özelliklere sahip gibi görünecektir. Ama her şeyden önce ReLU doğada doğrusal değildir. Aslına bakılırsa iyi bir tahmin edicidir. ReLU’nun kombinasyonları ile herhangi başka bir fonksiyona da yakınsamak mümkündür. Harika! O halde yine yapay sinir ağımızda katmanları sıralayabileceğimiz anlamına geliyor 😄
ReLU [0, +∞) aralığında değer alıyor, peki bunun getirileri ve götürüleri neler? Çok fazla nöronlu büyük bir sinir ağı hayal edelim. Sigmoid ve Hiperbolik Tanjant neredeyse tüm nöronların aynı şekilde ateşlenmesine/aktive olmasına sebep oluyordu. Bu aktivasyon yoğun yani çok işlem gerektiriyor demektir. Ağdaki bazı nöronların aktif olup, aktivasyon seyrek yani verimli bir hesaplama yükü olsun isteriz. ReLU ile bunu sağlamış oluyoruz. Negatif eksende 0 değerlerini alması ağın daha hızlı çalışacağı anlamına da gelmektedir. Hesaplama yükünün sigmoid ve hiperbolik tanjant fonksiyonlarına göre az olması çok katmanlı ağlarda daha çok tercih edilmesine sebep olmuştur. Süper! 😎 Fakat ReLU bile tam olarak harika değil, neden mi? Bize işlem hızı kazandıran bu sıfır değer bölgesinin türevinin de sıfır olması! Yani öğrenmenin o bölgede gerçekleşmiyor olması. Hay aksi! 😕 O zaman bir hile ile yeni bir aktivasyon fonksiyonu bulmalıyız.
Sızıntı (Leaky) ReLU Fonksiyonu
Sızıntı kısmını görebiliyor musunuz, negatif düzlemde? 😲
Bu sızıntı değeri 0,01 olarak verilir eğer sıfıra yakın farklı bir değer verilirse fonksiyonun adı rastgele Leaky ReLU olarak olarak değişmektedir. (Hayıırr, yeni bir fonksiyon daha mı?! 😱) Sızdırılan ReLU’nun tanım aralığı eksi sonsuza doğru devam etmektedir. Bu 0'a yakın ama 0 olmayan değer sayesinde ReLU’daki ölen gradyanları yaşatmış yani öğrenmeyi negatif bölgedeki değerler için de sağlamış oluruz. Nasıl, zekice di mi? 🤓
Softmax Fonksiyonu
Sigmoid fonksiyonuna çok benzer bir yapıya sahiptir. Aynı Sigmoid’te olduğu gibi sınıflayıcı olarak kullanıldığında oldukça iyi bir performans sergiler. En önemli farkı sigmoid fonksiyonu gibi ikiden fazla sınıflamak gereken durumlarda özellikle derin öğrenme modellerinin çıkış katmanında tercih edilmektedir. Girdinin belirli sınıfa ait olma olasılığını 0–1 aralığında değerler üreterek belirlenmesini sağlamaktadır. Yani olasılıksal bir yorumlama gerçekleştirir.
Swish (A Self-Gated/Kendinden Geçitli) Fonksiyonu
ReLU’dan en önemli farkı negatif bölgede değer alır. E, Leaky ReLU’da aynı şekilde değer alıyordu, ondan farkı ne? Swish’in negatif bölgede aldığı değerler doğrusal değildir! Diğer tüm aktivasyon fonksiyonları monotondur. Swish fonksiyonun çıktısının girdi arttığında bile düşebileceğine dikkat edin. Bu ilginç ve swish’e özgü bir özelliktir.
f(x)=2x*sigmoid(beta*x)
Swish fonksiyonun tanımında yer alan beta’nın öğrenilebilir bir parametre olduğu Swish’in basit bir versiyonu olarak düşünürsek eğer beta=0 ise sigmoid kısmı her zaman 1/2 olur ve f(x) → doğrusal olur. Diğer yandan eğer beta çok büyük bir değer seçilirse sigmoid neredeyse ikili bir basamak fonksiyonuna dönüşür (0 için x<0,1 için x>0). Böylece f(x) ReLU fonksiyonuna yakınsar. Bu nedenle standart Swish fonksiyonunda beta=1 olarak seçilir. Bu şekilde yumuşak bir enterpolasyon (değişken değer setlerini verilen aralıkta ve istenilen hassasiyette bir fonksiyon ile ilintilendirme) sağlanmış olur. Mükemmel! Gradyanların ölmesi sorununa bir çözüm bulunmuş oldu, aradığımız fonksiyon bu sanki.
HANGİ AKTİVASYON FONKSİYONU TERCİH EDİLMELİDİR?
Tabii ki onu, bunu ya da şunu kullanacaksınız demeyeceğim. Çünkü her bir aktivasyon fonksiyonunun kendine özgü avantaj ve dezavantajlarını sıraladım. Çok sınıflayıcı fonksiyonlar olarak geniş aralıkta aktive olması dolayısıyla hiperbolik tanjant ya da modelim biraz daha yavaş öğrenebilir derseniz sigmoid fonksiyonu kullanılabilir. Ama ağınız çok derinse ve işlem yükü önemli bir problemse ReLU tercih edilebilir. ReLU’daki gradyanların ölmesi sorununa çözüm olarak Leaky ReLU kullanmaya karar verebilirsiniz. Ama ReLU’ya göre daha çok işlem yapmış olursunuz.
Yani aktivasyon fonksiyonu tüm bu bilgiler ve sizin yapay öğrenme modelinizin gereksinimlerine göre karar vermeniz gereken kritik bir optimizasyon problemidir.
- Ağın kolay ve hızlı yakınsaması ilk kriter olabilir.
- ReLU hız bakımından avantajlı olacaktır. Gradyanların ölmesini göze almanız gerek. Genellikle çıkış değil ara katmanlarda kullanılır.
- Gradyanların ölmesi problemine ilk çözüm Leaky ReLU olabilir.
- Derin öğrenme modelleri için ReLU ile denemelere başlamanız tavsiye edilebilir.
- Çıkış katmanlarında genellikle Softmax kullanılır.
Bunların karşılaştırılmalarının değerlendirildiği sayısız makaleye ulaşabilirsiniz. En güzeli ve benim tavsiyem elinizi kirletmenizdir! Yani kendiniz test edin, hazırsanız buyursunlar…
AKTİVASYON FONKSİYONLARININ TANIMLANMASI VE EKRANA ÇİZDİRİLMESİ
Öncelikle aktivasyon fonksiyonlarını tanımlayıp çizdirme işine bir bakalım:
AKTİVASYON FONKSİYONLARININ PERFORMANSLARININ DEĞERLENDİRİLMESİ
State of the art dediğimiz klasik MNIST (el yazısı rakamlar) veri seti üzerinde Evrişimli Sinir Ağı Modeli için aktivasyon fonksiyonlarının karşılaştırılmasına göz atalım.
2 Evrişim katmanına sahip olan model Sigmoid, Hiperbolik Tanjant, ReLU, Leaky ReLU ve Swish fonksiyonları için uygulandığında bazılarının nasıl diğerlerinin önüne geçtiği ve bazılarının da nasıl birbirine çok yakın olduğunu gözlemleyebilirsiniz. Farklı veri setleri için test yapabilirsiniz. Ayrıca diğer, epoch, küme boyutu, dropout (seyreltme)gibi parametrelerin etkisini de incelemek fikir verebilir. Belki bir sonraki yazımın konusu bunlardan biri olabilir!
Örnek uygulamaların doğrulama/geçerleme ve eğitim doğruluk ve yitim değerlerinin sonuçları 20 epoch için verilmektedir. Ayrıca test sonuçları da tablo olarak gösterilmektedir.
🌈Kodlara Google Colab üzerinden ulaşabilirsiniz.
🎬Anlatım videosunu buradan izleyebilirsiniz!
🌈Aktivasyon fonksiyonları doğrusal olmayan karar sınırları oluşturmada nasıl yardımcı olur? Buradan ek uygulamaya ulaşabilirsiniz!
Gradyan ve kısmi türev görselleştirmeli anlatım için buraya göz atınız!
Kaynaklar
- Fundamentals of Deep Learning — Activation Functions and When to Use Them?
- Understanding Activation Functions in Neural Networks
- Comparison of non-linear activation functions for deep neural networks on MNIST classification task
- SWISH: A Self-Gated Activation Function
- Groundbreaking Activation Functions
- The Softmax function and its derivative
- Experiments with SWISH activation function on MNIST dataset