Derin Öğrenme için Yapay Sinir Ağları

Python ile yapay sinir ağları nasıl çalışır?

Tirendaz Akademi
10 min readFeb 21, 2023
Görsel: Freepik

Arkadaşlar doğa her zaman insanlar için ilham kaynağı olmuştur. Örneğin, kuşlardan esinlenerek uçaklar icat edilmiştir. Aynı şekilde beyindeki nöronlardan esinlenerek yapay sinir ağları geliştirilmiştir. Yapay sinir ağları, derin öğrenmenin çekirdeğidir. Size belki garip gelecek ama resim sınıflandırma, öneri sistemleri, dilden dile çeviri gibi kompleks makine öğrenmesi problemleri yapay sinir ağları ile çözülebilmiştir.

Bu derste derin öğrenmenin temeli olan yapay sinir ağları mimarisini ele alacağız. Hadi bu derste öğreneceğimiz konulara bakalım. Öncelikle yapay sinir ağları nedir öğreneceğiz. Daha sonra perceptron ve multilayer perceptron nedir bakacağız. Ve en son basit bir sinir ağı ile regresyon ve sınıflandırma problemleri nasıl çözülür inceleyeceğiz. Hadi yapay sinir ağları nedir ile başlayalım.

Yapay Sinir Ağları

Belki şaşıracaksınız ama yapay sinir ağlarının tarihi 1943 yıllarına dayanıyor. Hadi şimdi son yıllarda bu yaklaşımın neden popüler olduğuna bakalım. Bildiğiniz gibi internet ve sosyal medyanın gelişmesi ile üretilen veri miktarı arttı ve büyük veri ortaya çıktı. Bu büyük veri, yapay sinir ağlarının eğitimine olanak sağladı.

Bir Yapay Sinir Ağı

Klasik makine öğrenmesi algoritmaları büyük verileri analiz etmede zorluk çekerken, yapay sinir ağları büyük veriler üzerinde güzel performans gösterdi. Yapay sinir ağlarının popüler olmasının bir sebebi de makinelerin hesaplama gücünün artması. Oyun sektörünün gelişmesi ile GPU’su yüksek güçlü makineler geliştirildi. GPU’lar matematiksel hesaplamaları daha kolay yaptığı için yapay sinir ağları daha hızlı eğitilebildi. Yapay sinir ağlarının son yıllarda patlamasının bir sebebi de CNN, RNN, Transformers gibi harika mimarilerin geliştirilmesi. Ayrıca son zamanlarda geliştirilen TensorFlow ve PyTorch gibi kütüphaneler ile bu mimariler daha kolay eğitilebildi.

Yapay zekaya ilginiz varsa TensorFlow ve Keras ile derin öğrenme Udemy kursumuzu inceleyebilirsiniz.

Hadi şimdi yapay sinir ağlarını daha iyi anlamak için biyolojik bir sinir ağına bakalım.

Biyolojik Sinir Ağları

Aşağıda biyolojik bir sinir ağını görüyorsunuz.

Biyolojik Bir Sinir Ağı

Ben biyolog değilim ama hadi genel hatları ile bu nörona bakalım. Bu sinir ağı, Nucleus denen cell body, bir çok branşa ayrılmış dendrite’ler ve uzun bir axon’dan oluşuyor. Dikkat ederseniz axon’un uzunluğu cell body’den çok daha fazla. Axonlar, diğer nöronların dentrite’leri veya cell body’leri ile birleşen bir çok branşa ayrılıyor. Biyolojik nöronlar, axonlar boyunca hareket eden kısa elektriksel gerilimler üretir. Eğer bir nöron yeterli miktar uyarı alırsa, kendi elektriksel gerilimi ateşlenir. Genel olarak biyolojik nöronlar bu yolla çalışır.

Bir Sinir Ağındaki Nörondaki Çoklu Katmanlar

Bu çalışmayı basit gibi görebilirsiniz ama nöronların birbirleri ile bağlanması ile milyarlarca sinir ağı yönetilebilir. Tamam genel olarak biyolojik sinir ağlarının nasıl çalıştığına baktık. İşte bu biyolojik nöronlardan oluşan sinir ağları taklit edilerek yapay sinir ağları geliştirildi. Hadi şimdi yapay sinir ağlarının en temel birimi olan perceptron ’a bakalım.

