Önceki yazımızda çok katmanlı yapay sinir ağlarına bir giriş yapmıştık. O yazıda sürekli(continous) perceptron olarak da bilinen delta algoritmasından bahsettik. Çok katmanlı ağların ikinci yazısı olan bu kısımda ağırlık güncellemelerinin kısmi türevler yardımıyla nasıl bulunacağından bahsedeceğiz.

Delta Algoritmasında Güncel Ağırlıkların Bulunması

Çok katmanlı ağlar için genelleştirmeden önce tek bir sürekli nöronda ağırlıkların nasıl güncellendiğine bakalım.

Tek Nöronlu Ağda Ağırlık Değişimlerinin Hesaplanması

Nöronların giriş değerleri ile ağırlık değerlerininin çarpımlar toplamının bize net adı verilen değerini ürettiğini hatırlayın. Bu net değeri bir aktivasyon fonksiyonundan (biz sigmoid kullanacağız) geçirilerek nöron çıkışı elde edilmektedir.

Sigmoid Fonksiyonu eşitliği şöyledir:

f(net) = 1 / (1 + e^{-net})

Sigmoid işlemi sonucu bizim nöron çıkış değerimizdir. Tek bir nörondan bahsettiğimiz için nöronun çıkış değeri aynı zamanda ağın çıkış değeri (oi) olur. (Burada oi, i. giriş örüntüsü için elde edilen çıkışı gösterir.)

İleri beslemeyi yaparak ağ çıkışını bulduk ve artık hatayı (E) hesaplayabiliriz. Delta öğrenme yönteminde hata hesabı şöyledir:

E = 1/2(d_i – o_i)^2

Buradan sonra gradyan inişe geçiyoruz. Çünkü hatayı ağırlıklara yaymamız gerekli. Bu nedenle hata gradyanını hesaplarız.

Öncelikle çıkış katmanı nöronun çıkışının (oi) matematiksel ifadesini hatırlayalım.

o_i = f( \mathbf{w^t_i x})

Ağrılığa (wi) göre hatanın (E) türevini alıyoruz:

\nabla E = -(d_i-o_i)f'( \mathbf{w^t_i x}) \mathbf{x}

Hatayı azaltmak için gradyana ters yönde ilerlemek gerekir. Bu yüzden ağırlık değişim değeri aşağıdaki gibi olacaktır. Eşitlikte “c” sabit bir değerdir.

\Delta \mathbf w_i =-c \nabla E

Dolayısıyla ağırlık güncellemesini şöyle yaparız :

\Delta \mathbf w_i = c(d_i-o_i)f'(net_i) \mathbf x

Her bir ağırlık değeri değişimi ise şöyle oluşturulur:

\Delta w_{ij} = c(d_i-o_i)f'(net_i) x_j

Sıra geldi f'(net) değerini oluşturmaya. İlk olarak türev (1) ve sigmoid (2) eşitliklerini hatırlayalım.

Buna göre sigmoid fonksiyonunun türevi Eşitlik (3)’teki gibi olur. Eşitlik (3)’ü daha kullanışlı hale getirmek için Eşitlik (4)’teki gibi f(net) formülüne benzetebiliriz. Ayrıca o=f(net) olduğunu biliyoruz. O zaman türevi Eşitlik (5)’teki şekilde yazabiliriz.

Buna göre ağırlık değişim eşitliği aşağıdaki gibi olur.

\Delta \mathbf w_{i} = c(d_i-o_i)o_i(1-o_i) \mathbf x

Şimdi biraz daha ilerleyelim ve çok katmanlı ağlar için genelleştirelim.

Çok Katmanlı ve Çok Nöronlu Ağda Ağırlık Değişimlerinin Hesaplanması

