Yapay Sinir Ağı (YSA) nedir? Nöron modeli, Çok katmanlı perseptron (MLP) yapısı, ileri beslemeli (feed forward) geriye yayılımlı (back propagation) ağlar, ön işleme seçenekleri (normalizasyon ve PCA) ve örnek problemler içeren bir 'tutorial'
YAPAY SİNİR AĞLARI ve
MATLAB ile KULLANIMI
Sinir ağları, nöron ismi
verilen hesaplama elemanlarının paralel bir şekilde çalışmasından meydana
gelir. Bu elemanlar biyolojik sinir sistemlerinden esinlenerek tasarlanmıştır.
Belirli bir fonksiyonu gerçekleştirmek için bir sinir ağını,
elemanlar arasındaki bağlantıların (ağırlıkların) değerlerini ayarlayarak
eğitebiliriz.
Genelde, sinir ağları
eğitilerek belirli bir girişe karşılık verilen arzu edilen çıkışı elde ederler.
Bu durum aşağıdaki şekilde verilmiştir. Ağın çıkışı arzu edilen hedefe
ulaşıncaya kadar çıkış ile hedef karşılaştırılarak ağın eğitimi (ağırlık
değerlerlerinin ayarlanması) gerçekleştirilir. En basit tanımıyla yapay sinir
ağları, bilinen en iyi eğri uydurma tekniklerinden birisidir.

Sinir ağları, örüntü tanıma,
kimliklendirme, sınıflandırma, konuşma işleme, bilgisayarla görü ve kontrol
sistemleri gibi karmaşık problemler içeren pek çok sahada kullanılmaktadır.
Nöron Modeli
Basit bir yapay nöron, bir ya
da birden çok skaler girişe ve bir çıkışa sahip olan bir hesaplama elemanıdır.
Tek girişli nöron modeli aşağıda verilmiştir.

burada, p: nöronun girişi
olan skaler değeri, w: p girişi ile nöron arasındaki ağırlık değerini, b:
nöronun bias değerini, f: transfer fonksiyonunu, a: nöronun çıkışını
belirtmektedir. p girişi önce w ağırlığı ile çarpılır. Ardından b bias değeri
ile toplanır ve transfer fonksiyonundan geçirilerek a çıkışı hesaplanır.
Transfer fonksiyonu doğrusal ya da doğrusal olmayan türevlenebilir bir
fonksiyondur. İşte bu basit nöron modelinde, giriş ile çıkış arasında basit bir
matematiksel bağıntı kurulmuştur. Fakat nöronun arzu edilen çıkışı verebilmesi
için w ve b ağırlık değerlerinin optimum olacak şekilde ayarlanması
gerekmektedir.
Birden fazla girişi olan
nöron modeli aşağıda verilmiştir.

burada, R nöronun giriş
sayısıdır. Görüleceği üzere giriş sayısı kadar da w ağırlık değeri vardır. Bu durumda
yukardaki modelin matematiksel ifadesi şu şekilde olur:

