Wednesday, September 20, 2017

Surucusuz Arabalar, Derin Ogrenme

Derin yapay sinir aglari her turlu fonksiyonu temsil edebilirse, ve araba kullanirken insanlarin karar mekanizmasi da boyle bir fonksiyonsa, bir DYSA bu hesap mekanizmasini ornek veriye bakarak bulamaz mi? Egitim verisi yol goruntusu, etiket pedal, direksiyon kontrolu olur, DYSA egitiriz, abrakadabra araba otomatik olarak kullanilmaya baslanir. Surada comma.ai diye bir sirketin kurucusu bu tur bir seyden bahsediyor, genc heyecanli bir arkadas ama buyuk bir ihtimalle yanlis yolda.

Suradaki makale de yanlisligin nerede oldugunu soyluyor. Goruntu ile direksiyon arasinda birebir iliski yok. Bunu tespit ettigimiz anda zaten DYSA'nin niye bu sekilde kullanilamayacagini anliyoruz. YSA fonksiyonlari yaklasik temsil eder demistik. Foksiyon nedir? Matematigin temeli sayi teorisi, sayi teorisinin temeli kume teorisi ise, fonksiyonlarin kumelere dayali tarifini hatirlamak iyi olur, fonksiyon kumeler arasinda coka-bir (many-to-one), ya da bire-bire (one-to-one) esleme yapan bir seydir. Fakat goruntu / direksiyon eslemesi bu tanima uymuyor. Diyelim bir yonu uc seritli olan yolda orta seritte gidiyorum, onumde bir araba var. Bu arabayi soldan gecebilirim, sagdan gecebilirim, yani ayni goruntu iki farkli direksiyon kontrolune eslesmis olur. Egitim verisinde bu tur durumlar muhakkak olacaktir ve DYSA buradan optimal bir sinir agi cikartamayabilir. Daha basit bir ornek, f(x,y)=x+y fonksiyonu, f(3,2)=5 olabilir, f(4,1)=5 olabilir (coka-bir) fakat f(4,1) bazen 5 bazen 15 olamaz. Fakat yine de yeterince veriyle pek cok sartta isleyen bir YSA egitebilirsiniz muhakkak, ama ortaya cikan surucusuz araba ne kadar optimal isler, her turlu ortamda ne kadar guvenilir olur?

Paylastigimiz makale farkli bir secenek veriyor. Yol goruntusunu (input image) kontrol mekanizmasi (driving control) ile degil, arabanin diger arabalara olan mesafesiyle (direct perception) ile esliyorlar. Bu veri farkli sekillerde gelmesi daha zor olan bir veri, birebir esleme olusturmak icin daha uygun. 


Monday, September 18, 2017

Yapay Ogrenme, Danismanlik

Google bugunlerde hizli bir sekilde danismanlik tarafini gelistiriyor, G. teknolojilerini kullanan danismanlar, aynen IT durumunda oldugu gibi, sirketlere gidip YO servisleri sunuyorlar, bu is daha da gelisecek. Google bilindigi gibi derin ogrenme problemlerini cozmek icin TensorFlow'u gelistirdi, bu urun acik yazilim, boylece gelistirici kendini bir sirkete  "baglanmis" hissetmiyor, istedigi zaman kendisi istedigi sekilde kodunu isletebilir, ama Google TF kodlarini paralel, buyuk olcekte isletmek icin bulut servisi hazirlamis, bu sekilde musteri cekiyor. TF kodunu buluta verin, gerekirse 1000 makina uzerinde isletsin. Google TF icin ozel bir cip bile gelistirdi, CPU yerine TPU (tensor processing unit). Bu cipler su anda kendi bulut servisi makinalarinda, ama Android telefonlarinda da gorulmeye baslanir yakinda.

Google danismanlik servislerinde neredeyse her YO problemi icin derin ogrenme kullaniliyor bu arada (SVM, karar agaci vs modasi gecti), optimizasyon gerekirse takviyeli ogrenme (DO bu yaklasimlarin bir parcasi), zaman serileri (siniflama, gelecek tahmini -regresyon-) icin LSTM, ki bu da geriye yayilma (backprop) ile egitilen bir tur yapay sinir agi yaklasimi, ve derin sekilde genisletmek mumkun.

Peki YO sirketlerin ne isine yarar? Yapay sinir aglari bilindigi evrensel yaklasiklayici (universal approximator), herhangi bir foksiyon f(\theta)'yi sadece girdi ve ciktilarina bakarak yaklasik sekilde temsil edebiliyor. Bir anlamda geriye muhendislik yapiyor. Ek olarak derin ogrenme ile ne kadar cok cok veri varsa bu geriye muhendislik o kadar iyi oluyor. 

