Bu bölümde temel yapay sinir ağlarında kullanılan;
- Teknik Terimler,
- Toplayıcı Fonksiyonlar,
- Aktivasyon Fonksiyonları,
- Transfer Fonksiyonu,
- İleri beslemeli ağlarda yapılan temel işlem adımları
- Geri beslemeli ağlarda yapılan temel işlem adımları
anlatılacaktır.
1. Teknik Terimler:
Bu bölümde Yapay Sinir Ağları içerisinde kullanılan temel terimler açıklanacaktır.
- Nöron: Temel biyoloji teriminde nöronlar, aksonları boyunca dendritlerden bir uçtan diğer uca bir elektrik sinyali gönderir. Bu sinyaller daha sonra başka bir nörona geçirilir. Bu işlemler sinir sistemi boyunca iletilerek bilgilerin beyne iletilmesini sağlar. Benzer şekilde de yapay sinir ağlarındaki nöronlar elde ettiği bilgileri diğer nöronlara taşır. Böylece sistemin giriş değerlerine göre çıkış verilerini öğrenmesini sağlar.
- Ağ: Nöronların birbirine bağlı olduğu graf yapılardır.
- Katman: Farklı düzeylerde yer alan nöron gruplarıdır. Yapay sinir ağları üç ana katmandan oluşmaktadır. Bunlar sırasıyla;
- Giriş Katmanı: Sisteme giriş olarak gelen veriler bu katmanda yer alır. Bu katmanda giriş verileri üzerinde hiçbir değişiklik yapmadan bir sonraki katman olan hidden (gizli) katmana aktarır.
- Gizli Katman: Verinin transfer edildiği katmandır. Öğrenme bu katmanda olur.
- Çıkış Katmanı: Sistemin giriş verilerine göre öğrenmesini istenilen çıkış değerleri burada yer alır. Sistem çıktısının alındığı yerdir.
- Aktivasyon Fonksiyonu: Nörona gelen bilginin bir sonraki nörona iletilip iletilmeyeceğine karar veren birimdir.
- İleri beslemeli Ağ: Giriş katmanından alınan veriler sırası ile gizli katman ve çıkış katmanına iletildiği süreçtir.
- Geri Beslemeli Ağ: İleri beslemeli ağ ile elde edilen çıktı değerleri ile gerçek sistem çıktısı arasındaki hata oranlarına bakılarak hatanın geriye doğru yayılımı ile giriş katmanına kadar iletilmesi işlemi için geçen süreçtir.
Temel bir Yapay Sinir ağının şekli aşağıda verilmiştir;
2. Toplayıcı Fonksiyonlar:
Giriş verisinin belli ağırlık ve bias değerleri ile işleme alındığı fonksiyonlardır. Bu adımda toplama, çarpma gibi fonksiyonlar seçilmektedir. Aşağıdaki tabloda kullanılabilecek toplayıcı fonksiyonlar verilmiştir. Bu fonksiyonlar içerisinde en yaygın olarak kullanılan fonksiyon “Ağırlıklı Toplama” dır.
Bazı Toplama Fonksiyonları (Çayıroğlu, 2015) [2]
Aşağıdaki fonksiyonda örnek bir ağırlıklı toplayıcı fonksiyonun işlemi gösterilmiştir.
3. Aktivasyon Fonksiyonları
Aktivasyon fonksiyonu ile girdi değerlerine belli ağırlık ve bias değerleri eklenerek yapılan hesaplama sonucu elde edilen bilginin bir sonraki nörona iletip iletilmeyeceğine karar vermeye yaramaktadır. Aktivasyon fonksiyonu seçilir iken iki önemli duruma dikkat edilmelidir. Bunlar sırası ile;
- Fonksiyonun lineer olmaması. (YSA’ların non-linear olması)
- Seçilen fonksiyonun türevinin kolay alınması. (Geri beslemeli ağlar da hesaplama karmaşıklığını azaltmak için)
Aşağıdaki tabloda YSA’larda yaygın olarak kullanılan aktivasyon fonksiyonlarının listesi verilmiştir.
Aktivasyon Fonksiyonları | Grafik [1] | Açıklaması | Python Kodu |
Step Fonksiyonu | Giriş değeri — 0
x>0 ise y = 1 — x<0 ise y = 0 |
step_func = lambda x, th: np.heaviside(x, th) |
|
Sigmoid Fonksiyonu |
sigmoid = lambda x: 1 / (1 + np.exp(-x)) |
||
Tanh Fonksiyonu |
|
tanh = lambda x: 2*sigmoid(2*x) - 1 |
|
ReLu | |
f(x) = max(0, x) |
relu= lambda x: np.maximum(0, x) |
Yukardaki grafiklerinin python kodu aşağıda verilmiştir.
#!/usr/bin/env python2 # -*- coding: utf-8 -*- from matplotlib import pylab import pylab as plt import numpy as np from matplotlib.ticker import NullFormatter # useful for `logit` scale sigmoid = lambda x: (1 / (1 + np.exp(-x))) step_func = lambda x, th: np.heaviside(x, th) tanh = lambda x: 2*sigmoid(x) - 1 relu= lambda x: np.maximum(0, x) y = plt.linspace(-10,10,100) # plot with various axes scales plt.figure(1) # linear plt.subplot(221) plt.plot(y, sigmoid(y), 'b', label='linspace(-10,10,100)') plt.text(0.5, 0.5, r'$\sigma(x)=\frac{1}{1+e^{-x}}$', fontsize=12) plt.yscale('linear') plt.title('Sigmoid Function') plt.grid(True) # log plt.subplot(222) plt.plot(y, step_func(y, 0), 'b', label='linspace(-10,10,100)') plt.text(0.1, 0.5, r'$\ x>0 \Rightarrow y=1, x \leq 0 \Rightarrow y=0 $', fontsize=11) plt.title('Step Function') plt.grid(True) # symmetric log plt.subplot(223) plt.plot(y, tanh(y), 'b', label='linspace(-10,10,100)') plt.text(-10, 0.5, r'$\ tanh(x) = 2sigma(x) - 1 $', fontsize=11) plt.title('Tanh Function') plt.grid(True) # logit plt.subplot(224) plt.plot(y, relu(y), 'b', label='linspace(-10,10,100)') plt.text(-6, 6, r'$\ relu(x) = max(0, x) $', fontsize=13) plt.title('ReLu Function') plt.grid(True) # Format the minor tick labels of the y-axis into empty strings with # `NullFormatter`, to avoid cumbering the axis with too many labels. plt.gca().xaxis.set_major_locator(plt.MultipleLocator(1)) plt.gca().yaxis.set_major_locator(plt.MultipleLocator(1)) # Adjust the subplot layout, because the logit one may take more space # than usual, due to y-tick labels like "1 - 10^{-3}" plt.subplots_adjust(top=0.92, bottom=0.08, left=0.10, right=0.95, hspace=0.25, wspace=0.35) plt.show()
4. Transfer Fonksiyonu
Özetle nöronların iç yapısıdır. Toplayıcı ve aktivasyon fonksiyonlarının bir araya geldiği kaskat yapıya denmektedir. Aşağıdaki transfer fonksiyonun iç yapısı gösterilmiştir.
Örnek 1: Bu örnekte bir giriş katmanındaki verilerin çıkış katmanına nasıl taşındığını gösterilecektir. Yapılacak işlemler sadece 1 adım için geçerlidir.
İleri Beslemeli Ağlarda 1 Adım ilerlemek; (basit matris çarpımı uygulanır)
- O1 = [(x1*0.9 + x2*0.3) (x1*0.2 + x2*0.8)]
- x1 = 1.0 ve x2=0.5’dir;
- O1 = [1.05 0.6]
Ağırlık toplama sonucu sigmoid aktivasyon fonksiyonuna verilir.
- y = [sigmoid(1.05) sigmoid(0.6)]
- y = [0.7408 0.6457]
Geri Beslemeli Ağlarda 1 Adım ilerlemek (3 katmanlı nöral için);
- Matrisel gösterimi:
- e1=1.5, e2=0.5, w11=2.0, w12=1.0, w21=3.0 ve w22=4.0;
- error_hidden =[(e1*(w11/(w11+w21)) + e2*(w12/(w12+w22))) (e1*(w21/(w11+w21)) + e2*(w22/(w12+w22)))]
- error_hidden =[(1.5*(2.0/(2.0+3.0)) + 0.5*(1.0/(1.0+4.0))) (1.5*(3.0/(2.0+3.0)) + 0.5*(4.0/(1.0+4.0)))]
- error_hidden =[(0.6 +0.1) (0.9 + 0.4)] = [0.7 1.3]
Tüm bu işlemlerin için python ile örnek bir uygulamasını yapalım
1. Giriş katmanında yer alan parametre ve değerleri:
x1 | 0.9 |
x2 | 0.1 |
x3 | 0.8 |
2. Hidden (Gizli) Katman ağırlık değerleri;
w_input-hidden | ||
0.9 | 0.3 | 0.4 |
0.2 | 0.8 | 0.2 |
0.1 | 0.5 | 0.6 |
w_hidden-output | ||
0.3 | 0.7 | 0.5 |
0.6 | 0.5 | 0.2 |
0.8 | 0.1 | 0.9 |
Bu verileri kullanarak python programlama dilinde ileri beslemeli tek iterasyonluk küçük bir program örneği aşağıda verilmiştir.
# -*- coding: utf-8 -*- import numpy as np sigmoid = lambda Z: (1/(1+np.power(np.e, -1*Z))) input_x_2=np.array([[0.9], [0.1], [0.8]]) w_input_hidden=np.array([[0.9, 0.3, 0.4],[0.2, 0.8, 0.2], [0.1, 0.5, 0.6]]) w_hidden_output=np.array([[0.3, 0.7, 0.5], [0.6, 0.5, 0.2], [0.8, 0.1, 0.9]]) x1=w_input_hidden.dot(input_x_2) A1=sigmoid(x1) x2=w_hidden_output.dot(A1) A2=sigmoid(x2)</span>
A1 Çıktı Değeri:
A1_1 | 0.761333 |
A1_2 | 0.603483 |
A1_3 | 0.650219 |
A2 Çıktı Değeri:
A2_1 | 0.726303 |
A2_2 | 0.708598 |
A2_3 | 0.778097 |
Tüm bu işlemler tüm hidden katmana uygulanır.
Bir sonraki derste ağırlık değerlerini (w) nasıl güncellendiği anlatılacaktır.
Not: Yazıdaki YSA ile ilgili tüm resim, tablo ve denklemler [3] kaynağından alınmıştır.
KAYNAKLAR:
[1] https://medium.com/the-theory-of-everything/understanding-activation-functions-in-neural-networks-9491262884e0
[2] http://www.derinogrenme.com/2017/03/04/yapay-sinir-aglari/
[3] A Gentle Introduction to Neural Networks with Python
Derin Öğrenme (Yapay Sinir Ağları-2)