Transfer Fonksiyonları
Bir nöronun çıkışı
hesaplanırken çok çeşitli transfer fonksiyonları kullanılabilir. Burada en çok
kullanılan 4 transfer fonksiyonu tanıtılacaktır.
1) 
Keskin-limitli (hard-limit)
transfer fonksiyonunun grafiği yukarıda verilmiştir. Burada, n fonksiyonun
girişi, a ise çıkışıdır: a=f (n). Bu fonksiyonda, giriş değeri 0
(sıfır)’dan büyükse çıkış değeri 1 (bir), giriş değeri 0 (sıfır)’dan küçükse
çıkış değeri 0 (sıfır) olmaktadır. Genelde sınıflandırma uygulamalarında
kullanılmaktadır.
2) 
Doğrusal (linear) transfer
fonksiyonunun grafiği yukarda verilmiştir. Görüldüğü gibi giriş hiçbir
değişikliğe uğramadan aynen çıkmaktadır (a=n). Doğrusal süzgeç problemlerinde
sıklıkla kullanılmaktadır.
3) 
Sigmoid fonksiyonunun grafiği
yukarda verilmiştir. Sigmoid, doğrusal olmayan (non-linear) logaritmik bir
fonksiyondur. Giriş değerleri hangi aralıkta olursa olsun, çıkış 0 ile 1
arasında olmaktadır. Türevlenebilir olduğu için geriye yayılım algoritmaları
ile kullanılabilir. Doğrusal olmayan problemlerin çözümünde tercih
edilmektedir. Matematiksel ifadesi şu şekildedir: a=logsig(n) = 1 / (1 +
exp(-n))
4) 
Hiperbolik tanjant sigmoid
fonksiyonunun grafiği yukarda verilmiştir. Algoritması:
a =
tansig(n) = 2/(1+exp(-2*n))-1 olarak
verilmiştir.
MATLAB’de kullanabileceğiniz
pek çok transfer fonksiyonu bulunmaktadır. Bunların listesine şu adresten erişilebilir.
Çok Katmanlı Perseptron (ÇKP)
Ağı (Multi-layer Perceptron)
Yapay sinir ağlarında çok
çeşitli ağ yapıları ve modelleri vardır. En çok kullanılan ağ yapılarından
birisi ÇKP’dir. Bu ağda bilginin akışı ileri yönlüdür. Öğrenme ve eğitme
algoritması olarak genelde türeve dayalı geriye yayılım (back propagation)
algoritmaları tercih edilir. Burada, aşağıdaki şekilden de görüleceği üzere
nöronlar katmanlar şeklinde organize edilmiştir. Her bir katmanda en az bir
nöron bulunur. Bir önceki katmandaki tüm nöronlar bir sonraki katmandaki nöronlara
bağlantı içermektedir. Bu şekilde arzu edildiği kadar katman oluşturulabilir.
Aşağıdaki şekilde, katman transfer fonksiyonu logsig olan bir perseptron
katmanı görülmektedir. Burada, giriş sayısı R, katmandaki nöron sayısı da S
olarak verilmiştir.

Aşağıda ise üç katmanlı bir
ÇKP YSA yapısı verilmiştir. Burada giriş vektörleri, aslında nöron olmamalarına
rağmen bir sonraki katmana herbiri birer çapraz bağlantı içermektedir. 3 adet
nöron katmanı bulunmaktadır. Son katman çıkış katmanı olarak da isimlendirilir.
Giriş ile çıkış katmanı arasında yer alan katmanlar gizli katman (hidden layer)
olarak da anılmaktadır. Bu durumda giriş ile çıkış arasında paralel bir
matematiksel ilişki kurulmuş olur. Uygun bir öğrenme algoritması ile ağırlık
değerleri ağın arzu edilen çıkışını verecek şekilde ayarlanmaktadır.

