Merhaba arkadaşlar, bu yazımda öncelikle sizlerle bir yapay sinir ağı nedir ve sıfırdan bir yapay sinir ağı nasıl oluşturulur konularını ele alacağız.
1. Yapay Sinir Ağı Nedir?
Sinir ağı, insan beyninin çalışma şeklini taklit eden bir süreç aracılığıyla bir veri kümesindeki temel ilişkileri tanımaya çalışan bir dizi algoritmadır.
Bu anlamda sinir ağları, doğası gereği organik veya yapay olan nöron sistemlerini ifade eder. Sinir ağları değişen girdilere uyum sağlayabilir; böylece ağ, çıktı kriterlerini yeniden tasarlamaya gerek kalmadan mümkün olan en iyi sonucu üretir.
Şekil.1
Yapay sinir ağları temel olarak 3 katmandan oluşur. Input, Hidden ve Output olarak adlandırılan bu katmanlı yapı şekil.1 deki gibi görselleştirilebilir. Input ve Output katmanları sayısı sadece bir tane olabilirken, Hidden katman sayısı değişiklik gösterebilir. Ancak bir yapay sinir ağını ifade ederken Input katmanı sayılmaz ve Output katmanı sayısıyla, toplam Hidden katman sayısının toplamı olan sayı ile ifade edilir. Örneğin şekil.1 deki yapay sinir ağı 1 adet Hidden ve 1 adet Output katmanına sahip olduğundan 2 katmanlı bir yapay sinir ağı olarak ifade edilir.
Yapay sinir ağlarında her nöron arasındaki bağlantılara weight(ağırlık) denir. Başlangıçta weight’lere 0 ve 1 arasından rastgele bir değer atanır. Weight’ler input değerlerinin önemini belirler. Mesela bir fatura tutarı tahmini yapılırken o faturaya ait kullanım miktarı çok önemlidir. Bu nedenle kullanım miktarı girdisinin weight değerleri çok daha büyük bir değere sahip olacaktır.
Yapay sinir ağı mimarisinde bir de çıktı aktivasyonlarını sağ ya da sola ötelemekte kullanılan şekil.1 de b1 ve b2 olarak belirtilen bias adlı değerler de vardır. Bu değerler de genelde weight’ler gibi çok küçük bir değer alır. Çoğu yapay sinir ağında öntanımlı olarak 0 ya da 1 olarak tanımlanır ve model eğitildikçe ağırlıkların değişimine bağlı olarak bias değerleri de güncellenir.
Yapay sinir ağlarında kullanılan learning rate, epoch gibi terimler de mevcuttur. Learning rate genellikle 0.01 gibi çok küçük bir değer olarak tanımlanır. Epoch ise öğrenme işleminin kaç kez tekrarlanacağını belirten ifadedir. Modelin ürettiği çıktıya göre doğruluk oranını artırmak için learning rate ve epoch değerleri değiştirilir.
Son olarak da loss kavramından söz edecek olursak, yapay sinir ağı tarafından tahmin edilen değerin, gerçek değerden ne kadar saptığını belirten değerdir. Öğrenme işlemi sırasında loss değerinin mümkün olduğunca sıfıra yaklaştırmak amaçlanır. Genellikle iki tip loss fonksiyonu kullanılır. Bu fonksiyonlar L2 Loss fonksiyonu ve Cross Entropy Loss fonksiyonlarıdır.
L2 Loss fonksiyonunda, tahmin edilen değer gerçek değerden çıkartılıp aradaki farkın karesini alınarak hesaplanır.
Cross Entropy Loss fonksiyonu da logaritmik loss olarak da nitelendirilir. n ifadesi eğitim verisi sayısını, a ifadesi ise çıktı değerinin, sigmoid aktivasyon fonksiyonu sonucunu ifade eder.
Yapay Sinir Ağlarında Kullanılan Aktivasyon Fonksiyonları
Aktivasyon fonksiyonları, bir sinir ağının çıktısını belirleyen matematiksel denklemlerdir. İşlev, ağdaki her bir nörona bağlanır ve her bir nöronun girişinin modelin öngörüsüyle alakalı olup olmadığına bağlı olarak etkinleştirilip etkinleştirilmeyeceğini belirler. Aktivasyon fonksiyonları ayrıca her bir nöronun çıktısını 1 ile 0 veya -1 ile 1 arasında normalleştirmeye yardımcı olur.
Aktivasyon işlevlerinin ek bir yönü, her veri örneği için binlerce hatta milyonlarca nöron arasında hesaplandığı için hesaplama açısından verimli olmaları gerektiğidir.
1 – Sigmoid Fonksiyonu:
Sigmoid işlevini kullanmamızın ana nedeni, (0 ile 1) arasında var olmasıdır. Bu nedenle, özellikle olasılığı bir çıktı olarak tahmin etmemiz gereken modeller için kullanılır. Herhangi bir şeyin olasılığı yalnızca 0 ile 1 aralığı arasında olduğundan, sigmoid doğru seçimdir.
Sigmoid fonksiyonu, eğitim sırasında bir sinir ağının takılıp kalmasına neden olabilir. Bu sebeple bu gibi bir durum oluştuğunda, Softmax fonksiyonu kullanılır, Softmax fonksiyonu çok sınıflı sınıflandırma için kullanılan daha genelleştirilmiş bir lojistik aktivasyon fonksiyonudur.
2- Tanh(Hiperbolik Tanjant) Fonksiyonu:
Tanh fonksiyonu, sigmoid fonksiyonunun daha iyi bir versiyonu gibidir. (-1,1) aralığında değerler üretir.
Avantajı, negatif girişlerin güçlü bir şekilde negatif olarak eşleştirilmesi ve sıfır girişlerinin tanh grafiğinde sıfıra yakın bir şekilde eşlenmesidir.
Tanh fonksiyonu esas olarak iki sınıf arasında sınıflandırmada kullanılır.
3- ReLU Fonksiyonu:
ReLU şu anda dünyada en çok kullanılan aktivasyon fonksiyonudur ve kullanılmaya başlandığından beri neredeyse tüm evrişimli sinir ağlarında veya derin öğrenmede kullanılmaktadır. ReLU fonksiyonu (0,1) aralığında sonuç üretir ve bu sebeple en büyük sorunı, tüm negatif değerlerin anında sıfırlanmasıdır ve bu da modelin verilere uygun şekilde uydurma veya eğitme yeteneğini azaltır. Bu, ReLU aktivasyon fonksiyonuna verilen herhangi bir negatif girdinin, değeri grafikte hemen sıfıra çevirdiği anlamına gelir, bu da negatif değerleri uygun şekilde eşlemeyerek sonuç grafiğini etkiler.
Yapay sinir ağlarında en çok kullanılan aktivasyon fonksiyonlarından da bahsettiğimize göre artık Python dili ve Numpy kütüphanesini kullanarak sıfırdan kendi yapay sinir ağımızı oluşturmaya başlayabiliriz.
Birlikte oluşturacağımız bu yapay sinir ağını kullanarak XOR mantık kapısına girdi olarak verilen değerlerin ne çıktı ürettiğini tahminlemeye çalışacağız. Bu işlemleri sırasıyla adım adım olarak ele alalım.
Yapay Sinir Ağı Sınıfının Oluşturulması
Projemizi oluşturduktan sonra yeni bir python dosyası açıp ilk olarak Numpy kütüphanesini import ederek kodumuzu yazmaya başlıyoruz. Daha sonra NeuralNetwork adında bir sınıf oluşturup, bu sınıftan bir nesne oluşturduğumuzda nesnelerin alacağı parametreleri verdiğimiz, “__init__” tanımlayıcı metodu ile sınıfımıza ait nesne değişkenlerini tanımlıyoruz.
Sınıfımızı ve nesne değişkenlerini tanımladıktan sonraki aşama olan Weight ve Bias değerlerinin tanımlanmasına geçiyoruz.
Weight ve Bias’ların Tanımlanması
Bir yapay sinir ağında weight ve bias değerleri genellikle (0,1) aralığında seçilir.
Bu sebeple biz de weight ve bias ları tanımlarken Numpy kütüphanesinden random modülüne ait rand metodunu kullanacağız. Random modülü kullandığımız için kodumuzu her çalıştırdığımızda farklı rastgele değerleri seçmesin diye random.seed ile modülün ürettiği rastgele değerleri sabitleyeceğiz, rand metoduna parametre olarak da weight bağlantılarının başlangıç ve hedef node’larının boyutlarını giriyoruz.
Forward Propagation ( İleri Yayılım)
Forward propagation aşamasında, girdi değerleri belirlenen weight ve bias değerlerini kullanarak, çıktı değeri ile kıyaslamak üzere bir tahmin değeri hesaplanır. Elde edilen tahmin değeri, mevcut çıktı değeri ile loss fonksiyonunda kıyaslanıp bir loss değeri elde edilir.
Back Propagation ( Geri Yayılım)
Back propagation aşamasında, bir önceki aşamada elde edilen loss değerine göre türevleri alınarak weight ve bias değerlerinin güncellenmesi işlemi yapılır ve bu işlem yapay sinir ağını oluştururken verilen epoch sayısı kadar tekrarlanır. Türev alma işlemi için Chain Rule (Zincir Kuralı) olarak bilinen yöntem kullanılır.
Back propagation işlemi sonlandığında weight ve bias değerleri elde edilen gradyanlar ile güncellenir ve bir sonraki epoch’a geçilir.
Modelin Eğitilmesi
Modelimizin eğitilmesi için ilk olarak weight ve bias parametreleri tanımlanır, sonrasında girdi değerlerimiz epoch sayısı kadar sırası ile forward ve back propagation aşamalarından geçer, gradyanlar güncellenir.
Artık test verilerimizi kullanarak modelimizin üreteceği tahmin sonuçlarını elde etme ve modelimizin isabetlilik oranını öğrenme aşamalarına geçebiliriz.
Modelin Test Edilmesi ve Test Skoru
Modelimizi, XOR mantık kapısının aldığı girdi değerlerini kullanarak eğittik şimdi de rastgele bir girdi ile modelimizi test ederek sonucu inceleyelim ve sonrasında modelimiz doğru sonuç üretiyor mu anlamak için test skorunu görelim.
Kodumuzu çalıştırdığımızda çıktı aşağıdaki gibi olacaktır:
Sonuç çıktısında da görüldüğü üzere, modelimiz gayet güzel çalışıyor ve doğru sonuç üretiyor. Kaynak kodun tamamına erişmek için aşağıdaki linke tıklayabilirsiniz.