Makine Öğrenmesi

Arduino ve Makine Öğrenimi(Q Learning Algoritması)


Selamlar , Aslında bu konuyu bir video çekerek işlemek istiyordum. Fakat konunun anlatılma sürecinin uzun olabileceğini düşündüm ve hali hazırda bir kameram olmadığı için bilgisayar masaüstü arka fonunda bir video hazırlamak istemedim. Ha bu arada youtube kanalımda sizler için farklı videolar var.

Gelelim bu yazının konusu olan Arduino ve Makine Öğrenimi.Her ne kadar bizim ülkemizde içi boşaltılmaya çalışılan bir kavram olan Yapay Zeka ve Uygulamaları geleceğimiz için kaçınılmaz bir alan. Makine Öğrenimi ise Yapay Zeka’nın çeşitli alt dallarından birisi.Kabaca şöyle tarif edebiliriz ; Makine öğrenimi bir makine’nin verileri kullandığı bir süreç ve karşılaştığı durumlar karşısında en uygun karar mekanizmasını devreye sokabilmesi.Tabi bu veriler ağaçtan bir elma gibi düşmüyor ,  bu verileri bir çok farklı platform üzerinden ediniyor ve bir öğrenme süreci geçiyor. Öğrenme sürecinde bizi farklı metodlar karşılıyor. Hepsine tek tek değinmek yerine bugün kullanacağımız yöntem olan pekiştirmeli-takviyeli-reinforcement isimleriyle görebileceğiniz bir öğrenme yöntemine giriş yapalım.

Takviyeli Öğrenme yöntemlerinden biri olan Q-Learning Algoritması bu öğrenme yöntemlerinde ki en temel algoritmalardan birisi. Bu algoritmada sistem rastgele ya da bilinçli şekilde çeşitli hamleler yapıyor ve iterasyonlar sonucunda kendisini güncelleyerek doğru sonuca ulaşmaya çalışıyor. Algoritma tamamen ödül ve ceza kavramlarının sisteme uyarlanmış hali diyebiliriz. Bir odalar kümesi düşünün , siz sisteme sadece odaların kendileri arasında ilişkilerini yükleyerek en kısa yolu bulmasını istiyorsunuz. Ve bu yapıyı bugün Arduino kullanarak yapmaya çalışacağız. Algoritma mantğını diğer mcu mimarilerine uyarlamak oldukça basit aslında. Çünkü mimari ile ilgili bir işlem neredeyse yapmıyoruz. Sadece görsellik katacağız bu uygulamamızda.

WhatsApp Image 2018-03-29 at 23.20.25.jpeg

 

Yukarıda bulunan görseli odaların bulunduğu bir yapının kağıda dökülmüş hali gibi düşünebilirsiniz. 1.Oda bizim başlangıç(main) odamız. 7.odamız ise bizim hedef(target) odamız. Görsel üzerinde inceleme yaparsanız , odalar arasında çeşitli ilişkiler mevcut. Örneğin 5.odadan , 7.odaya geçiş yapamıyorsunuz , 1.odadan 2.odaya tek hamlede geçiş yapabiliyor iken , 4.odaya geçiş yapmanız için 2. ya da 3.oda üzerinden geçmeniz gerekiyor. Algoritma içerisinde odaların birbiri arasında ki ilişkiyi koda dökerken şu yolu izleyeceğiz. Eğer içerisinde bulunduğunuz odadan TEK hamlede bir odaya geçebiliyorsanız “0” , Tek hamlede geçiş yapamıyorsanız  “-1” , Şayet tek hamlede geçiş yaptığınız  oda hedef odanız ise “100” olarak değer atıyorsunuz. Yine aynı şekilde içerisinde bulunduğunuz odanın başlangıç değeri “-1” olmalı.Burada bulunan 100 değerini ödül olarak , -1’i ise ceza olarak düşünebiliriz. Şimdi her oda için bu durumu inceleyelim.

1.Oda Başlangıç Odamız için -> 2 ve 3.odaya tek hamlede geçebiliyoruz fakat diğer odalara tek hamlede geçişimiz mevcut olarak. Bunu yukarıda ki bulunan formata uyarlayacak olursak ;

-1,0,0,-1,-1,-1,-1

1.Oda için formatı anlatıp , kafanızda ki soru işaretlerini oturtmaya çalışacağım. -1 ile başladık çünkü kendi odamız içerisindeyiz , daha sonra 2. ve 3. oda için 1.odanın durumuna baktık , tek hamlede geçiş yapabildiğimiz için bunlara 0 değerini atadık. Diğer odalara erişim sağlayamadığımız için -1 değerlerini atadık.

Şimdi 6.oda için inceleyelim-> Sadece 5 ve 7. odalara tek hamlede erişim sağlayabiliyoruz. Ve erişim sağladığımız 7.oda bizim için hedef odamız. Bu yüzden ödül değeri olarak 100 veriyoruz. Formatımız ise şu halini alıyor bu odamız için.