Tipik bir sirketin her tarafi fonksiyonlarla dolu; mesela "musterilerim sadik degil vs sayida musteri beni her ay terkediyor". Burada bir fonksiyon var, musteri kisisel, aksiyon verisini gir, fonksiyon "terkedecek" diye evet / hayir olasiligi versin. Bu fonksiyon tabii ki bilinmiyor, eger sosyoloji, psikoloij alaninda uzman matematiksel modelciye sorsak, belki bu f(\theta)'yi bulurlar, ama o kadar modelci bulunamaz, zaten bilim o kadar ilerlememis olabilir. Daha hizli sonuc  girdi / ciktilari verip geriye muhendislik, YSA ile f'i bulmak (musteri sadakati icin su arkadas aynen bunu yapmis). Yaklasim ayrica esnek, musteri sadakati f bulmak icin kullanilan benzer metot, is makinasinin ne zaman bozulacagini veren g hesabi icin de kullanilabilir.

Eger f bilinirse sadik olmayacak musteri onceden tahmin edilebilir, onlara donuk kampanya yapilir, o musteri kaybedilmemis olur. 

Yani YO danismanliginin gelecegi cok iyi. Su siralar TensorFlow bilen YO programcilari icin yogun talep var. O zaman tavsiye 1) Python ogrenmeli, hesapsal programlar, veri bilim icin unlu (Matlab'in isi bitti, zaten ticari, gelistiriciler icin bu kisitlayici bir faktor ve o yuzden sevilmiyor ) 2) TensorFlow ile yapay ogrenme saglikli bir sekilde buyuyor.

Su an pur IT danismanligi veren sirketler, YO muhendisleri ile servis yelpazelerini genisletebilirler. Programcilar TensorFlow ile bilgi dagarcigini gelistirebilir.

Not: NVidia GPU kartlari uzerinden derin ogrenmeye bir giris yapmisti, ve gelistiricileri kendine cekme alaninda etkili olmaya cabaliyor, fakat buyuk bir ihtimalle Amazon, Google onlari golgede birakacak. NVidia'nin bulut servisleri yok, sadece grafik karti donanimi ile bilinen bir sirket. Derin YSA altyapi / kodlama ortami secimi onemli cunku hem saglam hem yaygin teknolojiyi kullanmak o teknolojiyi bilen programci bulabilmek, o programcinin is bulabilmesi, programci sorun yasadiginda forumlarda sorusuna cevap verecek kisilerin mevcudiyeti, egitim materyellerinin yayginligina kadar her seye etki ediyor.

Wednesday, September 13, 2017

OpenAI Gym, Pong, Derin Takviyeli Ogrenme (Deep Reinforcement Learning)

Otomatik oyun oynamak ve alakali diger problemler icin son zamanlarda yapay zeka'nin alt dallarindan takviyeli ogrenme (reinforcement learning) revacta. Go sampiyonunu yenen Google Deepmind algoritmasi bir TO yaklasimi kullandi. TO ile algoritma bir oyundan gelen sadece ham pikselleri kullanarak oyunu kendi basina oynamayi ogrenebiliyor. En son oturumda kazanip kaybedildigi bir ceza ya da mukafat skoru ile algoritmaya bildirilir tabii, ve yuzlerce otomatik oyun sonrasi program oynamayi ogrenir.

Takviyeli ogrenim is dunyasi icin faydali olabilir, YZ etrafinda danismanlik servisi veren sirketler eskiden endustriyel muhendisligin semsiyesi altina dusen ve simplex, lineer programlama ile cozulen problemleri TO ile cozmeye basladilar. TO ile bir ilke gradyani (policy gradient) hazirlanir, ilkeler her adimda atilabilecek adimlari tanimlarlar; bir fabrikada bir aletin uzerindeki ayarlar, ya da hangi kaynaklara oncelik verilmesi gerektigi (hangi gun, kac isci, vs), bir anlamda bu ilkelerden gelebilecek aksiyonlar olarak gorulebilir, ve TO en "basarili" olacak ayarlari ogrenebilir.

Oyunlara donelim, simulasyon ortamlarindan OpenAI Gym uzerinden

sudo pip install  gym[atari]

ile unlu oyun Pong ortami kurulur. Oyundan gelen pikseller matris olarak arayuzden alinabiliyor. Alttaki ornekte Pong baslatiyoruz, alinan her kareyi bir imaj png dosyasina yaziyoruz, bu arada rasgele hareketle yapiyoruz, kayip ya da basari var ise donguden cikiyoruz. Her step cagrisi bizim attigimiz bir adimi oyuna bildiriyor, bilgisayar karsilik veriyor, ve oyunun son hali bize step donus parametreleri ile bildiriliyor. Bizim step ile kontrol ettigimiz sagdaki raket, bilgisayar soldakini kontrol ediyor. Pong'u fazla anlatmaya gerek yok herhalde, basit bir oyun, raketler yukari ya da asagi gidiyor, step ile verdigimiz hareket parametresi 0,1 etkisiz, 2,4 yukari, 3,5 asagi demek.

import gym, random, time
import pandas as pd
import numpy as np
from PIL import Image

env = gym.make("Pong-v0")
n_outputs = env.action_space.n
print 'kac hereket', n_outputs
env.reset()

# ilk kismi atla
for i in range(20): obs, reward, done, info = env.step(0)

while True:
    obs, reward, done, info = env.step(random.choice([0,1,2,3,4,5]))
    if np.abs(reward) > 0.0: break
    im = Image.fromarray(obs)
    im.save('out.png')
    time.sleep(0.4) # zaman arasi

Imaj kaydi yerine direk ekranda gostermek icin env.render() cagrisi da yapilabilir.


TO baglaminda ogrenim rutini ustteki donguyu yuzlerce, binlerce kez isletebilir, her oturum sonundaki basari / kayip ilke gradyani ile guncelleme icin kullanilir.

Detaylar icin su blog guzel.

Alinan imaj uzerinde bazi onislemler mumkun, mesela en ustteki skor bolumu oyun icin gerekli mi? Bunlar kirpilabilir. Ayrica renk gerekli olmayabilir, 3 renk kanali 1 kanala iner. Kucultme yapilarak 210x160 boyutu mesela 80x80'e indirilebilir. Bir diger onislem su: Karpathy (ustteki baglanti) ardi ardina gelen iki oyun karesinin farkini aliyor, boylece hareket bilgisini yakalamak istemis herhalde. Alternatif bir yaklasim Stanford Universite'sindeki RL dersinin yaklasimi, bu arkadaslar ardi ardina 4 karenin uzerinden bir maxpool hesabi yapiyorlar, yani 4 karede birbirine tekabul eden piksellerden en yuksek degeri olan nihai sonuca aliniyor. Boylece 4 kare 1 kareye indirgeniyor, bu hem hareketi verir, hem de egitim algoritmasinin 4 kat daha hizli islemesini saglar (kod yazinin altinda)


Kontrol Problemleri

Gym sadece gorsel ciktiyla sinirli degil, mesela sadece alttan tutarak dik tutmaya ugrastigimiz bir cubugu dusunelim, bunu belki cocukken yapmisizdir, agir olan dik bir cismi parmak uzerinde tutmaya ugrasmak. Tabii saga sola giderek dengelemeye ugrasilir, oldukca zor bir istir, vs. Gym icinde bu ortam da var,

import gym, time
import numpy as np

env = gym.make("CartPole-v0")
env.reset()
obs, reward, done, info = env.step(0)
print obs
print obs.shape
env.render()

deyince alttaki resim cikar,

Fakat aslinda step cagrilari bize Pong'da oldugu gibi resim degil, cubuk hakkinda 4 tane parametre donduruyor, render cagrisi bu parametreleri kullanarak bir temsili resim ortaya cikartmis. Ustteki durum icin parametreler

[ 0.02585672 -0.17299761  0.030009    0.29081285]

Parametrelerin ne oldugunun detayi surada. Soldan 3. cubugun durus acisi, -45 ile +45 arasinda, arti acilar saga dogru yatik demek, eksiler sola dogru. 

Eger cubugu dengede tutmayi ogrenmek istersek step ile alt kismi saga ya da sola kaydirabiliriz, cubuk sola dusecek gibi olsa mesela sola gidip dengeyi tekrar bulmaya ugrasiriz, vs. Sistem bize hangi durumda oldugunu ustteki 4 sayiyla soyler. Bu yeterli, Pong ile oldugu gibi tum ekrani gormemize gerek yok. Mukafat (ya da ceza) basarili gecen her adim icin verilir, oyun eger cubuk belli bir acidan fazla yatiksa biter, o zaman cubuk "dusmus" demektir. Ekran disina cikmak ayni sekilde oyunu bitirir.

CartPole kontrol problemlerini anlamak acisindan faydali bir ornek.  Kontrol Muhendisligi'nde bu tur durumlar yogun sekilde gorulur. 

Ekler

Pong icin tarif edilen her 4 karede bir imaj veren max pool kodu

import gym

from collections import deque

def greyscale(state):
    state = np.reshape(state, [210, 160, 3]).astype(np.float32)
    state = state[:, :, 0] * 0.299 + state[:, :, 1] * 0.587 + state[:, :, 2] * 0.114
    state = state[35:195]  # crop
    state = state[::2,::2] # downsample by factor of 2
    state = state[:, :, np.newaxis]
    return state.astype(np.uint8)

class MaxAndSkipEnv(gym.Wrapper):
    def __init__(self, env=None, skip=4):
        super(MaxAndSkipEnv, self).__init__(env)
        self._obs_buffer = deque(maxlen=2)
        self._skip       = skip

    def _step(self, action):
        total_reward = 0.0
        done = None
        for _ in range(self._skip):
            obs, reward, done, info = self.env.step(action)
            self._obs_buffer.append(obs)
            total_reward += reward
            if done:
                break

        max_frame = np.max(np.stack(self._obs_buffer), axis=0)
max_frame = greyscale(max_frame)
        return max_frame, total_reward, done, info

    def _reset(self):
        self._obs_buffer.clear()
        obs = self.env.reset()
        self._obs_buffer.append(obs)
        return obs

Kullanmak icin tek bir imaj basalim

from PIL import Image

env = gym.make("Pong-v0")
m = MaxAndSkipEnv(env)
m._reset()
for i in range(20): obs, reward, done, info = env.step(0)
max_frame, total_reward, done, info = m._step(0)
im = Image.fromarray(max_frame[:,:,0], 'L')
im.save('out.png')

Wednesday, September 6, 2017

Meteoroloji Verileri - ECMWF, NOAA

Hava verisi uzerinde yapay ogrenim ile tahminler yapmak isteyenler ham veriyi almak icin alttaki siteye basvurabilir.

https://www.ecmwf.int/

Bu bir Avrupa bilim organizasyonu, ayrica hava tahmini modellerini isletip tahmin de uretiyorlar (Harvey kasirgasinin nereye vuracagini ABD NOAA'dan daha iyi tahmin ettiler). Python ile veri indirmek mumkun, 

sudo pip install ecmwf-api-client

Burada "Register" ile kullanici bilgileri, email, vs. verilip kaydolunur. Bir aktivasyon email'i sonra bir tane daha email geliyor, ve kayit bitiyor.  Login yapilir. Simdi API'ye erismek icin anahtar lazim,


Burada gosterilen 

{
    "url"   : "https://api.ecmwf.int/v1",
    "key"   : "[ANAHTAR]",
    "email" : "[email]"
}

formundaki anahtar $HOME/.ecmwfapirc dosyasina yazilir. 

Verilere erismeden once veri turune gore bazi lisans sayfalarinda bir lisans kabuluna "evet" demek gerekiyor, mesela alttaki tur bir script icin

from ecmwfapi import ECMWFDataServer
   
server = ECMWFDataServer()
   
server.retrieve({
    'dataset' : "tigge",
    'step'    : "24/to/120/by/24",
    'number'  : "all",
    'levtype' : "sl",
    'date'    : "20071001/to/20071003",
    'time'    : "00/12",
    'origin'  : "all",
    'type'    : "pf",
    'param'   : "tp",
    'area'    : "70/-130/30/-60",
    'grid'    : "2/2",
    'target'  : "data.grib"
    })

Su lisansa


evet demis olmak lazim. Bir tane daha


Eger lisans kabul edilmemisse hata mesaji hangi sayfaya gidilecegini soyler.

NOAA

https://www.ncdc.noaa.gov/orders/qclcd/

adresinde gunluk dosyalar var.

Yapay Ogrenim

Hava tahmini icin gunluk (saatlik, vs) hava verisi cok boyutlu bir zaman serisi olarak gorulebilir, mesela her t aninda sicaklik, nem, ruzgar hizi cok boyutlu bir zaman serisi olarak geliyor, egitim icin N tane gorulen veri kullanilir, bu veri N+1, N+2, . anlarindaki gelecek zaman serisini tahmin icin kullanilir. Bu sekilde hava tahmininin ornegi alttaki kodlarda bulunabilir,

https://github.com/mouradmourafiq/tensorflow-lstm-regression/blob/master/lstm_weather.ipynb