Niyazi Volkan POLAT Karabük Üniversitesi Bilgisayar Mühendisliği Ödev Konusu: Yapay sinir ağlarında(ysa) kullanılan Adaline öğrenme kuralı algoritmasını kodlayınız. Programın akış diyagramı ve kod açıklamaları proje dokümanına eklenmelidir. Dönem Sonu Projesi www.pcbilisim.com
İçindekiler GİRİŞ... 3 YSA Nasıl Çalışır?... 3 Adaline... 4 Adaline Ünitesinin Öğrenme Kuralı... 4 Adaline Ünitesinin Öğrenme Kuralına Örnek... 6 Öğrenme Tamamlanır.... 8 C KODLARI VE AÇIKLAMALARI... 9 C Programı üzerinde çıktı Görüntüsü... 12 Akış Diyagramı... 12 Referanslar... 14
GİRİŞ Son yıllarda bilgisayar bilimlerinde yaşanan teknolojik gelişmeler, neredeyse takip edilemeyecek bir hızda ilerlemektedir. Bu ilerleme, insanoğlunun da yaratıcılığını ve sınır tanımazlığını arttırmış, daha önce hiç hayal bile edilemeyen yeni gelişmelerin doğmasına neden olmuştur. Bu gelişmelerden bir tanesi de Yapay Zeka dır. Bilim adamları, adına Yapay Zeka dedikleri, insanın düşünebilme, anlayabilme, öğrenebilme ve yorumlayabilme yeteneklerini, programlamayla taklit ederek problem çözümüne kullanmaktadırlar. Yapay Sinir Ağları (YSA) da, Yapay Zeka biliminin altında araştırmacıların çok yoğun ilgi gösterdikleri bir araştırma alanıdır. YSA ların örnekler ile öğrenebilme ve genelleme yapabilme özellikleri onlara çok esnek ve güçlü araçlar olma özelliği sağlamaktadır. Bu çalışmada YSA teorik olarak anlatılmış ve günlük hayatta kullanılan değişik YSA uygulamalarından bahsedilmiştir. YSA Nasıl Çalışır? Sinir ağı ile hesaplamalarda istenilen dönüşüm için, adım adım yürütülen bir yöntem gerekmez. Sinir ağı ilişkilendirmeyi yapan iç kuralları kendi üretir ve bu kuralları, bunların sonuçlarını örneklerle karşılaştırarak düzenler. Deneme ve yanılma ile ağ kendi kendine işi nasıl yapması gerektiğini öğretir. YSA'larda bilgi saklama, verilen eğitim özelliğini kullanarak eğitim örnekleri ile yapılır. Sinirsel hesaplama, algoritmik programlamaya bir seçenek oluşturan, temel olarak yeni ve farklı bir bilgi işleme olayıdır. Uygulama imkânının olduğu her yerde, tamamen yeni bilgi işleme yetenekleri geliştirebilir. Bu sayede de geliştirme harcamaları ile geliştirme süresi büyük ölçüde azalır. Bir yapay sinir ağı girdi setindeki değişiklikleri değerlendirerek öğrenir ve buna bir çıktı üretir. Öğrenme işlemi benzer girdi setleri için aynı çıktıyı üretecek bir öğrenme algoritması ile gerçekleşir. Öğrenme setindeki girdilerin istatistiksel özelliklerinin çıkarılarak benzer girdilerin gruplandırılmasını sağlayan bir işlemdir. Sinir yapılarına benzetilerek bulunan ağların eğitimi de, normal bir canlının eğitimine benzemektedir. Sınıfların birbirinden ayrılması işlemi (dolayısıyla kendini geliştirmesi), öğrenme algoritması tarafından örnek kümeden alınan bilginin adım adım işlenmesi ile gerçeklenir. YSA kullanılarak makinelere öğrenme genelleme yapma, sınıflandırma, tahmin yapma ve algılama gibi yetenekler kazandırılmıştır.
Adaline 1959 da, Stanford Üniversitesinden Bernard Widrow, basit nöron benzeri elemanlara dayanan ve Adaline (Adaptive Linear Nöron) olarak adlandırılan bir adaptif lineer elemanı geliştirmiştir. Adaline yapısı tüm sinir ağlarının en basitidir ve öğrenme için danışmanlı öğrenmeyi kullanır. Adaline ve iki tabakalı biçimi olan madaline (Multiple Adaline); ses tanıma, karakter tanıma, hava tahmini ve adaptif kontrol gibi çok çeşitli uygulamalar için kullanılmıştır. Daha sonraları adaline, ayrık bir çıkış yerine sürekli bir çıkış üretmek için geliştirilmiştir. Widrow, telefon hatları üzerindeki ekoları elimine etmeye yarayan adaptif filtreleri geliştirmede, adaptif lineer eleman algoritmasını kullanmıştır. Bununla ilk defa YSA lar gerçek bir probleme uygulanmıştır. Adaline bir çok uygulama için oldukça iyi çalışmasına rağmen lineer problem uzayıyla sınırlıdır. Lineer transfer fonksiyonu kullanırlar. Giriş ve istenilen çıkış desenlerinin tekrar tekrar ağa uygulanmasıyla eğitim gerçekleştirilir. Desenlerin doğru sınıflara ayrılmasıyla, hatalar minimize edilerek öğrenme gerçekleştirilir. Eğitimden sonra adaline, yeni girişleri kazandığı deneyime göre sınıflandırabilir. Adaline Ünitesinin Öğrenme Kuralı Adaline ünitesinin öğrenme kuralı, YSA lardaki geneler öğrenme prensibine göre çalışmaktadır. Girdilerden çıktılar hesaplanır ve ağırlıklar çıktıya göre değiştirilir. ADALİNE ünitesinin net girdisi Net ve çıktısı (Ç) aşağıdaki formül ile hesaplanmaktadır. NET = w i x i Eğer NET >= 0 çıktı (Ç)=1 Eğer NET < 0 çıktı (Ç)=-1 Çıktı hesaplandıktan sonra, ADALİNE ünitesinin hatası aşağıdaki formül ile hesaplanır. E=B-Ç Olacaktır. Amaç, bu hatayı en aza indirecek ağırlıkları bulmaktır. Bunun için ağa her seferinde farklı örnekler gösterilerek hatalar hesaplanmakta ve ağırlıklar hatayı azaltacak şekilde değiştirilmektedir. Zaman içinde hata, olması gereken en küçük değere düşmektedir. Bu hatayı azaltmak için kullanılan kural şu formül ile gösterilmektedir.
Wy = We + *E*Xi Her hangi bir t a anında, Wi (t) = Wi (t-1) + a * E* Xi olacaktır. Wi (t) : Ağırlıkların t zamanındaki değerleri Wi (t-1) : Ağırlıkların t zamanındaki değerleri : Öğrenme katsayısı B: Beklenen Çıktı E: Beklenen değer ile çıktı arasındaki hata X: Girdiler Benzer şekilde, eşik değerinin zaman içindeki değeri de y= e + (B-Ç) formülü ile hesaplanır. Adaline modeli öğrenimi, yani Widrow-Hoff olarak bilinen eğitim algoritmasının öğrenimi şu şekildedir. -1 ile 1 arasında ağırlık değerlerinin rastgele atanması; Hedef çıktı ve girdi değerlerinin seçimi, Hata oranının hesaplanması, Ağırlıkların düzenlenmesi, Hata değeri sıfır olana kadar işlemin devamı, Yeni girdilerin verilecek işlemin devamı,
Adaline Öğrenme Modeli Kısaca Adaline Öğrenme Modeli Net girdi hesabı: NET = ( + W1*X1+ W2*X2 +.. + Wn*Xn ) Çıktı hesabı: C = ( NET >= 0? 1 : -1 ) Hata hesabı: E = B Ç Öğrenme işlemi: Wi = Wi + * E * Xi Eşik değer formülü: y= e + *E Adaline Ünitesinin Öğrenme Kuralına Örnek Adaline ünitesinin çalışma prensibini göstermek için şu örnek verilebilir. Meyve üreticisi bir firmanın, elma ve armutlar ambara geldiklerinde karışmalarını önlemek için bir makine yapmak istediğini varsayalım. Bu amaçla bir yapay sinir ağının kurulabilmesi nasıl mümkün olacaktır? Meyveleri gösteren ve birbirinden farklılıklarını ortaya koyan örnekler oluşturmak yapılacak ilk iştir. Bunun için meyveleri ve onun özelliklerini gösteren vektörleri belirlemek gerekmektedir. Meyvelerin şeklini, görüntüsünü ve ağırlığını temsil etmek üzere 3 boyutlu bir vektör oluşturulabilir. Elma ve portakalı gösteren prototiplerin şu vektörler ile gösterildiği varsayılırsa örnek setinde iki örnek olacaktır. Bunlar şu şekilde belirlensin. Örnek 1: Portakal X1= (1,0) ; Bu örneğin beklenen çıktısı Ç1=-1 Örnek 2: Elma X2 = (0.1) ; Bu örneğin beklenen çıktısı Ç2= 1 Bu problemi çözebilmek için 2 girdisi olan bir Adaline ünitesi tasarlamak gerekecektir. Öğrenmenin amacı problem girdilerini doğru sınıflandıracak ağırlık değerlerini ve eşik değerini bulmaktır.
2 girdili bir adaline ünitesi Problemin çözümü için ağırlık değerleri ve eşik değeri başlangıçta rastgele atanmaktadır. Bunun aşağıdaki gibi olduğu varsayılsın. W1=0.3 W2= 0.2 =0.5 Ø =0.1 Birinci İterasyon: Birinci girdi vektörünün ağa gösterilmesi sonucu ağın çıktısı aşağıdaki formüle göre hesaplanırsa. NET=0.3+0+0.1= 0.4 >0 => Ç= 1 NET değeri sıfırdan büyük bir değer olduğundan ağın çıktı değeri 1 kabul edilir. B=-1 olduğundan ağın ağırlıklarının değiştirilmesi gerekmektedir. E= B-Ç= -1-1=-2 Değiştirme yukarıda verilen formüle göre yapılacaktır. Wy = We + a(b-ç) X Wy= [0.3, 0.2] + 0.5*(-2) [1, 0] Wy= [0.3, 0.2]+ (-1) [1,0] Wy= [0.3-1, 0.2-0] =[ -0.7, 0.2] Eşik değeri de benzer şekilde değiştirilir. Øy= Øe + a (B-Ç) Øy = 0.1 + 0.5* (-2)= -0.9 Böylece öğrenmede birinci iterasyon tamamlanmış olur.
İkinci İterasyon: İkinci iterasyonda benzeri işlemler ikinci örnek için yapılır. Fakat ağırlıkların ve eşik değerinin yeni değerleri kullanılır. NET = -0.7*0+0.2*1-0.9 = - 0.9 < 0 => Ç=-1 Bu örnek için B= 1 olması gerektiğinden bir hata oluşmuş olacaktır. E=B-Ç= 1-(-1)=2 olur. Wy= [-0.7, 0.2] + 0.5*2 [0, 1] Wy= [-0.7, 0.2]+ [0, 1] Wy= [-0.7, 1.2] Eşik değeride değiştirilir. Øy = -0.9 + 0.5* (2)= 0.1 Üçüncü İterasyon: NET = -0.7+ 0+0.1= -0.6 < 0 => Ç= -1 Bu örnek için B= -1 olması gerektiğinden ağın sınıflandırması doğrudur. Bu ağırlıklarda bir değişiklik yapılmasını gerektirmez. Çünkü B-Ç=0 olacak ve formülde herhangi bir değişiklik olmayacaktır. Dördüncü İterasyon: NET = 0+ 1.2 + 0.1= 1.3 > 0 => Ç= 1 Bu örnek için B= 1 olması gerektiğinden ağın sınıflandırması doğrudur. İki örneği de doğru sınıflandırdığına göre öğrenme tamamlanmıştır. Ağırlıkların ve eşik değerinin aşağıdaki gibi olması sonucu bu ağ sınıflandırıcı olarak (bu örnek için) kullanılabilir. SON DEĞERLER: WY = [-0.7,1.2] FY = 0.1 Öğrenme Tamamlanır. ------------------------------------------------------------------------------------------------------------------------------------ Önemli Bölüm: Verilen örnekleri sırası ile kontrol ediliyor ve ne zaman ki her iki örnekte ağırlıklarda bir değişiklik olmuyor o zaman öğrenme tamamlanmış olur.
C KODLARI VE AÇIKLAMALARI #include <stdio.h> #include <conio.h> int main () int zeka[5][5],cvp[5]; float agirlik[5],topla,net,esikdegeri,ogrenmekatsayisi; int ornek,girdi,i,ii,c1,fark,dogru,iterasyon; printf("ornek sayisi: "); // Örnek Sayısı girişi yapıyoruz. scanf("%d",&ornek); printf("ornek Sayi Giris Sayisi: "); // Örnek içerisinde bulunacak sayı miktarını giriyoruz. scanf("%d",&girdi); printf("---------------------------\n"); for(i=1;ornek>=i; i++) // Döngü ile Örnekler içerisine sayı girişleri yapıyoruz ve örneklerin cevaplarını giriyoruz son olarak. for(ii=1;girdi>=ii; ii++) printf("%d ornegin girdisi:",i); scanf("%d",&zeka[i][ii]); printf("%d. ornegin cevabi:",i); scanf("%d\n",&cvp[i]); printf("---------------------------\n"); for(ii=1;girdi>=ii; ii++) // Örnek içerisinde bulunan sayı kadar ağırlık giriyoruz, sırası ile. printf("%d. Agirlik :",ii); scanf("%f",&agirlik[ii]); printf("\n"); // Eşik değeri ve Öğrenme kat sayısı değerleri giriliyoruz. Bu sayılar 0 ile 1 arasında olur. Sonradan bu degerler program içerisinde değişecektir. printf("ornegin esik degeri:"); /* Eşik degeri 0 dan farklı bir degerde olmalıdır, aksi halde program hatalı çalışacaktır. */ scanf("%f",&esikdegeri); printf("\n"); printf("ogrenme katsayisi degeri:"); scanf("%f\n",&ogrenmekatsayisi); // ekrana girilen degeri yazdırıyoruz. for(i=1;ornek>=i; i++) printf("%d. ornek= (",i);
for(ii=1;girdi>=ii; ii++) printf(" %d",zeka[i][ii]); printf(")=%d \n",cvp[i]); printf("\n"); printf("agirliklar= ("); for(ii=1;girdi>=ii; ii++) printf(" %.1f\n\n",agirlik[ii]); dogru=0; iterasyon=0; printf("-----------ogrenme Basliyor---------\n"); do for(i=1;ornek>=i; i++) // Döngüyü en az örnek sayısı kadar döndürüyoruz. topla=0; iterasyon=iterasyon+1; for(ii=1;girdi>=ii; ii++) // Net hesapı yapıyoruz. topla=topla+zeka[i][ii]*agirlik[ii]; net=(topla+(esikdegeri)); if(net>=0) /* Net 0dan büyük veya eşitse cevap 1 olmalıdır, değilse 0. Sonraki adımda beklenen cevap ile şimdi buluduğumuz cevabı karşılaştıracağız eğer eşitse ağılıklarda herhangi bir değişiklik olmayacak. */ c1=1; else c1=-1; printf("%d. iterasyon---------",iterasyon); printf("\n"); if(cvp[i]==c1) printf(" C1 = B1 oldugundan degisiklik yapilmiyor"); dogru=dogru+1; /*Can alıcı nokta!!! Döngünün sonlandırılmasında Örnek sayısına eşik olacak olan dogru değişkeni her true degerde 1 artar aksi halde else degerinde Dogru=0; ile yeniden 0 lanır. */
else dogru=0; fark=cvp[i]-(c1); for(ii=1;girdi>=ii; ii++) // ağırlık degerleri değiştirilir. agirlik[ii]=agirlik[ii]+ogrenmekatsayisi*fark*zeka[i][ii]; printf("%d agirlik= %.1f\n",ii,agirlik[ii]); esikdegeri=esikdegeri+ogrenmekatsayisi*fark; printf("\n"); printf(" NET= %.1f\n",net); printf("---------------------------\n"); while(dogru<ornek); /* Örnek sayımız 2 ydi ne zaman ağırlıklar her iki örnek için true değer döndürdüğünde dogru degişkenizi 2 degerini alacak ve öğrenme sonlanacaktır.*/ printf("ogrenme Tamamlandi.\n"); printf("yeni Agirliklar: "); for(ii=1;girdi>=ii; ii++) /* Son olarak en son ağırlık değerleri ekrana yazdırılır.*/ printf(" W%d: %.1f",ii,agirlik[ii]); getch(); return 0;
C Programı üzerinde çıktı Görüntüsü
Akış Diyagramı
Referanslar 1) http://www.yapay-zeka.org/files/tez/tugba-sarac-ysa-seminer.pdf (Tuğba Saraç ın hazırlamış olduğu tez bu projeyi yapabilmemde en büyük yardımcım olmuştur.) 2) http://www.cnylmz.net/php/adaline-modelli-yapay-sinir-agi-ornegi-25/ ******* 3) http://gokercebeci.com/ysa/backpropagation (Göker Cebeci ile mail yolu ile iletişime geçip yardım alındı. Kendilerine teşekkürü borç bilirim.) 4) http://www.scribd.com/doc/53716723/tf00590# 5) http://www.burhanemre.com/yapay-sinir-aglari-perceptron-ve-adaline-modeli.htm/ 6) http://w3.gazi.edu.tr/~akcayol/files/zol6ann.pdf 7) http://ben.mukerremyilmaz.com/dersler/tbil610/