MATLAB’de İleri Beslemeli
(Feed Forward) ÇKP Ağların Tasarımı
Öncelikle bu ağ yapısını
kullanabilmek için bir ileri beslemeli ağ nesnesi oluşturmamız gerekir.
MATLAB’deki newff komutu bu işlemi gerçekleştirmektedir. newff komutunun yazım biçimi aşağıda verilmiştir:
net
= newff(PR,[S1 S2…SNl],{TF1 TF2…TFNl},BTF,BLF,PF)
Burada;
PR - R elemanlı giriş
vektörünün minimum ve maksimum değerlerini içeren Rx2 ‘lik matris.
Si - i’nci katmanda
bulunan nöron sayısı.
TFi - i’nci katmanın
transfer fonksiyonu, varsayılan= 'tansig'.
BTF - Geriye yayılım
ağ eğitim fonksiyonu, varsayılan = 'trainlm'.
BLF - Geriye yayılım
ağırlık/bias öğrenme fonksiyonu, varsayılan = 'learngdm'.
PF - Performans
fonksiyonu, varsayılan = 'mse' dir.
Aşağıdaki kod ile 2 katmanlı
bir ağ oluşturmaktayız. Bu problemde iki elamanlı bir giriş vektörü vardır.
Giriş vektörünün ilk parametresinin değer aralığı -1 ve 2 olarak
belirtilmiştir. İkinci parametrenin değer aralığı ise 0 – 5 olarak verilmiştir.
İlk katmanda 3 nöron, ikinci katmanda bir diğer ifadeyle çıkış katmanında ise 1
nöron bulunmaktadır. İlk katmanın transfer fonksiyonu tanjant sigmoid, ikinci
katmanınki ise lineer’dir. Öğrenme algoritması, gradyent azaltım algoritması traingd’dir.
Problem iki girişli bir çıkışlı bilinmeyen bir sistem olarak düşünülebilir.
Amacımız örnek giriş ve çıkış verileri vererek sistemi karakterize etmektir.
net=newff([-1
2; 0 5],[3,1],{'tansig','purelin'},'traingd');
Bu komut ağ nesnesi oluşturur
ve aynı zamanda ağırlık ve bias değerlerinin ilklendirme (initialization)
işlemini rastgele değerler atamak suretiyle gerçekleştirir. Haliyle ağ eğitime
hazır olarak beklemektedir. Bazı durumlarda ağı tekrar ilklendirmek (reset’lemek)
gerekebilir. Bu durumda;
net
= init(net);
komutu kullanılabilir.
Tasarlanan ağın simulasyonu
için sim komutu kullanılır. Similasyon’dan kasıt, ağa bir giriş değeri verip
ağın çıkışını hesaplatmaktır.
p =
[1;2];
a =
sim(net,p)
a =
-0.1011
Burada p ağın giriş verisini
temsil etmektedir. Ağın iki girişi olduğu için p matrisi iki satırdan meydana
gelmektedir. Görüleceği üzere ağ bir çıkış üretmektedir. Ancak bu, ağ henüz
eğitilmediği ve ağırlık değerleri rastgele atandığı için arzu edilen çıkış
değildir. Bu komutları kendi bilgisayarınızda çalıştırdığınızda muhtemelen
farklı bir çıkış elde edeceksiniz. Çünkü ağırlık değerleri ilklendirilirken
rastgele olarak atanmaktadır.
Diğer bir yandan ağı çoklu
örneklerle de simüle edebilirsiniz.
p =
[1 3 2;2 4 1];
a=sim(net,p)
a =
-0.1011
-0.2308 0.4955
Burada iki girişli ağ için
3’er adet değer verilmiştir. Haliyle ağ her bir örnek için bir çıkış
üretmiştir. Buradan açıkça görülüyorki ağın girişi için (simulasyon veya eğitim
aşamasında) organize edilecek matrisin satırları parametrelere, sütunları ise
örneklere karşılık gelmektedir.
Ağırlıklar ve bias değerleri
ilklendirildikten sonra ağ eğitime hazırdır. Eğitim işleminde ağın davranışını
ortaya koyacak giriş (p) ve çıkış (t) verileri gereklidir. Bunlar eğitim verisi
olarak adlandırılır. Eğitim verileri çözüm uzayının tamamını veya en azından
büyük bölümünü temsil edecek şekilde seçilmelidir. Eğitim esnasında ağırlık ve
bias değerleri iteratif olarak hata fonksiyonunu minimize edecek şekilde
güncellenir. Hata fonksiyonunun MSE olması durumunda hata, arzu edilen çıkış
(t) ile ağın o anki çıkışı arasındaki farkın karesinin ortalamasıdır.
YSA’da kullanılan en temel
öğrenme algoritması geriye yayılım (back propagation) algoritmasıdır. Basit
anlamda ağırlıklar negatif gradyent yönünde güncellenir. Pek çok geriye yayılım
algoritması vardır. En temel yapısı şu şekildedir:

burada,
ağırlık vektörünün k
anındaki değerlerini,
k anındaki gradyenti,
ise öğrenme oranını
temsil etmektedir.
Toplu gradyent azaltım (batch
gradient descent) eğitme algoritması MATLAB’de traingd ile temsil edilir.
Verdiğimiz problemin eğitim
verilerini oluşturup ağın eğitimini şu şekilde gerçekleştirebiliriz:
p =
[-1 -1 2 2;0 5 0 5];
t =
[-1 -1 1 1];
burada, p matrisi ağın
eğitimi için kullanılacak giriş verisini temsil etmektedir. Görüldüğü üzere 2
satırdan ve 4 sütundan oluşmaktadır. Problem iki parametreli olduğu için satır
sayısı 2’dir. Ağın eğitimi için ise 4 örnek verilmektedir. Ağın çıkışını t
matrisi temsil etmektedir. Tek satır olduğuna göre tek çıkış parametresi vardır
(hatırlanırsa sistemimiz 2 girişili 1 çıkışlıdır). Her bir örnek için birer
çıkış verilmiştir. Daha açık bir ifadeyle verilen sistemin doğruluk tablosu şu
şekildedir:
p1 |
p2 |
t |
-1 |
0 |
-1 |
-1 |
5 |
-1 |
2 |
0 |
1 |
2 |
5 |
1 |
Ağın eğitimi ile ilgili temel
parametreleri şu şekilde düzenleyebilirsiniz:
net.trainParam.show
= 50;
net.trainParam.lr
= 0.05;
net.trainParam.epochs
= 300;
net.trainParam.goal
= 1e-5;
burada, show parametresi kaç iterasyonda bir eğitim durumunun
MATLAB ekranına aktarılacağını belirmekte, epoch parametresi iterasyon sayısını, goal parametresi
hedeflenen hata değerini, lr ise geriye yayılım
algoritması için öğrenme oranını belirtmektedir. epoch veya goal parametrelerinden birisi sağlandığında eğitim işlemi
durdurulacaktır.
Ağın eğitimine başlamak için train komutu kullanılır.
[net,tr]=train(net,p,t);
TRAINGD, Epoch 0/300, MSE 1.59423/1e-05, Gradient 2.76799/1e-10
TRAINGD, Epoch 50/300, MSE 0.00236382/1e-05, Gradient 0.0495292/1e-10
TRAINGD, Epoch 100/300, MSE 0.000435947/1e-05, Gradient 0.0161202/1e-10
TRAINGD, Epoch 150/300, MSE 8.68462e-05/1e-05, Gradient 0.00769588/1e-10
TRAINGD, Epoch 200/300, MSE 1.45042e-05/1e-05, Gradient 0.00325667/1e-10
TRAINGD, Epoch 211/300, MSE 9.64816e-06/1e-05, Gradient 0.00266775/1e-10
TRAINGD, Performance goal met.
Görüleceği üzere 211.
iterasyonda hedeflenen hata oranına erişilmiş ve ağın eğitimi durdurulumuştur.
Ağın eğitilip eğitilmediğini test etmek için giriş verisi (p) ile ağı tekrar
simule edelim:
a =
sim(net,p)
a =
-1.0010 -0.9989 1.0018 0.9985
Görüleceği üzere ağ arzu
edilen çıkışları sağlamaktadır. Yani YSA verilen sistemi modellemiştir.
Sistemin girişi ve çıkışı arasındaki bağıntıyı bulmuştur. Bunuda uygun ağırlık
değerlerini seçerek yapmıştır. Bu aşamadan sonra eğitim verisinde
kullanmadığımız yeni veriler vererek ağı test edebiliriz.
MATLAB’de kullanabileceğimiz
pek çok eğitim algoritması bulunmaktadır. En temel algoritma yukarda bahsedilen
geriye yayılım tabanlı toplu gradyent azaltım algoritmasıdır. Fakat MATLAB’de
varsayılan eğitim algoritması olarak Levenberg-Marquardt (trainlm) seçilmiştir. Bu algoritma çok hızlıdır ancak
çalışabilmesi için fazla hafızaya ihtiyaç duymaktadır. Bunların yanı sıra trainbfg ve trainrp algoritmaları da
tercih edilebilir.
Ön-işleme Seçenekleri (Pre-processing)
Bazı temel ön işlemleri
gerçekleştirerek YSA’nın eğitim ve öğrenme performanısını artırabilirsiniz. En
temel ön-işleme yöntemlerden birisi giriş verilerinin normalize edilmesidir. premnmx komutu ile giriş ve çıkış verilerini -1 ile 1 arasına
ölçekleyebilirsiniz:
[pn,minp,maxp,tn,mint,maxt]
= premnmx(p,t);
net
= train(net,pn,tn);
Eğitimden sonra simulasyon
aşamasında ise normalize edilen verilerin tekrar eski haline çevrilmesi
gerekmektedir. Bu işlem için postmnmx komutu
kullanılır.
an
= sim(net,pn);
[a]
= postmnmx(an,mint,maxt);
Bir diğer normalizasyon
yöntemi de verilerin ortalamasını 0 ve standart sapmasını -1 olacak şekilde
yeniden düzenlemekdir. Bu amaç için prestd ve poststd komutları kullanılmaktadır.
p =
[-0.92 0.73 -0.47 0.74 0.29; -0.08 0.86 -0.67 -0.52 0.93];
t =
[-0.08 3.4 -0.82 0.69 3.1];
[pn,meanp,stdp,tn,meant,stdt]
= prestd(p,t);
net
= newff(minmax(pn),[5 1],{'tansig' 'purelin'},'trainlm');
net
= train(net,pn,tn);
an
= sim(net,pn);
a =
poststd(an,meant,stdt);
Bazı durumlarda ağın girişi
çok fazladır. Bu durumlarda eğitim işlemi çok uzun sürmektedir. Eğer giriş
verileri arasında birbirleri ile ilintili veriler varsa bunlar ağın eğitimi
için bir katkıda bulunmayacaktır. Temel bileşen analizi (principle component
analysis - PCA) adı verilen teknikle ağın eğitimine katkıda bulunmayacak
veriler indirgenerek giriş verisi azaltılabilir. Böylece giriş verilerinin
kendi aralarında korelasyonlu olması engellenmiş olur.
p=[-1.5
-0.58 0.21 -0.96 -0.79; -2.2 -0.87 0.31 -1.4 -1.2];
[pn,meanp,stdp]
= prestd(p);
[ptrans,transMat]
= prepca(pn,0.02);
Buradaki örnekte giriş
verisinin ikinci satırı birinci satırın yaklaşık olarak belli bir katsayı ile
çarpılmış halidir. Temel bileşen analizi sonucunda iki parametreli giriş
vektörü tek parametreli hale getirilmiştir (ptrans).
Örnek 1: Çarpım Tablosunun
YSA’na Öğretilmesi
Çarpma işlemi doğrusal
olmayan bir işlemdir ve yapay zekâ için zor bir problemdir. Bu örnekte 1 ile 10
arasındaki sayıların çarpım işlemi YSA’ya öğretilmiştir. Çarpma işleminde iki
giriş ve bir çıkış vardır. Eğitimde 20 adet rastgele sayı seçilmiş ve test
aşamasında yine 20 adet rastgele sayı seçilerek sistemin performansı oraya
konmuştur.
clear
all, close all,clc;
p=round(rand(2,20)*10)
% Giris verisi 2x20’lik matris, rastgele 0-10
t =
p(1,:).*p(2,:) % Cikis verisi p1*p2
%Normalizasyon
islemi
[pn,minp,maxp,tn,mint,maxt]
= premnmx(p,t);
%YSA’nin
tasarimi, egitimi ve simulasyonu
net
= newff(minmax(pn),[5 1],{'tansig' 'purelin'},'trainlm');
net
= train(net,pn,tn);
an
= sim(net,pn);
[a]
= postmnmx(an,mint,maxt); %Normalizasyonun tersi
%Egitim
verilerinin gercek ve YSA cikisinin gosterimi
figure(1),plot3(p(1,:),p(2,:),t,'o');
hold
on,plot3(p(1,:),p(2,:),a,'r*'),grid on;
legend('Gerçek
deger','YSA cikisi'),xlabel('p1'),ylabel('p2'),zlabel('t'),title('Egitim
verisi')
%Test
verilerinin hazirlanmasi, farkli 20 adet ornek
ptest=round(rand(2,20)*10)
ttest
= ptest(1,:).*ptest(2,:)
[ptn,minpt,maxpt,ttn,mintt,maxtt]
= premnmx(ptest,ttest);
atn
= sim(net,ptn); %Simulasyon
[at]
= postmnmx(atn,mintt,maxtt);
%Test
verilerinin gercek ve YSA cikisinin gosterimi
figure(2),plot3(ptest(1,:),ptest(2,:),ttest,'o');
hold
on,plot3(ptest(1,:),ptest(2,:),at,'r*'),grid on;
legend('Gerçek
deger','YSA cikisi'),xlabel('p1'),ylabel('p2'),zlabel('t'),title('Test verisi')



Kaynak: H. Demuth, M. Beale, M. Hagan, "Neural Network Toolbox, for use with MATLAB", "User Guide Version 5", Mathworks, 2006.
Derleyen:
Rifat KURBAN
Bilgisayar Yük. Müh.
rkurban [ a.t ] erciyes edu
tr