Pazar, Ekim 25, 2015

Derin Öğrenme 1

Yapay Zeka ile ilgili konuları takip ediyorsanız, muhakak rastlamışsınızdır. Bu günlerin moda kavramı derin öğrenme - Deep Learning -  Gün geçmiyorki filan konuda, falan konuda  derin öğrenme uygulandı şöyle başarılıydı böyle başarılıydı haberleri duymayalım.  Dünayanın en büyük en parlak şirketleri ekipler kurup bu konu üzerinde  çalışıyorlar.  Dünyanın en iyi üniversitelerinde araştırma gurupları var.



Kısaca derin örğenme tarafına doğru güçlü bir rüzgar var. Bütün bunlar yapay zekanın bütün hedeflerine derin öğrenme ile ha ulaştık ha ulaşacağız hissiyatı veriliyor. Doğrudan konu hakkında konuşmadan önce giriş niteliğinde temel bazı konulardan bahsetmek istiyorum.

Bilim ve teknolojinin de bir tarihi var. Bilim ve Teknolojik gelişmelerde yıllara göre ilerlemeler görünür.



Bilim ve teknolojide gelişmeler her zaman aynı hızda gitmez. Aslında coğu zaman ortalama  bir hızda gelişmeler olur. Ama bazen bir buluş bir yenilik ile gelişme hızı eski hızına göre yıllar sürecek seviyeye bir kaç ayda ulaşılır.  Böyle parlak yenilikler pek çok  insanın gözlerini kamaştırır.  Olmadık beklentilere girilir.  Bir örnek verelim.  Günümüz yapay zeka çalışmalarına 1956  yılında 1 başlandı. Gelişmelerin gidişatından, 1960'lı yılllarda  "Bilgisayarlar  on yıl içinde insanlar kadar akıllı olacaklar " diyenler çıktı.  Ne mutluki !  yıllar  geçmesine rağmen ortada böyle bir gelişme olmadı.  :)


 Keza gelişmeler her zaman aynı yönde de olmadı. Mesela kütüphanemdeki en eski Yapay Zeka kitabının 2 tarihi 1991 ve içindeki konular Mantıklsal akıl yürütme, Doğal Dil İşleme, Uzman Sistemler, Robot bilim şeklinde sıralanıyordu. Güncel bir kitabın çok değişik konulardan bahsedeceği barizdir.  Yani bazı zamanlarda bazı alanlar çok öne çıkıyor, pek çok insan bu alanda çalışıyor. Sonra bir başka alanda bir gelişme oluyor, ve o alanda çalışmalar çoğalıyor.




Yukardaki grafikdeki gibi A ve D diye iki metod bulunmuş. A metodu gelişerek A1 ve A2 diye geçerliliğini korumuş. D metodu D1 ve D2 diye gelişmiş ama. İlk etapta gelişme olmamış hatta D1 hali hazırda terk edilmiş. D2 metodundan  uzun  zaman sonra  D21 , D22, D23 metodları geliştirilmiş halen güncelliğini koruyor. Grafik ve isimler farazide olsa Bilmin pek çok alanında ve elbetteki Yapay zeka araştırmalrında benzeri durumlar olmaktadır.

Bütün bunlardan anlamamız gereken şeyler nelerdir.

  • Gelişmelerde devrim niteliğinde ilerlemelere vesile olan modelleri takip etmemiz, öğrenip uygulayabilmemiz lazım ki geri kalmış olmayalım.
  • Bahsettiğimiz modele mucizevi bir hayranlıkla bağlanıp kalmamalıyızki. Bir başka metod çıkış yaptığında afallayıp kalmayalım. Çünkü yeni bir metdo bulabilmek, hali hazırdakinin eksikliklerini görebilmekle başlar....
Gelişme ve gelişmeye vesile olacak metod nasıl belirlenebilir.  Bunun en bariz yolu daha iyi olduğunu göstermekden geçer. Mesela bir motor için geliştirilecek metod eğer daha az yakıt ile daha çok güç üretiyorsa. Bir motor yaparsınız ve ispatlarsınız. Yapay Zeka çok daha geniş ve muğlak bir alan. Nihayi hedef olaran belirlenmiş bir "Turing Testi" olsada bunun pratik ölçümü pek mümkün değil. Bu durumda yapay zeka çalışmalarının çok önemli ve çok pratik bir kısmı olan  yapay öğrenme üzerinden metodların yarıştırılması mümkün olabiliyor.

Yapay Öğrenmede, motodların performanslarını ölçmek için veri setleri oluşturulmuştur. Yapay öğrenmede hali hazırda  pek çok metod vardır. Metodlardaki gelişme bu listelerde daha iyi - kesinlik anlamında - sonuçlarla ispatlanmaktadır. Derin öğrenme metodlarının uygulandığı sonuçlar günümüzde bu listelerin üst sıralarını oluşturmaktadır.

Yapay Öğrenmede pek çok metod var dedik. Peki metodlar arasında nasıl seçim yapabiliriz. Biraz da bu işin temellerine bakalım.

Mühedislikte tek önemli olan şey kesinlik değildir. Şöyle örnekleyelim ; Bir uygulama yazmaya çalıştığımızı düşünün.  Bölme işleminde virgülden sonra 1000 basamak hesaplayan bir metodun kesinliği virgülden sonra 3 basamak hesaplayana göre daha iyidir. Lakin pek çok iş için  3 basamaklık bir hassasiyet yeterlidir.

