Derin Öğrenme (Deep Learning) - Yapay Sinir Ağı

Aktivasyon Fonksiyonu(Activation Function)

Yayın tarihi :14-Şub-22

 Derin öğrenme amacıyla geliştirilen yapay sinir ağı modellerinin en temel ve kritik parçalarından birisi aktivasyon fonksiyonudur. Bu durumun en temel nedenlerinin başında kontrol ve tanımlama işlemleri gelmektedir. Yani, bu durumun daha iyi anlaşılabilinmesi için aktivasyon fonksiyonunun en temel kullanım amaçlarına bakmak gerekirse;

  • Verilerin özelliklerinin ve kalıplarının matematiksel ifadelerle hesaplanarak analizlendiği gizli katmanlarda ki aktivasyon fonksiyonu, oluşturulan yapay sinir ağı modelinin veri setini hangi oranlarda ve verimde öğrenebildiğini kontrol eder,
  • Çıktı verilerinin oluşturulduğu çıktı katmanında kullanılan aktivasyon fonksiyonu, yapay sinir ağ modelinin gerçekleştirebileceği tahminsel çeşitliliğin tanımlamalarını yapabilmektedir. 

Bu temel bilgiler göz önüne alındığı zaman yapay sinir ağı çalışmalarında aktivasyon fonksiyonlarının yapılacak çalışmalar açısından oldukça kritik bir rol oynadığı söylenebilir. 

Aktivasyon Fonksiyonu Nedir?

Herhangi bir yapay sinir ağı yapısında aktivasyon fonksiyonu en basit ifadesiyle; çalışmalarda kullanılmak istenilen girdi verilerinin ağırlık toplamlarının herhangi bir düğümden(node) ve/veya düğümlerden(nodes) nasıl çıktılara dönüştürülebileceğinin tanımlanmasını sağlamaktadır. Tekniksel anlamda yapay sinir ağları herhangi bir katmanda bulunan bütün düğümler açısından ortak aktivasyon fonksiyonunu kullanabilirliğe göre tasarlanmıştır. Ancak bazı durumlarda düğümlere spesifiher düğüme özgü olarak kullanılabilinmektedir. Örneğin; özellik ve kalıp analizmelerinin yapıldığı gizli katmanlarda genel olarak aynı aktivasyon fonksiyonu kullananılmaktadır. Ancak, çıktı verilerinin oluşturulduğu çıktı katmanında farklı bir aktivasyon fonksiyonu kullanılmaktadır. Bu çeşitliliğin meydana gelmesindeki en temel faktör fonksiyonun kullanım alanıdır. Yani verilen örnekten hareketle, çıktı katmanında farklı aktivasyon fonksiyonunun kullanılması model yapısının uygun tahminsel çeşidine bağlıdır.

Günümüzde aktivasyon fonksiyonu farklı isimlendirmeler kullanılarak ifade edilebilinmektedir. Örneğin; "aktarım fonksiyonu (transfer function)" veya "ezme fonksiyonu (squashing function) " ifadeleriyle tanımlanabilinmektedir. 

Yapay sinir ağı modellemelerinde kullanılan aktivasyon fonksiyonlarının birçoğu doğrusal(lineer) değildir. Bu durumdan dolayı ise aktivasyon fonksiyonları spesifik katmanlarda veya genel ağ model yapısında "doğrusal olamama(nonlinearity) " ifadesiyle tanımlanmaktadır.

Yapay sinir ağları kullanılarak yapılmak istenilen çalışmalarda aktivasyon fonksiyonlarının seçimleri de oldukça kritik bir nokta olarak ifade edilebilir. Çünkü, bu fonksiyonların doğru seçimlerine bağlı olarak genel yapay sinir ağ model kapasitesinde ve/veya sinir ağının performansında oldukça ciddi artışlar elde edilebilinmektedir. Ayrıca, yukarıda bahsedildiği üzere yapay sinir ağ modelinin farklı katman veya bölümlerinde farklı aktivasyon fonksiyonları kullanılabilir. 

