Derin Öğrenme (Yapay Sinir Ağları-3)

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;

  1. Fonksiyonun lineer olmaması. (YSA’ların non-linear olması)
  2. 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    Ä°lgili resim

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.

Transfer function in neural network ile ilgili görsel sonucu

Ö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)