Perceptron

Yapay sinir ağı mimarisini anlamak için öncelikle en basit yapay sinir ağı mimarisi olan perceptron ’u anlamamız gerekir. Bu mimari, 1957 yılında Frank Rosenblatt tarafından geliştirildi.

Perceptron Mimarisi

Yukarıda gördünüz gibi, bu mimaride, girdiler ve çıktı sayılardan oluşur ve her bir girdinin bir ağırlığı vardır. Örneğin x1'in ağırlığı w1, x2'nin ağırlığı w2 ve x3'ün ağırlığı w3. Bu ağırlıklanan girdiler öncelikle toplanır daha sonra bir bias eklenir. Bu toplam, bir step fonksiyonundan geçirilir. Bu fonksiyon, örneğin bir işaret fonksiyonu olabilir.

İşaret Fonksiyonu

İşaret fonksiyonu bildiğiniz gibi sıfırdan küçük değerleri -1'e, sıfır değerlerini sıfıra ve sıfırdan büyük değerleri 1'e götürür. Basit bir percetron ’u, lineer bir ikili sınıflandırma için kullanabilirsiniz. Örneğin önce girdilerin lineer bir fonksiyonu hesaplanır, ardından çıkan sonuç bir treshold yani bir eşik değerini geçerse, sonuç pozitif olur. Belirli bir tresholdu geçmezse sonuç negatif olur. Çok basit değil mi? Ama bu basit mantıkla ChatGPT gibi yapay zeka araçları geliştirildi.

Bu bahsettiğim örnek, threshold logic unit, kısaca TLU denen, tek bir lineer fonksiyondan oluşuyor. Bir perceptron, bir layerda yani katmanda, birden çok birbiri ile bağlantılı lineer fonksiyondan oluşabilir.

İki Girdili ve Üç Çıktılı Bir Perceptron

Yukarıdaki görselde iki tane girdi ve üç tane çıktı var. Girdilerin bulunduğu layer ’a input layer, çıktıları üreten TLU ’ların bulunduğu katmana output layer denir. Dikkat ederseniz girdilerin hepsi bütün nöronlarla bağlantılı. Bu şekildeki bir katmana tam bağlantılı layer ya da dense layer denir.

Bakın bu perceptron ’un üç farklı çıktısı var. Hatırlarsanız binary yani ikili sınıflandırma da etiket sayısı ikiydi. Burada üç çıktı olduğu için bu sınıflandırma multilabel denen çok etiketli sınıflandırmadır. Tabi bu mimariyi multiclass denen çok sınıflı sınıflandırma için de kullanabilirsiniz.

Peki bu noktada percetronlar nasıl eğitilir şeklinde bir soru aklınıza gelebilir. Hadi kısaca bu sorunun cevabına bakalım. Perceptronların eğitim mantığını anlarsanız yapay sinir ağlarının çalışma mantığını daha iyi anlarsanız.

Öncelikle her bir girdiye rasgele bir ağırlık verilerek girdilerin toplamı bulunur ve daha sonra bu toplama bir bias eklenir. Unutmayın, bir nöron diğer bir nöronu sık sık tetiklediğinde, aralarındaki bağlantı daha çok güçlenir. Nöronlardan geçen girdiler bir çıktı üretir. Bu çıktı bir tahmindir. Tahminin ne kadar hata yaptığına bakılır. Daha az hata ile tahmin yapmak için ağırlıklar güncellenir.

Tamam basitçe perceptron nedir gördük. Perceptron, XOR gibi bazı basit problemleri çözemedi.

XOR Problemi ve Çok Katmanlı Perceptron ile Çözümü

Perceptron ’un eksikliklerini ortadan kaldırmak için çok katmanlı multilayer perceptron geliştirildi. Hadi multilayer perceptronlara yakından bakalım.

Çok Katmanlı Perceptron

Multilayer perceptronlar bir girdi katman, bir gizli katman ve birde çıktı katmanda oluşur. Bu basit bir çok katmanlı perceptrondur.

Çok Katmanlı Perceptron

Bu yapay sinir ağı mimarisinde, bir gizli katman var. Eğer birden fazla gizli katman olursa buna derin sinir ağı denir. İşte derin öğrenme bu mimariden geliyor.