Günümüzde derin öğrenme alanında yapılan çalışmalarda kullanılan aktivasyon fonksiyonları genel olarak türevlenebilme özelliği açısından geliştirilmiştir. Bu gelişime bağlı olarak herhangi bir girdi verinin matematiksel anlamda birinci dereceden türevi alınabilinmektedir. Bu geliştirmenin temel nedeni, kullanılan modelin ağırlık oranlarını güncelleyebilmek için tahminsel hata değerinin türevsel hesaplamaya ihtiyaç duyması ve böylelikle hata algoritmasının geri yayılımının kullanılmasına bağlı olarak eğitilmesi olarak ifade edilebilir. 

 

Aktivasyon Fonksiyonu Türleri 

Günümüzde derin öğrenme alanında yapılacak çalışmalara özgü birçok farklı aktivasyon fonksiyonu geliştirilmiştir. Ancak, geliştirilen bu fonksiyonların birçoğu yapay sinir ağı çalışmalarında tercih edilmemektedir. Günümüzde gizli ve çıktı katmanları referanslı kullanılan birkaç tane aktivasyon fonksiyonu kullanım görmektedir.

Bu fonksiyonlar arasında en yaygın olarak kullanılan tür;

  • ReLU (Rectified Linear Unit)

Diğer aktivasyon fonksiyonu türleri;

  • Sigmoid (Logistic)
  • Softmax
  • Hyperbolic Tangent (Tanh)
  • Linear 

 

ReLU (Rectified Linear Unit)

Bu aktivasyon fonksiyon türü genel olarak gizli katmanlar üzerinde gerçekleştirilen işlevlerde oldukça yaygın bir şekilde kullanılmaktadır. Bu fonksiyonun diğer fonksiyon türlerine göre daha yaygın kullanılmasının bazı nedenleri mevcuttur. Bunlar;

  1. Çalışmalarda meydana gelebilecek sınırlandırmalar ile daha etkili mücadele,
  2. Uygulama açısından oldukça basit kullanıma sahip olması ve etkili sonuçlar meydana getirebilmesi,
  3. Model eğitilmesini engelleyebilecek kaybolan gradyan problemlerine(Vanishing gradient problem) oldukça daha az duyarlı olması,

gibi nedenler sayılabilir. Ancak bu olumlu nedenlerin tersi olarak ReLU fonksiyonu "ölü" birimlerden dolayı olumsuz etkilenebilir. Fakat bu durum oldukça ciddi bir sorun teşkil etmemektedir. 

ReLU fonksiyonunun matematiksel ifadesi; 

  • maks(0.0, x) 

          x: Girdi değeri 

Eğer girdi (x) negatif (-) bir değer ise 0.0 değeri döndürülür, ancak "x" pozitif (+) bir değer ise 0.0 değeri değil "x" değeri döndürülür. 

Örnek çalışma:

#Relu fonksiyonu
def relu(x):
    return max(0.0,x)

x_list=[0,1,5,-5,-19,22]
for x in x_list:
    print('{} değerine "Relu" uygulanırsa : {}'.format(x, relu(x)))

Çıktı:

0 değerine "Relu" uygulanırsa : 0.0
1 değerine "Relu" uygulanırsa : 1
5 değerine "Relu" uygulanırsa : 5
-5 değerine "Relu" uygulanırsa : 0.0
-19 değerine "Relu" uygulanırsa : 0.0
22 değerine "Relu" uygulanırsa : 22

 Sigmoid (Logistic)

Sigmoid aktivasyon fonksiyonu yaygın olarak lojistik fonksiyon olarak bilinmektedir. Lojistik aktivasyon fonksiyon türü, makine öğrenimi alanlarından birisi olan sınıflandırma işleminde kullanılan lojistik regresyon ile eş işleve sahiptir. Bu aktivasyon fonksiyonu rastgele gerçek bir değeri girdi değeri olarak belirler ve daha sonra 0.0 ile 1.0 arasındaki değerlere atama yapmaktadır. Belirlenen girdi değeri  "+∞" a nekadar yaklaşırsa, çıktı değeri de aynı oranda 1.0 'a yakın olur. Ancak, belirlenen girdi değeri "-" a ne kadar yaklaşırsa, çıktı değeri de aynı oranda 0.0 'a yakınlaşmaya başlar.

