Yapay Sinir Ağları

 

Search

 
 

Tüm Ayrıntılarıyla Geri Yayılımlı Yapay Sinir Ağları

Çok katmanlı geri yayılımlı yapay sinir ağı modelini bütün ayrıntılarıyla incelediğimiz bu yazıyı okuyarak, konuyla ilgili kafanızdaki soru işaretlerini giderebilir ve örneğimizin kaynak koduna ulaşabilirsiniz.

İlgili yazı: Geri Yayılımlı Yapay Sinir Ağı Kütüphanesi (GYYSA.dll)

Geri yayılımlı yapay sinir ağları, 2 temel aşamadan oluşur; ileri besleme ve geri yayılım. İleri besleme, ağa giriş verilerinin verildiği aşamadır. Bu aşamanın sonunda elde edilen çıkışlar hata fonksiyonuna girilir ve hatalar geriye yayılarak ağırlıklar güncellenir. Hata fonksiyonunu ve dolayısıyla toplam hatayı minimuma yaklaştırmak için gradyen iniş metodu kullanılır. Şimdi yavaş yavaş ayrıntılara inelim.

Gradyen İniş (Gradient Descent)

Geri yayılım algoritmasının anlaşılabilmesi için önce bu metodun anlaşılması gerekir. Çünkü bu metot, geri yayılımlı yapay sinir ağlarında eğitim aşamasının temelini oluşturur. Metodun ismi kaynaklarda en dik iniş (steepest descent) olarak da geçer.

ÖrnekTürevlenebilir tek değişkenli bir fonksiyon üzerindeki bir P noktası bu fonksiyonun türevinde yerine yazıldığında elde edilecek değer, fonksiyonun eğrisine P noktasında teğet geçen doğrunun eğimidir. Bu doğrunun eğimi, fonksiyondaki artışın hızını ve yönünü belli eder. Eğime bakılarak yerel minimum noktasının ne yönde olduğu tespit edilebilir. Eğer eğim sıfırdan büyükse minimum değerin negatif yönde, sıfırdan küçükse pozitif yönde kaldığı anlaşılır. Fonksiyonun minimum değerine yaklaşıldıkça, teğetlerin eğimi azalır. Bu durumdan yararlanılarak, eğimin adım adım azaltılması suretiyle minimum değerlere yaklaşılması amaçlanır.

Yandaki grafikte f(x) fonksiyonunun türevine P noktasının x koordinatı yerleştirilerek, eğriye bu noktada teğet geçen doğrunun eğimi ve denklemi elde edilmiştir. Eğim negatif olduğundan, minimum nokta için ilerlenmesi gereken yönün pozitif yön olduğu anlaşılır. Grafikte görüldüğü gibi minimum nokta P noktasının sağındadır. Ayrıca grafik üzerinde minimum noktaya yaklaşıldıkça teğetlerin eğimlerinin azalacağı ve minimum noktada sıfır olacağı, yani eğriye minimum noktada teğet geçen doğrunun x eksenine paralel olacağı gözlenebilir.

Yöntemin tek bilinmeyenli bir denklem üzerindeki uygulanışını basitçe örneklendirelim. Türevi alınabilen tek değişkenli herhangi bir fonksiyonun verilen ilk değere en yakın yerel minimum noktası, gradyen iniş metodu kullanılarak kabul edilebilir bir fark ile tespit edilebilir. Önce x'e bir başlangıç değeri verilir ve atılan adımların büyüklüklerinin ölçülebilmesini sağlayan oncekix değeri sıfırlanır. Adım katsayısı(η) ve duyarlılık değeri belirlenir. Daha sonra atılan adımın büyüklüğü, belirlenen duyarlılık değerinden küçük olana kadar -f'(x) yönünde ilerlenerek yerel minimum noktasına adım adım yaklaşılır. Eğim azaldıkça adımlar küçüleceğinden, yerel minimuma yaklaşıldıkça adım büyüklüğü olan |oncekix-x| değeri, duyarlılık değerine yaklaşır:

oncekix = 0
x = 2
η = 0.01
duyarlilik = 0.0001

MutlakDeger(oncekix-x)<duyarlilik ifadesi sağlanana kadar:
{
   oncekix = x
   x = x - η * f'(x)
}

Yerel minimum nokta (x,y): (x,f(x))

Adım Katsayısı (η:eta) Seçimi