Harika değil mi? Derin öğrenmenin temelini gördük. Derin öğrenme, modern yapay zeka mimarilerinin gelişmesi ile popüler oldu.

Tamam girdiler sinir ağlarından geçiyor ve bir tahmin yapılıyor. Fakat bu tahmin nasıl iyileştirilecek. İşte tam burada backpropagation tekniği ortaya çıktı. Bu teknik ile hata geriye doğru dağıtılarak ağırlıklar güncellenir Ve en iyi tahmin elde edilinceye kadar bu döngü devam ediyor.

Süper bir yaklaşım değil mi? Hadi backpropagation ile yapay sinir ağlarının nasıl çalıştığına bakalım. Önce batch denilen bir grup veri alınır. Bu batch sayısı örneğin 32 olabilir. Bu veriler eğitim esnasında bir çok kez bütün sinir ağdan geçer. Bu her bir geçişe epoch deniyor. Derin öğrenme derslerinde çok sık kullanacağımız epoch ve batch’in ne demek olduğunu öğrendik.

Bir batch veri, girdi katmanından sinir ağına girer. Bu girdi katmanından geçen veriler, gizli katmandan geçerken çıktı hesaplanır. Bu çıktılar diğer katmana iletilir. Bu şekilde girdiler bütün katmanlardan geçerek bir sonuç ortaya çıkar. Bu geçişe forward pass yani ileriye doğru geçiş denir. Sinir ağının çıktısı bir tahmindir. Unutmayın her bir katmanlardan geçen sonuçlar saklanır.

Peki hocam niye saklanıyor derseniz. Bunun sebebi tahmin hatasının geriye doğru dağıtılırken ağırlıkların güncellenmesi için.

Hocam hata nasıl ölçülüyor derseniz. Bunun için loss fonksiyonu kullanılır. Loss fonksiyonu, gerçek değer ile tahmin değerini karşılaştırır ve bir tahmin hatasını bulur. Her bir batch sinir ağından geçer ve bir tahmin hesaplanır. Ve bu tahminin hatası ölçülür. Bu hata geriye doğru girdi katmanına kadar dağıtılır ve ağırlıklar güncellenir. Güncellenen ağırlıklara göre diğer batch tahmin edilir ve yine tahmin hatası hesaplanır. Bu hataya göre ağırlıklar güncellenir. Bu şekilde bütün veriler sinir ağından geçer. Unutmayın başlangıçtaki ağırlıklar rasgele verilir. Diğer türlü yapay sinir ağının eğitimi başarısız olur.

Tamam böylece yapay sinir ağlarının nasıl çalıştığını gördük. Şu ana kadar yapay sinir ağlarının teoriğini anlattım. Biraz sonra multilayer perceptronlar ile ilgili uygulamalar yapacağız. Bu mimarinin yapısını anlarsanız daha iyi mimariler oluşturabilirsiniz. Fakat bu mimarideki aktivasyon fonksiyonu hakkında biraz daha konuşalım.

Hatırlayın perceptronlarda kullanılan aktivasyon, step fonksiyonuydu. Multilayer perceptronlarda kullanılan aktivasyon fonksiyonu ise sigmoid, hiperbolik tanjant ya da ReLU olabilir. En çok kullanılan fonksiyon ReLU’dur.

Aktivasyon Fonksiyonları

Niye aktivasyon fonksiyonu kullanıyoruz şeklinde bir soru aklınıza gelebilir. Aktivasyon fonksiyonunu kullanmamızın sebebi, mimarimize nonlineerlik kazandırmak istememizdir. Böylece mimarimiz daha esnek olur. Eğer aktivasyon fonksiyonu kullanmazsak kompleks problemleri çözemeyiz.

Tamam şimdiye kadar sinir ağlarının yapısını ve nasıl çalıştığını öğrendik. Ayrıca backpropagation algoritmasına baktık. Hadi şimdi bir uygulama ile ellerimizi kirletelim. Öncelikle regresyon problemini ele alalım.

Yapay Sinir Ağları ile Regresyon

Bildiğiniz gibi regresyon probleminde sayısal bir değer tahmin edilir. Dolayısıyla sinir ağımızın çıktısı bir nöron olmalıdır. Eğer çok değişkenli bir regresyon problemimiz olsaydı boyut sayısına göre nöron olurdu. Örneğin, bir resim içindeki bir nesnenin merkezini bulmak için iki boyutlu bir koordinat sistemi tahmin etmemiz gerekir. Dolayısıyla çıktı katmanında iki nöron olması gerekir.

