11 Aralık 2013 Çarşamba

Q-learning

Bu yazıyla, oldukça keyifli bir konu olan makine öğrenimi'ne giriş yapmış olacağız. Bu yüzden asıl konuya geçmeden önce, size makine öğrenimi hakkında ufak birkaç bilgi vermek istiyorum.

Makine öğrenimi, günümüzde birçok uygulama alanı olan bir bilim dalı. Adından da anlaşılacağı gibi bilgisayara birşeyleri öğretmeyi ve bu öğrendiklerini insan yararına kullandırtmayı amaçlayan çalışmalar yapıyor bu alan. Peki öğrenme derken ne demek istiyorum ? Bir bilgisayar nasıl öğrenir ?

Bunun çok çeşitli yolları var, hepsini burada anlatmayacağım ama bizim kullanacağımız reinforcement learning(pekiştirici öğrenme) denilen öğrenmenin mantığı şu, bilgisayar belirli veya rastgele bir hamle ile ilk denemesini yapar, bazı sonuçlar elde eder. Bu sonuçlardan yararlanarak kendini düzenler ve sonraki adımda daha iyi davranış sergiler, bu adımlar bir döngü şeklinde devam eder. Zor gibi görünmesine rağmen aslında o kadar da zor değil bunu yapmak.

Öğrenme algoritmalarının belki de en basiti olan Qlearning ile başlıyoruz. Qlearning tamamen rastgele davranışlar ve deneme yanılmaya dayalı bir algoritma. Programımız önce, belirli sayıda rastgele girişimlerde bulunur. Bu girişimler sonucunda hangi durumda ne yapması gerektiği konusunda bir tablo oluşturur. Öğrenme kısmı bu kısımdır. Bunları yaptıktan sonra da istediğiniz bir başlangıç koşulu verdiğinizde, öğrendiği tabloya göre hareket eder ve sorunu çözer.

Bu konuyu anlatmak için aklıma gelen en iyi örnek, programımıza bir evden dışarı çıkmayı öğretmek oldu. 5 odalı bir evimiz var ve evin kuş bakışı planı kabaca şu şekilde.




6 tane alanı 0 dan başlayarak numaralandırdım. 5 numaralı alan da evin dışı, yani hedefimiz. Şimdi bu ev planına göre, her odada yapabileceği hamlelere göre bir tablo oluşturmamız gerek.

alan0 -> alan2, alan3
alan1 -> alan4, alan5
alan2 -> alan0, alan3
alan3 -> alan0, alan2, alan4
alan4 -> alan1, alan3
alan5 -> alan1

Bu tabloyu dizi haline çevirirsek,

hamleler = [ [2, 3], [4, 5], [0, 3], [0, 2, 4], [1, 3], [1] ]

Hamle tablomuzu elde ettik. Şimdi bir de ödül tablosu oluşturmamız gerek. Ödül tablosunda her durumdaki hamleler için puanlar olacak. Biz programı sonuca ulaştıran hamle veya hamlelere yüksek bir puan koyacağız, yapabileceği diğer hamleler 0 puan olacak.




Bu ödül tablosunu yukarıdaki şema gibi düşünebilirsiniz. Hedefimiz 5. duruma ulaşmak ve gördüğünüz gibi sadece 1. durumdan 5. duruma geçişte program problem çözüme ulaşıyor. Diğer geçişler ise başlangıçta etkisiz. Tabloyu oluşturuyorum, aralarında bağlantı olmayan durumlardaki hamleler için, -1 kullanacağım.

ödül_alan0 -> [ -1, -1, 0, 0, -1, -1 ]
ödül_alan1 -> [ -1, -1, -1, -1, 0, 100 ]
ödül_alan2 -> [ 0, -1, -1, 0, -1, -1 ]
ödül_alan3 -> [ 0, -1, 0, -1, 0, -1 ]
ödül_alan4 -> [ -1, 0, -1, 0, -1, -1 ]
ödül_alan5 -> [ -1, 0, -1, -1, -1, -1 ]

ödüller = [ödül_alan0, ödül_alan1, ödül_alan2, ödül_alan3, ödül_alan4, ödül_alan5]

