YAPAY SİNİR AĞLARI ve MATLAB ile KULLANIMI Yazdir E-posta
Çarşamba, 06 Şubat 2008
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ğeuğ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 sistemikarakterize 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öretek çı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 bahsedilengeriye yayılım tabanlı toplugradyent 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şlemeyö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.


Rifat KURBAN
Bilgisayar Yük. Müh.
Erciyes Üniversitesi

www.teknohaber.net
rkurban [ a.t ] erciyes edu tr

» 9 Yorumlar
9"aaa" tarafından neşe de Pazar, 10 Ocak 2010 10:06
makine öğrenmesi ile ilgili matlapta basit bir uygulama örneğine ihtiyacım varr.ÇOK ACİLL:((
8"kaya" tarafından çiğdem de Cumartesi, 26 Aralık 2009 23:51
bana da acilen LVQ ağında OR kapısını yapılmıs örneği lazım excel de olursa ii olur gönderirseniz cok sevineceğim
7Yorum tarafından serhat de Salı, 13 Mayıs 2008 11:23
attık ama yine yanıt yok maalesef :(
6Yorum tarafından makinacı de Pazartesi, 12 Mayıs 2008 13:38
Hocam Eline sağlık... 
 
Arkadaşlar hocam mail adresini eklemiş mail atsanıza :D 
rkurban [ a.t ] erciyes edu tr
5"YANIT YOK" tarafından serhat de Pazartesi, 12 Mayıs 2008 13:13
yaa arkadaşlar kimse herhalde ilgilenmior...yardıma ihtiyacım var dedim ama...
4"LVQ" tarafından serhat de Çarşamba, 07 Mayıs 2008 21:26
LVQ algortimasının basit bir problemi matlab'ı kullanarak çözme uygulaması,örneği varsa bana yollayabilirmisiniz.Rica etsem...Teşekkürler.
3":)" tarafından beyza de Perşembe, 17 Nisan 2008 01:30
çok güzel bir paylaşım olmuş.. yarın sınavım var ve çok faydalı oldu eline sağlık..
2Yorum tarafından okanozturk de Salı, 15 Nisan 2008 19:56
Yakın zamanda elimizdeki örnekler ver dökümanların hepsini paylaşıcaz. Mail adresiniz sistemimizde kayıtlı ordan size iletiriz...
1"LVQ" tarafından u?ur de Cuma, 11 Nisan 2008 21:19
arkada?lar YSA de LVQ kullan?m? ile örnek uygulamas? olanlar varsa payla?abilirmi? ?imdiden çok te??ekürler
» Yorumu Gönder
Email (Üyeler adresinizi göremez)
İsim
Başlık
Yorum
 
< Önceki   Sonraki >

Powered by  MyPagerank.NetTOPlist