Regresyon problemini çözmek için Scikit-Learn içindeki MLPRegressor sınıfını kullanabiliriz. Bu sınıfı kullanarak bir multilayer perceptron modeli kurabiliriz. Bunu göstermek için california housing veri setini kullanalım. Bu veri seti, ev fiyatlarını gösteriyor. Amacımız bir evin özelliklerine göre fiyatı tahmin edecek bir model kurmak.

Hadi bu veri setini yüklemek için Scikit-Learn içindeki fetch_california_housing fonksiyonunu çağıralım. Öncelikle bu fonksiyonu import edelim.

from sklearn.datasets import fetch_california_housing

Hadi bu veri setini bir değişkene atayalım. Bu makalede kullandığım notebook’a buradan ulaşabilirsiniz.

housing = fetch_california_housing()

Şimdi veri setini eğitim ve test şeklinde parçalayalım. Unutmayın, eğitim verisi ile model kurulur. Test verisi ile model değerlendirilir. Modeli parçalamak için train_test_split fonksiyonunu kullanalım. Öncelikle bu fonksiyonu import edelim.

from sklearn.model_selection import train_test_split

Şimdi bu fonksiyon ile veri setimizi parçalayalım.

X_train_full, X_test, y_train_full, y_test = train_test_split(
# girdi ve çıktı verilerimizi yazalım.
housing.data, housing.target,
# Rasgeleliği sabitlemek için random_state parametresini kullanalım.
random_state=42
# Sizde bu parametreye 42 yazarsanız benim elde ettiğim sonuçları bulursunuz.
)

Şimdi modelin parametrelerini ayarlamak için validasyon verisini oluşturalım. Bunun için yine train_test_split fonksiyonunu kullanalım.

X_train, X_valid, y_train, y_valid = train_test_split(
#eğitim verisini parçalamak için eğitim girdi ve çıktı değişkenlerini yazalım.
X_train_full, y_train_full,
#Yine rasgeleliği sabitlemek için random_state parametresini kullanalım.
random_state=42)

Tamam veri setlerimizi oluşturduk. Şimdi modelimizi kuralım. Bunun için MLPRegressor sınıfını import edelim.

from sklearn.neural_network import MLPRegressor

Bu sınıftan bir örnek alalım.

mlp_reg = MLPRegressor(
# gizli katman sayısını ve her katmandaki nöron sayısını belirleyelim.
# 3 katman ve her katman da 50 nöron olsun.
hidden_layer_sizes=[50, 50, 50],
random_state=42)

Harika, modelimiz için bir örnek oluşturduk. Veri seti sayısal değerlerden oluşuyor. Bu sayısal değerleri standartlaştıralım. Böylece modelimizi daha doğru ve daha hızlı kurarız. Bunun için StandardScaler sınıfını import edelim. Ölçekleme ve model kurma işlemlerini daha kolay yapmak için pipeline kullanalım.

from sklearn.preprocessing import StandardScaler

Öncelikle make_pipeline fonksiyonunu import edelim.

from sklearn.pipeline import make_pipeline

Bu fonksiyon ile bir pipeline inşa edelim.

pipeline = make_pipeline(
#Önce ölçekleme fonksiyonunu yazalım.
StandardScaler(),
# Sonra modelimizi yazalım.
mlp_reg)

Bu pipeline ile önce veri ölçeklenecek sonra model kurulacak.

Harika pipeline’ımızı oluşturduk.

Şimdi fit metodunu çağıralım ve modelimizi eğitelim.

pipeline.fit(
# Model eğitimi için eğitim verilerini kullanalım.
X_train, y_train)

Tamam modelimizi eğittik. Şimdi bu modelli kullanarak validasyon verilerini tahmin edelim.

