Python ile Makine Öğrenmesi 3: “hiperuzayda dağlara tırmanmak”

Ya hep ya hiçti, ya doğru ya yanlıştı hata sinyali; tek katmanlı perceptron algoritmasında…

Nöronların çıktısı ikili değilde süreklilik arz ediyorsa işler değişir. Tek bir nöron yalnızca doğrusal çizgileri öğrenebilir, yeterince nöron mevcutsa çok katmanlı algılayıcılar, çılgın kıvrık sınırları çizebilirler.

Öğrenicinin “retinası” yeni bir görüntü gördüğünde, bu sinyal bir çıktı üretilinceye dek ağda ileri doğru yayılır. Bu çıktıyı istenen çıktıyla karşılaştırmak bir hata sinyaline yol açar. Bu da retinaya geri ulaşana dek katmanlara geriye doğru yayılır. Her nöron bu dönen sinyale ve ileri doğru aktarım sırasında kendi aldığı girdilere göre ağırlığını ayarlar. Daha fazla görüntü gördükçe, ağırlıklar bu görüntülerin ayırt edilmesine imkan tanıyan değerlere yaklaşırlar. Geri yayılım adıyla bilinen bu olay, tek katmanlı algılayıcılardan çok daha güçlüdür.

Geri yayılım, hem doğada hem teknolojide önemli bir yer tutar. Dağın zirvesine çıkmak için aceleniz varsa bulabileceğiniz en dik yamacı tırmanın! Bunun teknik karşılığı gradyan çıkış ve gradyan iniştir. Peki nedir gradyan iniş? Geri yayılımla ne ilgisi var? Şimdi bu okuduğum bir kitaptan aklımda kalan örnekle birlikte hayal edelim;

Kaçırıldığınızı ve gözleriniz bağlı halde Himalayalar’da bir yere bırakıldığınızı düşünün. Hafızanız o kadar da iyi durumda değil. Bütün bildiğiniz Everest Dağı’na tırmanmak zorunda olduğunuz. Ne yaparsınız? İleri doğru bir adım atınca çukura yuvarlanmaktan son anda kurtuluyorsunuz. Ayağınızla etrafı yoklayarak, mümkün olabilecek en yüksek noktayı bulup dikkatlice o noktaya adım atıyorsunuz. Her seferinde aynı şeyi yaparak adım adım daha da yükseğe tırmanıyorsunuz. Bir süre sonra atabileceğiniz her adım aşağı doğru oluyor ve duruyorsunuz. İşte bu gradyan iniştir 🙂 Yani geri yayılım sayesinde hatalarımız azalana kadar ağırlıklar optimize olur.

Şimdi python‘da efsane veri bilimi kütüphanelerinden biri olan Mlxtend (machine learning extensionskütüphanesini kullanarak uygulama yapalım:

İlk olarak jupyter notebook‘ta aşağıdaki kodu yazarak kütüphanemizi indirelim.

!pip install mlxtend

Kütüphaneyi aktifleştirdikten sonra içindeki iris verisini çağıralım ve iris verisinin ilk dört değişkenini; taç yaprak(petal..)/çanak yaprak(sepal..) uzunlukları-genişlikleri standardise edelim:

from mlxtend.data import iris_data
X, y = iris_data()
X = X[:, [0, 3]]    

# değişkenleri standardise edelim
X_std = (X - X.mean(axis=0)) / X.std(axis=0)

Kütüphanenin içinden çok katmanlı perceptron fonksiyonunu çağıralım ve algoritma için detay özellikleri belirleyip; modeli çalıştıralım. Daha önce bahsedilmeyen paremetrelerin açıklamaları yanlarında verilmiştir.

from mlxtend.classifier import MultiLayerPerceptron as MLP

nn1 = MLP(hidden_layers=[50],      #gizli katman başına 50 gözlem
          l2=0.00,                 #elastic.NET regresyonu ile düzleştirme
          l1=0.0,                  #lasso regresyonu ile düzleştirme
          epochs=150,              
          eta=0.05, 
          momentum=0.1,            #Faktör öğrenme hızını arttırmak için önceki devirin t-1 gradyanıyla çarpılır
          decrease_const=0.0,      #her devirden sonraki öğrenme hızını(eta) azaltır; over fitting'i önlemek için
          minibatches=1, 
          random_seed=1,
          print_progress=3)

nn1 = nn1.fit(X_std, y)


Şimdi üç çiçek türünü ayırmak için algoritmanın çizdiği sınırlara bakalım:

from mlxtend.plotting import plot_decision_regions
import matplotlib.pyplot as plt

fig = plot_decision_regions(X=X_std, y=y, clf=nn1, legend=2)
plt.title('Çok Katmanlı Algılayıcı')
plt.show()

Bir sonraki epoch‘da hatalarımızın geri yayılım ile nasıl minimize olduğunu grafik üzerinde görelim.

import matplotlib.pyplot as plt
plt.plot(range(len(nn1.cost_)), nn1.cost_)
plt.ylabel('Cost')
plt.xlabel('Epochs')
plt.show()

 

 

print('Accuracy: %.2f%%' % (100 * nn1.score(X_std, y)))

Peki geri yayılım yapay öğrenme problemlerini çözer mi? Çok sayıda nöronu bir araya getirip kendi harikasını yaratmasını bekleyebilir miyiz? Hiperuzay iki tarafı keskin bir kılıçtır. Bir yandan uzay ne kadar çok boyutluysa çok kıvrımlı yüzeyler ve optimum hata için o kadar geniş alana sahiptir. Öte yandan minimum hataya bağlı kalacağız ancak hiper uzayda dağ geçitleri vardır o sebeple geri yayılım optimum bir ağırlık kümesine ulaşabilir. Eee hiperuzayda milyarlarca dağ geçidi bulunuyorsa ve dolayısıyla milyonlarca vadisi varsa bundan neden şikayet edelim? 😀

 

 

KAYNAKÇA

http://rasbt.github.io/mlxtend/user_guide/classifier/MultiLayerPerceptron/

https://github.com/rasbt/mlxtend

https://devhunteryz.wordpress.com/2018/07/05/yapay-sinir-agi-egitimi-cok-katmanli-perceptronmulti-layer-perceptron/

https://sebastianraschka.com/pdf/software/mlxtend-latest.pdf

https://stackoverflow.com/questions/23294197/plotting-chart-with-epoch-time-x-axis-using-matplotlib

https://github.com/tomgoldstein/loss-landscape

https://www.analyticsvidhya.com/blog/2018/04/python-library-visualizes-artificial-neural-networks/

https://machinelearningmastery.com/visualize-deep-learning-neural-network-model-keras/

https://medium.com/@joaogabriellima/visualizing-the-architecture-of-your-own-model-of-artificial-neural-networks-7f0ea6b2a86d

https://towardsdatascience.com/multi-layer-neural-networks-with-sigmoid-function-deep-learning-for-rookies-2-bf464f09eb7f

http://rbellek.blogspot.com/2012/11/yapay-sinir-aglar-ileri-besleme-geri.html

 

 

 

Yazar Hakkında
Toplam 10 yazı
Tuğbanur GÜVELİ
Tuğbanur GÜVELİ
Yorumlar (Yorum yapılmamış)

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

×

Bir Şeyler Ara