1.07.2013

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')


Hiç yorum yok:

Yorum Gönder