-1,-1,-1,-1,0,-1,100

Her bir oda için bu şekilde bir format hazırlayıp bir araya getirdiğimizde ortaya çok boyutlu bir ödül matrisi  çıkıyor. Bunu R(Reward-ödül) matrisi olarak isimlendirmişler.

int R[7][7]=
{
{-1,0,0,-1,-1,-1,-1},
{0,-1,-1,0,-1,-1,-1},
{0,-1,-1,0,-1,-1,100},
{-1,0,0,-1,0,-1,-1},
{-1,-1,-1,0,-1,0,-1},
{-1,-1,-1,-1,0,-1,100},
{-1,-1,-1,-1,-1,-1,-1}
};

Bir de Q(state-durum) matrisi var. Bu matris ödül matrisinin içinin boşaltılmış hali. Ödül matrisi kullanarak yapacağımız iterasyonlar sonucunda bu matrisi güncelleyeceğiz.

int Q [7][7] =
{
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0}
};

Peki biz güncellediğimiz sonuçta neyi elde etmeyi hedefliyoruz derseniz , Biz bu oda ilişkilerini girdi olarak verdiğimiz sistemin en kısa yolu öğrenmesini bekliyoruz. Yukarıda ki görselleri incelerseniz en kısa yol 1->3->7 şeklinde. Fakat henüz sistemimiz bunu bilmiyor.

İlerde kullanacağımız çeşitli değişken atamalarını yapıyoruz.

int odalar[7]={2,5,3,6,7,8,4};
int AnlikOda=0;
int HedefOda=6;
int hareket=0;
int RandomSayi=0;
int MaksimumSayi=0;
int n=0;
int test_index=0;
int sonuc;

Yukarda bulunan odalar isimli dizi , odaları görselleştirmek amacıyla bağladığımız ledlerin arduino için yapılan bağlantısını bize veriyor. Burada dikkat etmekte fayda var , Örnek vermek gerekirse , 1.oda ->2.pin , 2.oda ->5.pin , 3.oda ->6.pin şeklinde bir bağlantı var. Bu bağlantıları istediğiniz gibi yapmakta özgürsünüz elbette. Fakat bunları dizi içerisinde kullanarak odaların isimlerinin sıralamasında gitmeniz fayda var.

Gelelim iterasyonları yaptığımız kısma , burada random olarak bir sayı elde ediyoruz ve Hedef odaya ulaşılana kadar R matrisini kullanarak Q matrisini güncelliyoruz. güncellenen bu değerleri hesaplamak için Bellman denkleminden  faydalanıyoruz. Burada hareket matrisi de ulaşturabildik bilinçi bir deneme yapabilmesi açısından fakat bunu da random olarak denemesini istiyoruz.

1_uPpNMF62YC9IPKq7U5m45Q

Bu denklem bize şunu söylemeye çalışıyor , şu an için bulunduğumuz durumun içerisinde rastgele yapacağımız hamlenin ödülünü ve  gelecekte ki hamle ile varacağımız bir durumun bize vereceği en yüksek ödülün gama değeri ile çarptıktan sonra yapılan toplam bizim Q matrisimizi güncellememizi sağlıyor olacak. Gama değeri 0 ve 1 arasında seçilebilen bir değer. Ve uygulama içerisinde 0.8 olarak kullanacağız.

 

while(n<6)
{
while(AnlikOda != HedefOda)
{

oda_test(AnlikOda);
RandomSayi=random(0,7);
while(R[AnlikOda][RandomSayi]<0){
RandomSayi=random(0,7);
}
hareket=RandomSayi;
MaksimumSayi=Q[hareket][0];
for(int i=1; i<7; i++)
{
if(Q[hareket][i]>MaksimumSayi)
{
MaksimumSayi=Q[hareket][i]; }
}
Q[AnlikOda][hareket]=R[AnlikOda][hareket]+0.8*MaksimumSayi;

AnlikOda=hareket;
delay(400);
}
n++;
AnlikOda=0;

}

Yazılımın devamına github üzerinden ulaşabilirsiniz.

Şimdi güncellenen Q matrisini inceleyelim. Başlangıç odamız 1.oda ve bu oda içerisinde ki ödül değeri en yüksek olan değer 80 yani 3.odayı işaret ediyor. 3.odaya gittiğimizde

64 0 0 64 0 0 100 değerleri mevcut. 3.oda içerisinde en yüksek değeri 7.oda almış durumda ve hedefimize ulaşıyoruz. Kısaca makineye verdiğimiz odalar arası ilişki değerlerinden Ana Odadan başladıktan hedefe varmak için en kısa yol 1->3->7 şeklinde olduğunu bize gösteriyor.

Capture

Yeni yazıda görüşmek üzere , afiyet olsun 🙂

Kanalımdan bir video;