Katsayı çok küçük seçildiğinde adımlar küçük olur ve minimuma yaklaşma süreci uzar. Adım katsayısı çok büyük seçildiğinde ise minimum noktanın tek adımda aşılması ve noktanın diğer tarafına geçilmesi söz konusu olabilir. Bu durumda noktanın iki yanına sürekli gidilip gelinir ve nokta bir türlü tutturulamaz. Bunu engellemek için sonraki adımda eğimin azaldığından, yani aşağıdaki ifadenin sağlandığından emin olunmalıdır:

f'(x - η * f'(x)) < f'(x)

Eğim azalıyorken fonksiyon minimum noktasına yaklaşılacağından aşağıdaki ifade de doğru olur:

f(x - η * f'(x)) < f(x)

Gradyen İniş Metodunun Genel İfadesi

Çok değişkenli bir fonksiyonun, bu fonksiyon üzerindeki bir noktada en hızlı artış gösterdiği yön, fonksiyonun gradyeni alınarak bulunan vektörün yönüdür. Bu vektörün yönünün tersine ilerlenerek minimum noktaya yaklaşılır:
Gradyen iniş metodunun genel ifadesi

İleri Besleme (Feed Forward)

Bu aşama, sinir ağının verilerle beslenerek ağdan çıkış alındığı aşamadır. Hata tespiti ağdan çıkış alınmadan yapılamayacağından ileri besleme, sonraki adımların da bir parçasıdır.

Her nörünun birden fazla girişi ve sadece bir çıkışı vardır. Giriş nöronları hariç tüm nöronların her bir girişi, önceki katmanda bulunun bir başka nöronun çıkışı ile ilişkilidir. Çıkış sinyalleri, sonraki katmanda bulunan nöronlara iletilirken arada bulunan dendrit ağırlıkları ile çarpılır. Çarpım, sonraki nöron için bir giriş sinyali niteliğindedir. Bir nöron çıkış üretirken kendisine iletilen tüm giriş sinyallerini toplar ve bu toplamı aktivasyon fonksiyonundan geçirir.
İleri Besleme
(ç1,ç2,...,çn önceki katmanın nöronlarının çıkışları, g toplam giriş sinyali ve f(x) aktivasyon fonksiyonudur.)

Giriş katmanındaki nöronların dendritleri yoktur. Bu nöronlar girişlerini dışarıdan alır ve çıkış üretmek için aktivasyon fonksiyonu kullanmaz. Çıkış değerleri direk olarak giriş değerleridir. Giriş katmanı nöronları dışındaki tüm nöronlar, yukarıdaki şekilde olduğu gibi çıkış değerleri üretir. Son katmanda bulunan nöronların çıkış değerleri ağın çıkışıdır.

Hata Fonksiyonu (Error Function)

Ağdan alınan çıkışların, beklenen değerlere ne kadar uzak olduklarının, gradyen iniş metodu ile minimize edilebilecek bir fonksiyon yardımıyla ölçülmesi gerekir. Geri yayılım algoritmasında, en küçük kareler ortalaması (least mean square, LMS), hata fonksiyonu olarak kullanılır.
Hata Fonksiyonu
(ç1,ç2,...,çn ağdan alınan çıkışlar, b1,b2,...,bn ağdan beklenen çıkışlar ve E hata fonksiyonudur.)

Her bir çıkış değeri ile giriş değerinin farkının karesi alınır ve kareler toplanıp ikiye bölünür. Hata fonksiyonunun sonucu, gradyen iniş metodu ile minimum değeri olan sıfıra yaklaştırılır. Sonuç sıfıra yaklaştıkça, çıkış değerleri de beklenen değerlere yaklaşır.

Hata Fonksiyonunun Türevi

Hata fonksiyonu temelde ağırlıklara bağlı olarak değer alır. Gradyen iniş metoduna göre fonksiyonun minimum olmasını sağlayacak ağırlık değerlerinin hesaplanabilmesi için gradyeninin alınması ve ağırlıkların, elde edilen vektörel fonksiyonda yerlerine yazılarak bir vektör elde edilmesi gerekir. Daha sonra bu vektör, öğrenme katsayısı ile çarpılarak ağırlıkların meydana getirdiği vektörden çıkarılır. Böylece ağırlıklar her adımda, hata fonksiyonunun sonucunu daha da küçültecek şekilde güncellenir.
Tüm değişkenler yerine yazıldığında ağırlıklara bağlı hata fonksiyonu
(çj önceki katmanın j. nöronunun çıkış sinyali, aij i. nöron ile önceki katmandaki j. nöron arasındaki dendritin ağırlığı, gi i. nörona gelen giriş sinyallerinin toplamı, çi i. nöronun çıkış sinyali ve E hata değeridir.)

Hata fonksiyonu yukarıda gösterildiği gibi 3 parçaya ayrılır. gi aij'ye, çi gi'ye, E çi'ye bağımlıdır. Gradyenin her bir bileşeni ayrı ayrı hesaplanır. Tüm ağırlık değişkenlerine göre birer defa kısmi türev alınır. Her bir sonuç, gradyenin bir bileşenidir. Fonksiyonun ağırlık değerlerine göre kısmi türevleri alınırken zincir kuralı kullanılır:
Fonksiyonun zincir kuralı kullanılarak türevi alınır.

Bu 3 kısmi türevi alıp sonuçları yerlerine yazalım:
İlk iki ifadenin türevi

Hesapların tekrar tekrar yapılmasına gerek yoktur. İleri besleme evresinde hesaplanan değerler kullanılarak zaman kaybı önlenir. Bu amaçla 2. fonksiyonun türevi kendi cinsinden elde edilebilir:
İkinci ifade kendi cinsinden yazılır.

İfadeler yerlerine yazıldığında hata fonksiyonunun aij ağırlığına göre kısmi türevi elde edilmiş olur. Burada aij i. nöron ile önceki katmandaki j. nöron arasındaki dendritin ağırlığı, bi beklenen i. çıkış sinyali, çi alınan i. çıkış sinyali ve çj de bir önceki katmanda bulunan j. nöronun çıkış sinyalidir.

Eğer farklı bir aktivasyon fonksiyonu kullanılsaydı (1-çi)*çi yerine, kullanılan aktivasyon fonksiyonunun türevi yazılırdı. Örneğin çok kullanılan bir diğer aktivasyon fonksiyonu olan hiperbolik tanjant kullanılsaydı ağırlık güncelleme formülü şöyle olurdu:

çi = tanh(x)
tanh'(x) = 1 - tanh(x) * tanh(x) = 1 - çi * çi

E' = -(bi - çi) * (1 - çi * çi) * çj

Ağırlıkların Güncellenmesi ve Delta Kuralı

aij = aij - η * (-(bi - çi) * (1 - çi) * çi * çj)
    = aij + η * (bi - çi) * (1 - çi) * çi * çj  

Gradyen iniş metodunda adım katsayısı olarak anılan η(eta), yapay sinir ağlarında öğrenme katsayısı ismini alır.

İfadedeki (bi-çi) değeri, beklenen değer ile çıkış arasındaki farktır ve δ(delta) ile gösteririlir. Ara katmandaki her nöron, sonraki katmanda ölçülen her bir hata değerinden, aralarda bulunan dendrit ağırlıkları oranında sorumludur. Bu yüzden ara katmanlardaki nöronların deltası hesaplanırken bir sonraki katmanda bulunan her bir nöronun deltası, aradaki dendrit ağırlığı ile çarpılır ve bu çarpımlar toplanır:
Ara katmanlarda deltanın hesaplanması
(δi i. nöronun deltası, δj sonraki katmanda bulunan j. nöronun deltası ve aji i. nöron ile sonraki katmanda bulunan j. nöron arasındaki dendritin ağırlığıdır.)

Deltayı yerine yazalım:

aij = aij + η * δi *(1 - çi) * çi * çj

Bu ifade ile bütün ağırlıklar güncellendiğinde, ağ verilen giriş-çıkış için bir defa eğitilmiş olur ve çıkışlar beklenen değerlere bir miktar yaklaşır. Ancak hataların yeterince küçülmesinin sağlanması amacıyla eğitim binlerce, onbinlerce defa tekrarlanır. Ara katman ve nöron sayılarına bağlı olarak ağın daha az veya daha fazla eğitilmesi gerekebilir.

Eğitim Setleri ve Eğitim Süreci

Eğitim süreci, rastgele işleyen bir süreç değildir. Önceden planlanması gerekir. Giriş verileri yapay sinir ağına rastgele biçimde verilmemelidir. Ağın eğitileceği verilerin önceden hazırlanması ve sıralı biçimde ağa girilmesi, daha sağlıklı sonuçlar alınmasını sağlar. Ağın eğitimi için hazırlanmış düzenli veri setine eğitim seti adı verilir ve bu veri setinde, ağın sonradan karşılaşabileceği mümkün olduğu kadar çok veri bulundurulması gerekir. Ağ eğitildikten sonra, ağa eğitim setinde bulunmayan bir veri dizisi girildiğinde ağdan kabul edilebilir cevaplar alınabilir. Ağın bu yeteneği, eğitim setindeki verilerin çeşitliliği ile doğru orantılı olarak artar.

Giriş ve Çıkış Verilerinin Ölçeklenmesi

Sigmoid fonksiyon kullanan bir sinir ağında, ağa 0 ve 1 veya sadece bu iki değer arasında sayılar verilebilir. Ancak ağın büyük sayılar kullanması istenebilir. Bunu sağlamak için herhangi 2 değer arasında bulunan giriş ve çıkış verileri belli iki katsayı ile çarpılarak 0 ve 1 aralığına çekilir. Böylece ağ 0 ve 1 arasındaki değerlerle işlemeye devam ederken, giriş-çıkışlar istenen aralıklarda verilip alınabilir.

Örneğin giriş verilerinin 0 ile 10, çıkış verilerinin 0 ile 100 arasında değiştiğini varsayalım. Giriş verileri ağa verilirken 1/10 ile çarpılır. Çıkış verileri ise eğitim esnasında 1/100 ile, ağdan çıkış alındığında 100 ile çarpılır. Böylece hem giriş hem de çıkış değerleri, ağın işleyişinde bir değişiklik yaratılmadan istenen aralığa genişletilmiş olur.

Problemler ve İyileştirmeler

Bias

Giriş vektörünün tüm elemanları 0 iken öğrenmenin gerçekleşmesi mümkün değildir. Çünkü bu durumda giriş katmanını sonraki katmana bağlayan dendritlerin hiçbir işlevi kalmamaktadır:

ç = f(0*a1+0*a1+...+0*an) = f(0)

Bu sorunu gidermek amacıyla çıkış katmanı hariç her katmana dendriti bulunmayan, değeri 1 olan ve sabit kalan birer nöron yerleştirilir. Bu nöronlara bias adı verilir. Biaslar sayesinde giriş nöronları haricindeki hiçbir nöronun toplam giriş sinyalinin 0 olmayacağı garantilenmiş olur.

Bazen her nöronun yanına bir bias eklendiği de olur. Bu durumda sadece toplam giriş sinyalinin değil, aynı zamanda çıkış sinyallerinin de 0 olmayacağı garanti altına alınmış olur. Böylece öğrenme daha da güçlendirilir.

Momentum

Gradyen iniş metodu, yerel minimumlara rastladığında adım büyüklüğü büyük oranda azalır ve öğrenmenin yavaşlayıp durma ihtimali doğar. Buna engel olmak amacıyla ağırlıklar güncellenirken, meydana gelen değişimlere, önceki değişimlerin belli bir oranda eklenmesi sağlanarak öğrenme sürecinde momentum etkisi yaratılır(alfa: momentum katsayısı):
Ağa momentum katsayısının eklenmesi

Örnek

Yapılması gereken işlemleri, sayısal değerler olmadan basit ufak bir sinir ağı üzerinde örnekleyelim. Çivi yazısı için üzgünüm...
Örnek

Ve Bir Program Örneği

Geri yayılımlı yapay sinir ağı örneği

Son olarak işlemleri adım adım gözleyebileceğimiz bir program örneği paylaşalım. Programın dizi ve döngü kullanmamasına, işlemlerin tek tek açıkça yer almasına özellikle özen gösterildi. Programın kaynak kodlarını (C#) buraya tıklayarak indirebilirsiniz...

Leave Comment

 
You are replying to comment #-1. Click here if you want to cancel replying.

 

Comments (6)

Nabi
Reply
18 Nisan 2011 Pazartesi, 12:30
#1

Eline sağlık bende en çok bu hata fonksiyonunun türevine takılıyodum heralde bu defa projemi tamamlayabilecem.

altan yücel
Reply
16 Eylül 2011 Cuma, 19:03
#2

teşekkürler çok yararlı bir kaynak

Gozde Demircan
Reply
29 Ekim 2011 Cumartesi, 21:12
#3

Elinize sağlık çok yararlı bir kaynak olmuş:)

Leyla
Reply
09 Aralık 2011 Cuma, 19:52
#4

Çok açıklayıcı ve de  faydalı bir anlatım olmuş, eline sağlık... teşekkürler

barış
Reply
04 Mart 2012 Pazar, 20:01
#5

Teşekkürler çok yararlı bir kaynak

Enes
Reply
18 Nisan 2013 Perşembe, 00:17
#6

Sonunda bu konuyu bu  kaynak sayesinde öğrenebildim.Teşekkürler.

 
 
Atasoy Blog v4 hafif sürüm, © 2008-2014 Hüseyin Atasoy
Sayfa 28 sorgu ile 0,024043 saniyede oluşturuldu. | Anasayfa | Yukarı Çık