Delta öğrenme algoritması için görüntüde çok katmanlı bir yapı görülüyor. Görüntüde sunulan değerlerin açıklamaları aşağıda verilmiştir.

  • z: giriş verileri
  • o: çıkış verileri
  • y: ilk katmann çıkışı, aynı zamanda ikinci katmanın girişi
  • v: ilk katman ağırlıkları (genel olarak çıkış katmanı harici tüm katmanlardaki ağırlıklar v ile ifade edilmiştir.)
  • w: çıkış katmanı ağırlıkları
  • I: toplam giriş verisi sayısı (i=1,2,…,I)
  • J: ilk katmandaki nöron sayısı (j=1,2,…,J)
  • K: çıkış katmanındaki nöron sayısı (k=1,2,…,K)

Not: Ağın sonunda çıkışların elde edildiği katmanlar çıkış katmanı olarak adlandırıldı. Diğer katmanlar gizli katman olarak isimlendirilmektedir. Genel yapı düşünldüğünde, ilk katman olarak belirttiğimiz katman da gizli katmanlardan biri olarak nitelendirilebilir.

Çıkış katmanında birden fazla nöron olabilir. Bu yüzden önce çıkış katmanı nöronları için ağırlık değişimlerini bulalım.

Çıkış katmanı nöronları için ağırlık değişimleri

Çıkış katman düğümlerinin nasıl hesaplandığını hatırlayalım:

Çıkış katmanındaki ağırlık değişimini bulmak için hatanın ağırlıklara göre türevini kullanırız.

Bu arada her bir çıkış nöronunun hata sinyalini delta olarak adlandırırız ve şöyle hesaplanır.

Şimdi ağırlık değişimine geri dönelim. Zincirin ilk parçasının delta ile aynı olduğuna dikkat ediniz.

İkinci kısım için de türev alırsak geriye yj değeri kalacaktır. (yj değerleri ilk katman için çıkış olsa da ikinci katman için giriş değerleridir.)

Net değerinin giriş ve ağırlıkların çarpımlar toplamı şeklinde elde edildiğini hatırlayın.

O zaman çıkış düğümleri için ağırlık değişimlerini şöyle gösterebiliriz.

Şimdi gizli katmana geçebiliriz.

Gizli katman nöronları için ağırlık değişimleri

Bu kez gizli katman ağırlıklarının gradyanını hesaplamamız gerekiyor. Ters yönde ilerlemek için negatifini alırız. Benzer şekilde zincir kuralı uygulayarak ağırlık değişimlerini elde ederiz.

Şimdi zincir kuralından yararlanarak delta değerini açalım.

Ağ hatası formülünü kullanarak zincirin ilk kısmını tanımlayalım.

Zincirin ikinci kısmını inceleyelim. Burada y bir düğüm çıkışıdır ve bu yüzden f(net) değerine eşit olacaktır. Bu yüzden türevi de aşağıdaki gibi olacaktır.

Bir sonraki adıma geçmeden önce delta değerini hatırlayalım.

Burada da zincir yöntemini kullanarak çıkış nöronlarına ait hata sinyali olan deltayı düzenli hale getirelim.

Artık çıkış katman hata sinyali tanımını kullanarak, gizli katman nöronlarının çıkış sinyallerini tanımlayabiliriz. Çıkış katmanı haricindeki diğer katmanların gizli katman olarak adlandırıldığını hatırlayın.

Buna göre ağırlık güncellemerini elde edebiliriz.

Son olarak vektör notasyonu ile düzenleyebiliriz.

Bu yazıda sürekli delta ağlarda ağırlıkların güncellenmesine değindik. Bu ağlarda algoritmanın nasıl ilerlediğine bakmak için “Çok Katmanlı Ağlar-3: Algoritma” adlı yazıya geçebilirsiniz.

Soru ve önerileriniz için yorum kısmından ulaşabilirsiniz. Ayrıca hatalı olduğunu düşündüğünüz bir nokta varsa iletmeniz çok faydalı olur.

KAYNAK

  1. Zurada, Jacek M. “Artificial Neural Systems.” New Yrok: W est Publishing Co 1 (1995): 992.