Ödüller adındaki 2 boyutlu matrisimizi de elde etmiş olduk. Bu noktadan sonra öğrenme matrisi olan Q matrisini oluşturmaya başlayacağız. Yani burası programın öğrenmeye başladığı bölüm. Program rastgele seçimlerle ilerleyerek, tecrübelerinden birşeyler öğrenecek. Bunu yapmak için bir formül kullanıyoruz.


Burada yeni bir terim giriyor işin içine. Gamma denilen öğrenme katsayısı. Gamma  0 ile 1 arasında bir sayı ve büyük olması,  gelecek durumda alacağı ödüllere önem vermesini sağlarken, küçük olması, o anda yapmak istediği hamlenin ödülünü öne çıkarıyor. Formülde, şu an bulunduğumuz durumun içindeki, rastgele yapacağımız hamlenin ödülünü, ödül tablosundan alıyoruz, sonra Q matrisinde, bu hamleyle gideceğimiz sonraki durumdaki en büyük Q puanını alıp, gamma ile çarpıyoruz. En sonunda bu ikisini toplayıp, Q matrisinin bulunduğumuz durumda ve yapacağımız hamledeki yerine koyuyoruz.

Programın ilk kısmını yukarıdaki matrisler oluşturuyor. Onları kod haline getirdikten ve durum x durum(6x6) boyutundaki Q matrisini 0 lardan oluşturduktan sonra 2. kısım olan öğrenme kısmını yazmaya başlayabiliriz. Bu kısımda yapacağımız şey, özet olarak, programın kaç deneme turu yapacağını belirleyeceğiz, sonra her tur için programı belli bir durumdan başlatıp, rastgele adımlarla sona kadar gelmesini sağlarken, yukarıdaki formülü kullanarak, bu tecrübeden öğrenmesini sağlayacağız.

Pseudocode:

gamma = 0.7
tur_sayısı = 5

0 dan tur_sayısı'na kadar her tur için:
    durum = 2
    durum 5'e eşit olmadığı sürece:
        hamle = rastgele_seç(hamleler[durum])
        sonraki_durum = hamle
        Qmax = max(Q[sonraki_durum])
        Q[durum][hamle] = ödüller[durum][hamle] + gamma*Qmax
        durum = sonraki_durum


Öğrenme kısmı bu kadar. Gamma'yı ve tur sayısını kafama göre belirledim. Başlangıç konumunu da en uca, 2. alana koydum, mümkün olduğu kadar fazla odadan geçsin diye. Problem zorlaştıkça tur sayısı artacaktır, ama 5 tur bu problem için yeterli gibi geldi bana.

Bu kısmı da yazıp programı çalıştırırsanız, bir Q matrisi elde edeceksiniz. Şimdi gelelim bu Q matrisi ile problemi nasıl çözeceğimize. Aslında çok basit. Programımızı bir odadan başlatacağız ve bir sonraki yapacağımız hamle için, Q matrisinde bulunduğumuz durumda en yüksek puanı almış hamleyi seçeceğiz.

Pseudocode:

fonksiyon çöz(başlangıç):
    durum = başlangıç
    durum 5'e eşit olmadığı sürece:                         
        durum = Q[durum].index( max(Q[durum]) ) //Q matrisinde, şu an bulunduğumuz 
        yazdır durum                                                 //durumdaki en yüksek puanın yeri                                                       


İşte bu kadar. Programımızı öğrenim sürecinden geçirdikten sonra, bu fonksiyonu kullanarak istediğimiz odadan başlatıp, evin dışına en kısa yoldan çıktığını görebiliriz artık. 

Algoritmayı iyi kavradıysanız, buna benzer problemler yaratıp, programınıza çözüme ulaşmayı öğretebilirsiniz. Programın, öğrenme kısmında sergilediği davranışları görselleştirmeniz işi daha da ilgi çekici hale getirecektir. Kapanışı da, bu son söylediklerim hakkında size fikirler verebilecek bir video ile yapıyorum. Daha ileri seviye uygulamalar da var, YouTube'dan izleyebileceğiniz. İlgileniyorsanız kolayca bulabilirsiniz. Merak ettiğiniz kısımlarda bana da danışabilirsiniz, her zaman.

Güzel bir gün geçirmeniz dileğiyle...





Hiç yorum yok:

Yorum Gönder