Sigmoid fonksiyonunun matematiksel ifadesi; 

  • 1/(1 + np.exp(-x))

Örnek çalışma:

#Sigmoid fonksiyonu
def sigmoid(x):
    return 1/(1 + np.exp(-x))

x_list=[0,1,5,-5,-19,22]
for x in x_list:
    print('{} değerine "Sigmoid" uygulanırsa : {}'.format(x, round(sigmoid(x),3)))

Çıktı:

0 değerine "Sigmoid" uygulanırsa : 0.5
1 değerine "Sigmoid" uygulanırsa : 0.731
5 değerine "Sigmoid" uygulanırsa : 0.993
-5 değerine "Sigmoid" uygulanırsa : 0.007
-19 değerine "Sigmoid" uygulanırsa : 0.0
22 değerine "Sigmoid" uygulanırsa : 1.0

 Hyperbolic Tangent (Tanh)

Bu aktivasyon fonksiyonu genel olarak Tanh kelimesiyle ifade edilmektedir. Bu fonksiyon lojistik aktivasyon fonksiyonuyla oldukça benzerlik göstermektedir. İki fonksiyon arasındaki en temel farklı lojistik fonksiyonunda 0.0 ile 1.0 değerleri kullanılırken, Tanh fonksiyonunda -1.0 ile +1.0 değerleri kullanılır. Bu aktivasyon fonksiyonu rastgele gerçek bir değeri girdi değeri olarak belirler ve daha sonra -1.0 ile +1.0 arasındaki değerlere atama yapmaktadır. Belirlenen girdi değeri  "+∞" a nekadar yaklaşırsa, çıktı değeri de aynı oranda +1.0 'a yakın olur. Ancak, belirlenen girdi değeri "-" a ne kadar yaklaşırsa, çıktı değeri de aynı oranda -1.0 'a yakınlaşmaya başlar.

