Logistic regression ikili sınıflandırma algoritmasıdır ve basit anlamda bir neural network’tür. Bu anlamda derin öğrenmenin temelini oluşturmaktadır diyebiliriz. Linear regression en iyi düz çizgiyi bulmayı amaçlarken, logistic regression en iyi S eğriyi oluştururak veri üzerinde sınıflandırma yapmayı amaçlar. Çıktı olarak bir olasılık tahmini yapar.
Aslında derin öğrenme yapısıyla logistic regression yapısının arasındaki fark kurulan yapının derin olmasında yatar. Derin kelimesi network’te ne kadar çok nöronun kullanılmasıyla alakalıdır. Bir yapay sinir ağının ne kadar derin olduğu göreceli bir kavramdır. Yapay sinir ağındaki hesaplamaları görsel olarak gösterebilmek için computation graph adı verilen diagramlar kullanılır.
Örneğin, aşağıdaki işlemi computation graph kullanarak göstermek istersek.
X ve Y input, daireler ise yapılan işlemleri göstermektedir. Yapılan işlemlerin computation graph olarak görülmesi işlem karmaşıklığını azaltmaktadır.
Matematiksel bir denklem olarak bir nöronu tanımlarsak. X input değerini, W weight, B biası ve Z ise çıktıyı belirtmek üzere Z = X*W+B.
Bir nöronu tanımlamak için kullandığımız Z = X*W+B denklemini kullanarak yukarıdaki şekilde 3 nöron 1 layer’dan oluşan bir neural network tanımlayabiliriz. Bu durumda neural network denklemimiz aşağıdaki şekilde matris çarpımına dönüşür.
Weight’leri bağlantıların önemini belirten değerler olarak düşünebiliriz. Örneğin x3 inputun ağırlığı daha yüksekse, çıktı x3 girişinden daha fazla etkilenmiş olacaktır. Logistic regression’a geri dönersek, yukardaki 1 katmandan oluşan neural network yapısına sigmoid eklediğimizde çıkışımız 0 ve 1 arasında istatiksel bir sonuç veren bir sisteme dönüşür.
Computation graph kullanarak şekildeki gibi bir logistic regression yapısı kurabiliriz. Logistic regression modelimiz weigth ve bias’leri öğrenmeye çalışmaktadır. Yukarıdaki örnekte gibi MNIST datasetinde resim şeklinde yer alan sayıların etiket değerlerini tahmin etmeye çalıştığımızı düşünelim. İnput olarak sisteme değerini bildiğimiz resme ait piksel değerlerini veriliyor. Buradaki amaç resmin ne olduğunu anlamaya çalışmaktır. Resme ait her bir pikseli kendisine ait weigth değerleriyle çarpıyoruz. Sonrasında weight ile çarpılan input değerleri toplanıyor ardından bias değeri ekleniyor. İşlem sonucu çıkan z değerini sigmoid fonksiyonuna veriliyor. Sigmoid fonksiyonu çıkan sonucu 0 ile 1 arasında bir sayıya eşitler. Sigmoid fonksiyonu grafiksel olarak aşağıdaki gibidir. Sigmoid kullanılmasının iki nedeninden birisi türevlenebilir olması diğeri ise olasılık sonucu üretebilmesidir.
Çıkan sonucu belirlediğimiz eşik değeriyle karşılaştırarak sonucu tahmin etmeye çalışıyoruz. Örneğin z sonucu olarak 4 değerini bulduğumuzu düşünelim. 4 değerinin karşılığı ise sigmoid fonksiyonunda 0.9 olduğunu varsayalım. Bu durumda sonucumuz %90 ihtimalle 4 tür diyebiliriz. Tahmin ettiğimiz değeri ise gerçek etiketle karşılaştırarak doğrulama yapmamız gerekir.
Forward Propagation
Logistic regression çalışma adımlarını özetlersek, input olarak bir resme ait piksel değerlerini input olarak alıyoruz,
işlemini her bir piksel input’u için uyguluyoruz. İşlem sonucunu olasılıksal bir sonuç döndüren sigmoid fonksiyonuna parametre olarak veriyoruz. Elde ettiğimiz sonuçla gerçek değerimizi karşılaştırıyoruz. Eğer doğru tahmin ettiysek Loss değerimiz 0 olacaktır fakat yanlış tahmin ettiysek Loss değerimiz yüksek çıkacaktır. Başlangıçtan Loss fonksiyonuna olan işlemler bütününe ise forward propagation deniyor.
Loss Function
Loss fonksiyonunu ꓡ(ŷ, y) = – (ylog ŷ + (1 – y)log(1- ŷ)) şeklinde tanımlayabiliriz. Loss fonksiyonunun amacı tahmin edilen değerle gerçek değer arasındaki hatayı minimize etmektir. Örneğin, gerçek değerimizin ve tahmin edilen değerin 1 olduğunu varsayalım. Değerleri loss denkleminde yerine koyarsak, L(1,1) = -(1log1 + (1 – 1) log( 1 – 1)) = -(0 + 0.log(0)) = -( 0 + 0 ) = 0 değerini buluruz. Bu durumda loss değeri yoktur. Eğer yanlış bir tahminde bulunduğumuzu varsayarsak, L(0,1) = -(1log0 + (1 – 1) log(1 – 0)) = – (infinity + 0) = infinity sonuç infinity olarak çıkıyor. Bu durumda loss değerimizin oldukça yüksek olduğunu anlayabiliriz. Her bir input için oluşan loss değerlerini toplayarak bir cost değeri elde ediyoruz. Cost değerimize bakarak weight ve bias değerlerimizi güncellememiz gerektiğini anlıyoruz. Weight ve bias değerini güncelleyerek cost değerini düşürmeyi amaçlıyoruz. Forward propagation akışını özetlersek.
Backward Propagation
Cost fonksiyonunda elde edilen cost değerini düşürebilmek için weight ve bias değerlerini güncellememiz gerekir. J(w,b) cost fonksiyonunu aşağıda ki şekilde tanımlayabiliriz. Cost u minimize edecek şekilde w ve b değerlerini bulmamız gerekiyor.
Bu sürece backward propagation deniyor. Backward propagation işleminde kullanacağımız metod ise Gradient Descent. Gradient Descent bir optimizasyon algoritmasıdır. Cost değerini en düşük değere çekebilmemiz için parametrelere en optimum değerleri verebilmemiz gerekiyor. Bu işlemi optimizasyon algoritmalarıyla yapabiliyoruz. Adam ve RMSprop bu algoritmalardan birkaç tanesidir.
Yukarıdaki şekilde J(w) cost değerlerine karşılık gelen w değerlerini görüyoruz. Eğri üzerinde başlangıç weight değeri global cost minimum değerinden oldukça uzak görünüyor. W ve b değerlerinde optimizasyon yaparak minimum cost noktasına ulaşmayı hedefliyoruz. Gradient cost değerini dik olarak kesen eğime denir. Eğim sıfır veya sıfıra yakın olduğunda minimum noktaya ulaştığımızı anlayabiliriz. Backward ve forward propagation süreci her tekrarlandığında eğim biraz daha minimum noktaya yaklaşmış olacaktır. Back propogation loss fonksiyonu sonucu elde edilen değerden input’lara kadar kısmi türev alma işlemi alma sürecine deniyor. Bir fonksiyonun bir noktaya göre türevi, fonksiyonun eğimini verir. Bu şekilde w ve b değerlerini güncelleyerek cost fonksiyonun minimum değerini bulmuş oluyoruz. Bu sayede modelimizi eğiterek düzgün tahminlerde bulunabilmesini sağlamış oluyoruz. Öğrenme işlemi bu şekilde sağlanmış oluyor.
denklemi bize cost fonksiyonunun w değerine göre türevini aldığımızı söylüyor. Denklemde w weight değeri, b ise bias değerini temsil ediyor. α learning rate değeri başka bir deyişle her iterasyonda ne kadar büyüklükte bir adım atacağımızın ölçüsü. Learning rate parametresi bizim belirlememiz gereken bir parametredir. Aldığımız sonuçlara göre learning rate değerini değiştirmeliyiz.
Benzer hesaplamayı b (bias) değeri içinde yapıyoruz. Bu durumda cost fonksiyonun b ye göre türevini almamız gerekiyor.
Bu makalemde Logistic Regression konusundan bahsettim. Aslında bu sayede derin öğrenme konusunada giriş yapmışta sayılırız. Çünkü Logistic Regression derin öğrenmenin temelini oluşturuyor diyebilirim. Sonraki yazılarımda görüşmek üzere. 🙂