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 extensions) kü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://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/
http://rbellek.blogspot.com/2012/11/yapay-sinir-aglar-ileri-besleme-geri.html