YAPAY SİNİR AĞLARI (NEURAL NETWORKS) 2. BÖLÜM

MİMARİLER VE "BACK PROPAGATION"

"Fight Club" ile başladık onunla devam etsin madem diye başlığa filmden bir kare daha ekliyorum :)

Bir önceki yazımızda tek bir nöron ve bunu sonundaki aktivasyon fonksiyonlarını görmüştük. Şimdi bu tek nöronu nasıl bir mimari içinde kullanacağımıza ve kurduğumuz mimariyi "backpropagation" kullanarak nasıl eğiteceğimize bakacağız.
Soru : Tek bir nöron kullanmak pek bir işe yaramıyor galiba. Bunları birlikte kullanmanın yolu nedir?
Cevap : Bir önceki yazımızda bahsettiğimiz nöron modeli aslında epey bir eskiye dayanıyor. 1943 yılında McCulloch and Pitts tarafından oluşturulan bu modelin orjinali aşağıdaki şekilde gösterilmekte, hem hatırlamış oluruz tekrardan bakalım.

image.png Ref: Machine Learning: An Algorithmic Perspective 2nd Edition

Gördüğümüz üzere girdiler ağırlıklarla çarpılıyor, bunların hepsi toplanıyor ve elde edilen sayı "step" fonksiyonuna tabi tutuluyor. Bunun sonucunda 0 veya 1 elde ediyoruz. Tabi bu en sondaki fonksiyon oldukça önemli, genellikle "step" fonksiyonu çok tercih edilmiyor.

Bu tek nörona çoğu yerde "perceptron" da denilmektedir.

ÇOK KATMANLI "PERCEPTRON" (MULTILAYER PERCEPTRON)

Yukarıda bahsettiğimiz yapınının birden fazla bağlantılı ve ara katmanlara ship olduğu bir mimari düşünün:

image2.png Ref: Pattern Recognition, Duda & Hart

Yukarıdaki şekilde 3 katmanlı bir mimari görüyoruz. Biraz terminoloji verelim şimdi:

  • Girdi Katmanı (Input Layer): Girdilerin alındığı katman
  • Gizli Katman (Hidden Layer): Girdi ve Çıktı katmanlarının aralarında kalan diÄŸer katmanlar. Birden fazla olabilir
  • Çıktı Katmanı (Output Layer): Çıktıların verildiÄŸi katman
Soru : Peki kurduk diyelim, bu mimari ne işimize yarıyor?
Cevap : Mimariyi oluşturduktan sonra bunun parametrelerini ayarlamamız lazım. Yani mimarideki ağırlıkların belirlenmesi gerekiyor. Bunu elimizdeki eğitim setini kullanarak nasıl yapabiliriz?
Bu sorunun cevabını "backpropagation" diye vermek mümkün!
"Backpropagation" bir yapay sinir ağında katsayıları güncellemek için kullanılan bir metottur. İstenen çıktı ile ağın ürettiği çıktının arasındaki farkın -yani hatanın- kullanılarak ağırlıkların güncellenmesi temelinde çalışmaktadır.

"Backpropagation" image3.png Ref: DataCamp - Deep Learning Course

İşin matematiğine çok girmeden "backpropagation" ile ilgili bazı kilit noktaları listeleyelim

  • BaÅŸlangıçta ağırlıklar rastgele deÄŸerlere atanır
  • Ağırlıkların güncellenmesi için öğrenme hızı (learning rate) parametresi kullanılmaktadır.
  • EÄŸitim sırasında bir validasyon seti kullanılarak hatanın deÄŸiÅŸiminin incelenmesi ve "overfitting" probleminin önüne geçilmesi gerekmektedir.

"Scikit-Learn" kütüphanesini kullanarak bir örnek yapabiliriz.

In [1]:
# sklearn sınıflandırıcısı çağrılıyor
from sklearn.neural_network import MLPClassifier
# make moons veri seti bu işler için kullanılır genellikle
from sklearn.datasets import make_moons
# Eğitim ve test setini ayırmamız gerekirse
from sklearn.model_selection import train_test_split
C:\Users\Faust\.conda\envs\ax_dev\lib\site-packages\numpy\_distributor_init.py:32: UserWarning: loaded more than 1 DLL from .libs:
C:\Users\Faust\.conda\envs\ax_dev\lib\site-packages\numpy\.libs\libopenblas.PYQHXLVVQ7VESDPUVUADXEVJOBGHJPAY.gfortran-win_amd64.dll
C:\Users\Faust\.conda\envs\ax_dev\lib\site-packages\numpy\.libs\libopenblas.XWYDX2IKJW2NMTWSFYNGFUWKQU3LYTCZ.gfortran-win_amd64.dll
  stacklevel=1)
In [2]:
# Seaborn dark theme tercihimizdir :)
import seaborn as sns
sns.set_style("darkgrid")
import matplotlib.pyplot as plt
# colormap kullanmak için
from matplotlib.colors import ListedColormap
In [3]:
%matplotlib notebook
In [4]:
# veri sınırlarını çizdirmek için kütüphanemizden ilgili 
import sys
sys.path.append("..")
from datafloyd.plot import plot_decision_region
In [5]:
# Spiral bir veri seti oluÅŸturur
X, y = make_moons(n_samples=1000, noise=0.15, random_state=42)
In [6]:
plt.figure()
ax = plt.axes()
cm = plt.cm.RdBu
# mavi ve kırmızı bir colormap olsun
cm_bright = ListedColormap(['#FF0000', '#0000FF'])
# veri setini görelim
ax.scatter(X[:,0],X[:,1],c=y,cmap=cm_bright);

Eğitim ve test olacak şekilde setimizi ayıralım

In [7]:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.4,random_state=0)

tanh aktivasyon fonksiyonunu kullanarak eğitimi gerçekleştirelim ve sadece 3'lük bir gizli katmanımız olsun.

In [8]:
NN = MLPClassifier(hidden_layer_sizes=[3],activation="tanh",solver="lbfgs",random_state=0)
NN.fit(X_train,y_train);
C:\Users\Faust\.conda\envs\ax_dev\lib\site-packages\sklearn\neural_network\_multilayer_perceptron.py:470: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.

Increase the number of iterations (max_iter) or scale the data as shown in:
    https://scikit-learn.org/stable/modules/preprocessing.html
  self.n_iter_ = _check_optimize_result("lbfgs", opt_res, self.max_iter)
In [9]:
plt.figure()
plot_decision_region(X_test,y_test,NN)
plt.title("[3] gizli katman");

Gizli katman ile biraz oynayalım. Bunu 2 adet 10'luk katman haline getirelim.

In [10]:
NN = MLPClassifier(hidden_layer_sizes=[10,10],activation="tanh",solver="lbfgs",random_state=0)
NN.fit(X_train,y_train);
In [11]:
plt.figure()
plot_decision_region(X_test,y_test,NN)
plt.title("[10,10] gizli katman");