y_pred = pipeline.predict(
# Validasyon veri setini yazalım.
X_valid)`

Tamam validasyon verisini tahmin ettik. Şimdi mean_squared_error fonksiyonu ile bu modelin tahmin hatasını bulalım. Öncelikle bu fonksiyonu import edelim.

from sklearn.metrics import mean_squared_error

Şimdi bu fonksiyonu kullanarak tahmin hatasını bulalım.

rmse = mean_squared_error(
#önce gerçek değerleri yazalım
y_valid,
# şimdi tahmin değerlerini yazalım.
y_pred, squared=False)

Modelin hata kareler hatası 0.5 civarı çıktı. Bu değer kötü bir değer değil. Uutmayın veri setinizde aykırı değer çoksa hata metriği olarak ortalama mutlak hata metriğini de kullanabilirsiniz. Biz bu modeli kurarken çıktı katmanında bir aktivasyon fonksiyonu kullanmadık. İsterseniz aktivasyon fonksiyonu olarak ReLU kullanabilirsiniz. Bu problem basit olduğu için sinir ağını oluşturmak için Scikit-Learn kütüphanesini kullandım.

Gelecek yazımda daha kompleks mimariler için Keras anlatmayı planlıyorum. Hocam burada bir çok hiperparametre var. Bunları nasıl seçeceğiz diyebilirsiniz. Hadi şimdi regresyon için optimum model kurmak için en uygun olabilecek hiperparametrelere bakalım.

Gizli katman için tabi probleminize bağlı olarak 1'den 5'e kadar katman kullanabilirsiniz. Gizli katman başına nöron sayısı olarak 10'dan 100'e kadar değer yazabilirsiniz. Çıktı katmanındaki nöron sayısını boyut sayısına göre belirleyebilirsiniz. Gizli katmanlarda aktivasyon fonksiyonu olarak, ReLU kullanabilirsiniz. Çıktı katmandaki aktivasyon fonksiyonu olarak ya kullanmazsınız ya da ReLU, sigmoid veya tanh kullanabilirsiniz. Loss fonksiyonu olarak bizim yaptığımız gibi hata kareler ortalaması metriğini kullanabilirsiniz.

Tamam regresyon için basit bir yapay sinir ağının nasıl kurulacağını gördük.

Yapay Sinir Ağları ile Sınıflandırma

Multilayer perceptronu sınıflandırma görevleri içinde kullanabilirsiniz. Örneğin, ikili sınıflandırma problemi için, son katmana sigmoid aktivasyon fonksiyonu yazarak, tek bir çıktı için bir nöron ekleyebilirsiniz. Son katmanda sigmoid fonksiyonu kullandığımız için çıktı 0 ile 1 arasında olacak. Belli bir threshold değerinden büyükse pozitif küçükse negatif sınıfı tahmin edecek.

Multilayer perceptron mimarisini çok kategorili problemler içinde kullanabilirsiniz. Bunun için son katmana sınıf sayısı kadar nöron eklersiniz. Örneğin rakam sınıflandırması için son katmana 10 nöron yerleştirirsiniz. Bakın bu problemde çok etiketli sınıflandırmadan farklı olarak sadece bir sınıf tahmin edilir. Dolayısıyla sınıf başına bir nöron yerleştirildiğinden, aktivasyon fonksiyonu olarak son katmanda softmax kullanılır. Bu fonksiyonun bütün tahminleri 0 ile 1 arasındadır ve bu tahminlerin toplamı birdir.

Sınıflandırma probleminde multilayer perceptronu kullanmak için MLPClassifier sınıfını kullanabilirsiniz. Bu sınıfı biraz önce gösterdiğim regresyon gibi kullanabilirsiniz.

Çok kategorili sınıflandırma problemi için model kurarken hadi kullanabileceğiniz hiperparametrelere bakalım. Gizli katman sayısı probleminize göre 1'den 5'e kadar olabilir. Çıktı nöron sayısı için kategori başına bir nöron yazabilirsiniz. Çok etiketli iki sınıflandırma için etiket başına bir ve aktivasyon fonksiyonu olarak sigmoid kullanabilirsiniz. Evet arkadaşlar optimum olabilecek hiperparametreleri de gördük.

Sonuç

Bu makalede yapay sinir ağlarına giriş yaptık ve bu ağların en basiti olan perceptron ve çok katmanlı perceptron mimarini inceledik. Yapay sinir ağlarının çalışma prensibini gördük. En son bir uygulama yaptık ve regresyon ve sınıflandırma için çok katmanlı perceptronların nasıl kullanılacağına baktık.

Hadi bağlanalım YouTube | Medium | Twitter | Instagram | TikTok

Gelecek yazılarda görüşmek üzere. Hoşça kalın.

--

--