Bir başka konuda uygulamanın alanı ve ortaya çıkan verinin yapısıdır. Her meotod her çeşit veriye uygulanamayabilir.  Uygulamanın gerektirdiği kısıtlamalar olabilir. Mesela her metodun ortak bir noktası olan eğitim aşamasının hızı,  Uygulamanın anlık eğitime ihtiyaç duyması ile bazı metodların eğitim aşamasının çok uzun olması sebebiyle kullanışsız olabilir.

  • Yabancı dildeki şöyle tabirler var.  "No Silver Bullet" ve "No free lunch" . İşin özü  "armut piş ağzıma düş" durumu  hiç bir yerde olmadığı gibi Yapay öğrenmede de yoktur.  "Falan  diye bir metod  çıkmış  her şey bunu kullanmak lazımdır " anlayışı yanlışdır.

Genel olarak şunu söylemek isterim. Bir uygulamada sayılsal 3 ve algoritmik  bir çözüm varsa hesaplama süresi çok uzun değilse onu kullanın.  Bu mümkün değilse Uygulamanızın şartlarına göre  olan bir araştırma yapın seçiminiz ona göre yapın.

Yazıda epey uzamış sizleri daha fazla sıkmak istemiyorum. Bu kadar temel girizgah  Derin öğrenme konusuna daha akılcı bakmanızı sağlayacağını umarak. Derin öğrenme konusundaki aşağıdaki videoya bakmanızı  önereceğim. Bu video Ankarada  Derin Öğrenme Etkinliği ndeki   Ferhat Kurt tarafından yapılan konuşmadır.



Daha yeni başladık :) devam edecek...

Not :
1)  Aslında çalışmalar daha önceden başlansada  Yapay Zeka  adı bu yılda toplanınan bir kongrede verildi.

2)  Kitap İletişim yayınlarından - cep üniversitesi serisinden- çıkmış ve 1991 yılında okumuşum hey gidi günler hey...

3) Numerical Analysis , Türkçede Sayısal Çözümleme diye geçiyor.



Pazartesi, Ekim 19, 2015

DLL Cehennemi

DLL ingilizce  "Dynamic Link Library" teriminin baş harlerinden oluşur. Windows işletim sisteminde. Dinamik kullanılan kütüphane dosyaları için oluşturulmuş bir dosya formatıdır. Bu tip kütüphaneler çalışma zamanında hafızaya yüklenip gereken kısımlar çağrılarak çalıştırılır.

Bilgisayar dünyasında pek çok dil var. Her biri için birden fazla değişik derleyicilere sahip. Her ne kadar belli kuralları da olsa bu çeşitlilik pek çok zaman probleme sebep olmaktadır.  Hatta tecrübeyle sabittir ki aynı dilde aynı derleyicinin değişik versiyonları arasında bile problemler görülebilmektedir.

Yazımızın başlığı DLL Cehennemi terminolojiye de girmiştir. DLL Hell . Bu yüzden  programlamada genellikle kullanacağım dinamik kütüphaneleri derlemeye çalışırım. Yada aynı derleryici versiyonunda derlenmiş olanları bulmaya gayret ederim. Çünkü ne zaman, nerde probleme sebep olacağı belli olmaz. Sonra bir bakmışsınız boşyere çabalayıp durmuşsunuz.

Neyse geçenlerde Volkan kardeş picproje formundaki bir "Çizgi izleyen sanal robot " yarışmasından bahsetti. Uğraşmak istediğinden bahsetti , benden de  bir bakmamı rica etti. Anladığım kadarıyla Çizgi izleyen robotun, gömülü yazılımcılar camiasında fiyakalı bir yeri var. Şimdi bahsedeceğimiz yarışmada basit bir simulatörle robot yapmadan bu işe girişe biliyorsunuz.


Yanlız küçük ! bir ayrıntı varmış. simulatörde algoritmanızı çalıştırmak için bir dll yazmanız gerekiyor. Bir başka küçük ayrıntıda simulatör Delphi ile yazılmış olması. Bizim de bunu kendi kullandığımız dilde yani C de yazmamız lazım.

Neyse biraz ricadan biraz da merak saikiyle DLL cehennemine daldık.

İlk aklıma gelen Delphi üzerinde çalışması gerektiğinden Borland C  ile olacağına kanaat getirdim. Önce internette BorladC nin ücretsiz versiyonunu aradım. IDE olarak tabii ki emektar CodeBlock ile.

Neyse BorlandC ile yaptığım ilk denemelerden oluşan DLL ler doğrudan çakılıp kaldı. Neden olduğuna dair hiç bir fikrimde yok. Hata mesajı olmayınca nereye bakacağınızıda bilemiyorsunuz. Alınan hatanın önemli bir ip ucu olduğunu  unutmayın.

İkinci denememizi mingw32 ile yaptık. Denememiz sonrasında  "Algo? Yordamina ulasilamiyor" hata mesajına muhatap olduk. İlginçdir bahsi geçen fonksiyon vardı orda.

Windows için çok faydalı bir  uygulama var. "Dependency Walker" bu programla exe dosyaların ihtiyaç duyduğu DLL leri listelerken. DLL içindeki yordamların adlarınıda görebiliyorsunuz.


ordan bakınca bizim "Algo1" yordamı "Algo1@24" olmuş olduğunu gördüm.

sebebini araştırdım. "Decorated Names" diye bir kavrama  ulaştık.  Değişik derleyiciler değişik şekilde  yordamların ismini değiştiriyor. Bu problemden kurtulmak içinde Tanımlama dosyası - def- oluşturup.



linker için de def   komutuyla def file bildirilir.


Bütün bu işlemleri bir çırpıda anlattığıma bakmayın epey bir araştırma gerekti.  Ve en nihayetinde Artık  simulatörden çağrılabilen DLL dosayasını oluşturabildik.


LineFollowerRobot from bluekid on Vimeo.

Basit de bir algoritma yazdık yukardada videosunu koyduk.

İlgilenirseniz koduda burdan indirebilirsiniz.