Hyperbolic Tangent (Tanhfonksiyonunun matematiksel ifadesi; 

  • (np.exp(x) - np.exp(-x)) /( np.exp(x) + np.exp(-x))

Örnek çalışma:

import numpy as np
#Hyperbolic Tangent fonksiyonu
def htan(x):
    return (np.exp(x) - np.exp(-x))/(np.exp(x) + np.exp(-x))

x_list=[0,1,5,-5,-19,22]
for x in x_list:
    print('{} değerine "Hyperbolic Tangent" uygulanırsa : {}'.format(x, round(htan(x),4)))

Çıktı:

0 değerine "Hyperbolic Tangent" uygulanırsa : 0.0
1 değerine "Hyperbolic Tangent" uygulanırsa : 0.7616
5 değerine "Hyperbolic Tangent" uygulanırsa : 0.9999
-5 değerine "Hyperbolic Tangent" uygulanırsa : -0.9999
-19 değerine "Hyperbolic Tangent" uygulanırsa : -1.0
22 değerine "Hyperbolic Tangent" uygulanırsa : 1.0

Aktivasyon Fonksiyonlarının Seçimleri

Günümüzde aktivasyon fonksiyonları yapısal özelliklere ve çalışmalara uygunluk doğrultusunda seçilmektedir. Yukarıda bahsedildiği üzere yapay sinir ağı çalışmalarında yaygın olarak kullanılan ReLU, Lojistik ve Tanh fonksiyonları, sinir ağ yapısı parçalarından birisi olan katmanlara özgü seçilmektedir. Yani, daha önceden bahsedildiği üzere aktivasyon fonksiyonları temel olarak gizli ve çıktı katmanları üzerinde etkinlik göstermektedir. Bu bağlamda aktivasyon fonksiyonlarının seçim işlemleri gerçekleştirilirken ilk olarak hangi katman üzerinde çalışma yapılacağı belirlenmesi gerekmektedir. Buradan hareketle aktivasyon fonksiyon seçimleri iki temel sorunun cevaplarına bağlıdır. Bunlar;

  1. Gizli katmanlarda mı çalışma yapılacak?
  2. Çıktı katmanında mı çalışma yapılacak?

 

1. Gizli Katmanlarda Aktivasyon Fonksiyonu Seçimi

Gizli katmanlar; girdi katmanı ile çıktı katmanı arasında bulunan, en az bir veya daha fazla sütundan meydana gelen, özellik ve kalıp analizlemelerinin yapıldığı bölüm olarak ifade edilebilir. Herhangi bir sinir ağ yapısında bulunan gizli katmanların tamamında aynı aktivasyon fonksiyonu bulunmaktadır.  

Tarihsel akış açısından bakıldığında, aktivasyon fonksiyonlarının 1990'lı yılların başlarından itibaren kullanım yaygınlığı kazandıkları söylenebilir. Bu bağlamda ilk olarak 1990'lı yılların başlarında, yapay sinir ağ projelerinde Sigmoid fonksiyonları oldukça popüler ve başarılı bir şekilde kullanım görmüştür. Bu popülerlik ortalama olarak 1990'lı yılların ortalarına kadar devam etmiş ve yerini kendisinden daha iyi performans gösterebilen Tanh fonksiyonu almıştır. 1995'li yıllarda oldukça popülerlik kazanan Tanh fonksiyonu, yaklaşık 2010'lu yıllara kadar birçok çalışmada başarılı bir şekilde kullanım görmüştür. Bu yıllardan itibaren gelişen teknolojik imkanlar ve bilgi birikimlerinin entegrasyonu sonucunda ReLU fonksiyonları geliştirilmiş ve günümüzde en popüler ve en yüksek performansı gösteren aktivasyon fonksiyonu olarak ilk sıraya yerleşmiştir. Bu bilgilerden hareketle kısaca, gizli katmanlarda yapılacak çalışmalarda 3 farklı aktivasyon fonksiyonunun kullanılabileceği anlaşılmaktadır. Bunlar;

  1. ReLU
  2. Sigmoid
  3. Tanh

Önceki konularda bahsedildiği üzere, sinir ağları oldukça karmaşık bir yapıya sahiptir ve bu nedenle anlaşılmazlıktan kurtulmak ve meydana gelebilecek karmaşık sorunlarla mücadele edebilmek için çözümleyici bazı sinir ağları geliştirilmiştir. Bunlar;

  • Evrişimli sinir ağları(Convolutional neural networks (CNNs))
  • Tekrarlayan sinir ağları(Recurrent neural network (RNNs))
  • Çok Katmanlı Algılayıcı(Multilayer Perceptron (MLPs))

Belirtilen bu sinir ağ sınıfları yapısal ve işlevsel özellikler açısından birbirlerine göre farklılaşmalar göstermektedir. Bu durumdan dolayı ise gizli katmanlarda kullanılabilen 3 farklı aktivasyon fonksiyonları, belirtilen sinir ağ sınıflarına göre performans ve uygulanabilirlik açısından seçilmektedirler. Bu durumu daha basit bir şekilde ifade etmek gerekirse;

  • Evrişimli sinir ağları' nda               ReLU aktivasyon fonksiyonu
  • Tekrarlayan sinir ağları 'nda    Tanh ve/veya Sigmoid fonksiyonu
  • Çok Katmanlı Algılayıcı 'da            ReLU aktivasyon fonksiyonu

 

 

2. Çıktı Katmanında Aktivasyon Fonksiyonu Seçimi

Çıktı katmanları, bütün ileri-beslemeli(feed-forward) yapay sinir ağ yapılarında bulunan ve direkt olarak bir tahminsel çıktının oluşturulduğu katman olarak ifade edilebilir. Bu katman herhangi bir sinir ağ yapısında sadece bir sütunda ifade edilmektedir. Günümüzde çıktı katmanları üzerinde çalışmalar gerçekleştirebilmek için birçok farklı aktivasyon fonksiyonları geliştirilmiştir. Ancak, geliştirilen bu aktivasyon fonksiyonları içerisinde genel olarak bazıları yaygın ve etkili bir şekilde kullanılmaktadır. Bunlar;

  • Sigmoid(Lojistik)
  • Linear(Lineer)
  • Softmax

Belirtilen aktivasyon fonksiyonlarını temel bir şekilde incelemek gerekirse;

Sigmoid(Lojistik);

Sigmoid aktivasyon fonksiyonu yaygın olarak lojistik fonksiyon olarak bilinmektedir. Lojistik aktivasyon fonksiyon türü, makine öğrenimi alanlarından birisi olan sınıflandırma işleminde kullanılan lojistik regresyon ile eş işleve sahiptir. Bu aktivasyon fonksiyonu rastgele gerçek bir değeri girdi değeri olarak belirler ve daha sonra 0.0 ile 1.0 arasındaki değerlere atama yapmaktadır. Belirlenen girdi değeri  "+∞" a nekadar yaklaşırsa, çıktı değeri de aynı oranda 1.0 'a yakın olur. Ancak, belirlenen girdi değeri "-" a ne kadar yaklaşırsa, çıktı değeri de aynı oranda 0.0 'a yakınlaşmaya başlar.

Örnek çalışma;

#Sigmoid fonksiyonu
def sigmoid(x):
    return 1/(1 + np.exp(-x))
0
x_list=range(-10,10)
y_list=[]
for x in x_list:
    print('{} değerine "Sigmoid" uygulanırsa : {}'.format(x, round(sigmoid(x),3)))
    y_list.append(sigmoid(x))
    

Çıktı:

-10 değerine "Sigmoid" uygulanırsa : 0.0
-9 değerine "Sigmoid" uygulanırsa : 0.0
-8 değerine "Sigmoid" uygulanırsa : 0.0
-7 değerine "Sigmoid" uygulanırsa : 0.001
-6 değerine "Sigmoid" uygulanırsa : 0.002
-5 değerine "Sigmoid" uygulanırsa : 0.007
-4 değerine "Sigmoid" uygulanırsa : 0.018
-3 değerine "Sigmoid" uygulanırsa : 0.047
-2 değerine "Sigmoid" uygulanırsa : 0.119
-1 değerine "Sigmoid" uygulanırsa : 0.269
0 değerine "Sigmoid" uygulanırsa : 0.5
1 değerine "Sigmoid" uygulanırsa : 0.731
2 değerine "Sigmoid" uygulanırsa : 0.881
3 değerine "Sigmoid" uygulanırsa : 0.953
4 değerine "Sigmoid" uygulanırsa : 0.982
5 değerine "Sigmoid" uygulanırsa : 0.993
6 değerine "Sigmoid" uygulanırsa : 0.998
7 değerine "Sigmoid" uygulanırsa : 0.999
8 değerine "Sigmoid" uygulanırsa : 1.0
9 değerine "Sigmoid" uygulanırsa : 1.0
sns.lineplot(x=x_list,y=y_list)

Çıktı:

 

 Linear(Lineer);

Lineer(doğrusal) aktivasyon fonksiyonu adından da anlaşılacağı üzere bir doğru üzerinde değerlerin ifade edildiği fonksiyon türüdür ve günümüzde "kimlik(identity) " veya "aktivasyon olmayan(no activation) " fonksiyon olarak bilinmektedir. Bu fonksiyonun böyle ifade edilmesinin temel nedeni değerlerin 1.0 oranıyla çarpılmasından dolayıdır. Yani, lineer aktivasyon fonksiyonları girdi verilerinin ağırlık oranları "1(etkisiz eleman)" ile çarpar ve bunun sonucunda hiçbir değişim yaşanmamaktadır. Lineer aktivasyon fonksiyonun kullanılmasına bağlı olarak sadece girdi değerler değişim yaşamadan döndürülmektedir. 

Örnek çalışma;

#Linear fonksiyonu
def linear(x):
    return x
0
x_list=range(-10,10)
y_list=[]
for x in x_list:
    print('{} değerine "Linear" uygulanırsa : {}'.format(x, round(linear(x),3)))
    y_list.append(linear(x))

Çıktı:

-10 değerine "Linear" uygulanırsa : -10
-9 değerine "Linear" uygulanırsa : -9
-8 değerine "Linear" uygulanırsa : -8
-7 değerine "Linear" uygulanırsa : -7
-6 değerine "Linear" uygulanırsa : -6
-5 değerine "Linear" uygulanırsa : -5
-4 değerine "Linear" uygulanırsa : -4
-3 değerine "Linear" uygulanırsa : -3
-2 değerine "Linear" uygulanırsa : -2
-1 değerine "Linear" uygulanırsa : -1
0 değerine "Linear" uygulanırsa : 0
1 değerine "Linear" uygulanırsa : 1
2 değerine "Linear" uygulanırsa : 2
3 değerine "Linear" uygulanırsa : 3
4 değerine "Linear" uygulanırsa : 4
5 değerine "Linear" uygulanırsa : 5
6 değerine "Linear" uygulanırsa : 6
7 değerine "Linear" uygulanırsa : 7
8 değerine "Linear" uygulanırsa : 8
9 değerine "Linear" uygulanırsa : 9
sns.lineplot(x=x_list,y=y_list)

Çıktı:

 

 Softmax;

Softmax aktivasyon fonksiyonu, herhangi bir yapay sinir ağında meydana gelen tahminsel çıktı değerlerini sınıfsal tabanda olasılıksal dağılımlara göre normalleştirmek(normalize) için kullanılmaktadır. Bu bilgiden hareketle kısaca softmax; sayıları ve/veya logaritmaları olasılık hesaplarına göre ölçeklendirmeye yarayan, böylelikle sınıfsal üyeliklerin yorumlanabilmesine olanak sağlayan popüler bir fonksiyon olarak tanımlanabilir. Yani bu fonksiyon, çıktı değerlerinde meydana gelebilecek her sonucun olasılıklarını bünyesinde barındıran ve toplamları 1.0 değerini veren değerler vektörünü ifade etmektedir. 

Softmax fonksiyonunun matematiksel ifadesi; 

  • exp(x) / sum(exp(x))

Örnek Çalışma;


# Softmax aktivasyon fonksiyonu
def softmax(x):
  

inputs = range(-4,4)

outputs = softmax(inputs)

print("Çıktı Listesi:",outputs)

print("Toplam:",outputs.sum())  return exp(x) / exp(x).sum()
 

Çıktı:

Çıktı Listesi: [5.76612770e-04 1.56739601e-03 4.26062410e-03 1.15815771e-02
 3.14819905e-02 8.55769227e-02 2.32622194e-01 6.32332683e-01]
Toplam: 1.0

 

Çıktı Katmanında Aktivasyon Fonksiyonu Seçimi

Yukarıda bahsedildiği üzere çıktı katmanlarında yaygın olarak 3 farklı aktivasyon fonksiyonu kullanılmaktadır. Bu fonksiyonların yapısal özellikleri ve işlevleri temel olarak birbirlerinden farklılaşmalar göstermektedir. Bu farklılaşmalardan dolayı ise 3 farklı aktivasyon fonksiyonu, bazı tahminsel problemler için spesifik olarak geliştirilmiştir. Bu bağlamda standart olarak belirlenmiş tahminsel problemleri gruplandırmak gerekirse;

     Sınıflandırma(Kategorik değişken tahminlemesi için)

  1. İkili Sınıflandırma(Binary Classification): İki sınıfın birbirini dışladığı ve çıktı katmanının tek düğümden oluştuğu sınıflandırmadır.
  2. Çok Sınıflı Sınıflandırma(Multiclass Classification): Minimum ikiden fazla sınıfın birbirlerini dışladığı ve çıktı katmanında her sınıf başına bir düğüm bulunan sınıflandırmadır.
  3. Çok Etiketli Sınıflandırma(Multilabel Classification): Minimum iki veya daha fazla sınıfın birbirlerini kapsadığı ve çıktı katmanında her sınıf başına bir düğüm bulunan sınıflandırmadır.

     Regresyon(Sayısal değişken tahminlemesi için)

olarak iki farklı kategoride incelenebilir. Buradan anlaşıldığı üzere;

  • eğer meydana gelen problem sınıflandırma üzerine ise sınıflandırma için spesifik olarak geliştirilmiş aktivasyon fonksiyonları,
  • eğer meydana gelen problem regresyon üzerine ise regresyon için spesifik olarak geliştirilmiş aktivasyon fonksiyonları seçilmelidir.

 

 

Paylaş:

Yorum Yap (*Yorumunuza kod eklemek isterseniz Kod Parçacığı Ekle butonuna tıklayarak ekleyebilirsiniz.)

Yorumlar

Henüz hiç yorum yapılmamış, ilk yorum yapan sen ol.