Cumartesi, Kasım 07, 2015

Derin Öğrenme 3

Bir önceki yazımızda kabaca çalışma sisteminden bahsetmiştik. Bu yazımızda pratik olarak neler yapabileceğimize bakalım.

Sitemizi takip ediyorsanız görmüşsünüzdür. eskiden beri pratik uygulamalara ağırlık vermişizdir. klasik YSA kütüphanesi olan FANN 'ın pek çok değişik alanda kullanarak gösterdik. Genel kullanım aslında aynı.

  • Uygulanacak bir alan bul. 
  • Verileri topla. 
  • Sistemi eğit. 
  • Eğitilmiş sistemi kullan.

Sıfırdan bir derin öğrenme sistemi yazmak çoğumuz için mümkün değildir. Gerekli de değildir.  Hali hazırda pek çok kişi  tarafından geliştirilmekte olan uygun kütüphanneler mevcuttur. Bunları kullanmak hem daha sağlıklı hemde daha kolaydır. Tekerleği icat edilecek yer var edilmeyecek yer var ... Bizim görüşümüz kendinize en yakın gördüğünüz ve gelişmesi devam eden bir kütüphaneyi seçmektir. Sonrasında çalışmalarımızı bu sistemi öğrenmek ve uygulamak üzerine harcaya biliriz. Biz bir kaç tanesinden bahsedelim.

Torch 

Torch aslında genel bir Yapay Öğrenme kütüphanesi ve Geçmişi epey eski hatta bir vakitler üzerine yazılmış görüntü işleme kısmıyla birlikte çıkmıştı Torch Vision diye biz de bahsetmiştik. Torch Vison pek gelişmesede ana kütütüphane olan Torch çok gelişti. Ana kütüphane C de yazılmış olsada, Lua destekli olarak epey revaçta bir kullanıma sahip. GPU desteği zaten derin öğrenme sistemlerinin olmazsa olmazı. Açık kaynak kodlu ve ticari kullanımada uygun bir lisans yapısı var.

Caffe 


Berkley Üniversitesi tarafından geliştirilmiş bir sistemdir Caffe .  Açık kaynak kodlu, ticari kullanıma uygun ve GPU destekli bir yapıdır. Temelde C++ olarak yazılmıştır. Hiç program yazmadan Komut satırından çalıştırılan programlarla ve google 'ın  -Protocol Buffers - Google's data interchange format - ile yazılmış model yapıları ile eğitip kullanabiliyorsunuz. 



mesela bakınız.


NVDIA'nın DIGITS  ürünü ilede  GUI  üzerinden kullanabiliyorsunuz.



Pek çok araştırma gurubu tarafından kullanılan bir sistem olan Caffe bizimde tercihimizdir. 
Matlab ve python destekleride vardır. Caffe için en büyük  eksiklik şimdilik windows desteğinin pek iyi olmaması. Resmi bir windows versiyonu yok. Fakat bu konuda değişik çalışmlar var
Sonuncusunda çalıştırılabilir bir versiyonunda var

Caffenin bizim açımızdan diğer bir  avatajı da OpenCv 3.0 ile birlikte Caffede eğitilmiş olan modelleri kullanma imkanına sahib olmamızdır.  Mesela bir önceki yazımızdaki video yu  Caffe de eğitilmiş "bvlc_googlenet.caffemodel" modeliye yazdık.  Caffe de  eğitilmiş modellerede ulaşabiliyorsunuz. 

 OpenCv de Derin Öğrenme sistemlerine ulaşmak için OpenCv 3.0 'ı contrib eklemeleri ile birlikte kurmalısınız. -Kitabımızda anlatmıştık -  Bu kısımda dnn modülünde  bahsettiğimiz özellikler var.

Dökümantasyonu ;
docs.opencv.org/master/d6/d0f/group__dnn.html
Örnek Program ;
github.com/Itseez/opencv_contrib/blob/master/modules/dnn/samples/caffe_googlenet.cpp
Dökümantasyondaan görülebileceği gibi  hali hazırda çalışmasada eğitilmiş Torch modelleri içinde üzerinde çalışılıyor.

Bizim bahsettiğimiz dışında da başka kütüphaneler var elbette. Burdan detaylı bir listeye ulaşabilirsiniz. Listenin olduğu site deeplearning.net de genel konu ile ilgili açıklamalara ve bağlantılara ulaşabilirsiniz.

Bütün yazdıklarımızı toparlarsak. Pratik bir çalışma yapmak  istediğimizde

1) Hazırda geliştirilmiş sistemlerden biri tercih edip öğrenmemiz gerekiyor. Bizim önerimiz Caffe
2) Büyük işlemgücü gerektiğinden en azından CUDA destekli bir NVDIA grafik kartlı  bir bilgisayar edinin. Daha teferruatlı açıklama için bakınız ; deep-learning-hardware-guide
3) Bol miktarda veri istediğinden ;  sabır  ve zaman  - mümkünse ekip oluşturup işi paylaşmak -
4) Bütün her şey hazır olup eğitim denemelerine başlandığında eğitim işleminin uzun olması yüzünden zaman.

Listedende anlaşılacağı üzere orjinal bir çalışma için ; İnsan para ve zaman gerekiyor...

Evet bir yazı dizimizinde böylece sonuna geldik. Bir başlangıç yapabilmek adına gerekenlerden bahsettiğimizi umuyorum. Umarım birilerine bir faydası dokunur. Her türlü soru , öneri ve eleştirilerinizi bekeleriz...

Pazar, Kasım 01, 2015

Derin Öğrenme 2

İlk yazımızda temel bazı gerçeklerden bahsetmiştim. Bu kurallardan "Derin öğrenme" için yapabileceğimiz çıkarımlar şunlar. "Derin öğrenmeyi" öğrenip kullanabilmeliyizki  geri kalmayalım. Hayranı olup kalmayalım ki derin öğrenmenin eksikliklerini ve diğer gelişmeleri görebilelim. Uygulamanın gerekliliklerine göre en uygun olan metodun seçiminde nesnel - objektif - olabilelim.


"Derin öğrenme" muğlak bir terim çünkü  rivayetler muhtelif ; Benim anladığım kadarıyla
 çok sayıda katmandan oluşan hiyerarşik  dönüşümlerle verilerin anlamdırıldığı -öğrenildiği- metodlar topluluğu. 
diyebiliriz. Yapay öğrenmenin bir dalı diyede bahsedilir. Günümüzde  başarılı olmuş bu  metodların ortak noktası çok katmanlı olmalarıdır. Anlayabildiğim kadarıyla bir birinden farklı pek çok metodu içerdiğinden,   bu  genel isim  tercih ediliyor.  Bu metodlardan  bazılarının isimleri verelim ; - kusura bakmayın mecburen  ingilizce vereceğiz -

Bütün bunları detaylıca anlatmam pek mümkün - haddimde - değil. Gereklide değil zaten.  Olabildiğince pratik anlatmaya çalışalım. Klasik metodlarda Veriden bilgiye geçişte aşamalar aşağıdaki gibidir.



Ham veri genellikle bir öznitelik çıkarma 1 - feature extraction -  aşamasından geçer. Öznitelik çıkarma aşamasınında genel bir metodu yoktu. Vakti zamanında Anderw Ng nin bir konuşmasından bir parça yayınlamıştık. - İzlemediyseniz tavsiye ederim izleyin - Derin öğrenme algoritmalarında hiyerarşik dönüşümlerle  bu işlevide yerine getiriliyor. Biraz daha somutlaştıralım.

Derin öğrenme algoritmalarının içinde en bilineni belkide 'Convolutional neural networks' - CNN - dur.  Mesela derin öğrenme dendiğinde ilk akla gelen örneklerden olan görüntü sınıflandırma  problemlerinde CNN kullanıldığını görürüz. CNN aslında gelişmiş bir Yapay sinir Ağıdır. Normal ileri beslemeli sinir ağı öncesi  bir anlamda  öznitelik çoğaltma ve özetleme katmalarıda içererek , Öznitelik çıkarma işlevini içine almışdır.



Bu metodun  iç yapısında   Convolutional  katmanları ile  ile öznitelikler çıkarılır ve çoğaltılır.  Bu katman aslında görüntü işleme pek çok işlem için  de kullandığımız basit filtreleme işlemidir.


Pool katmanları ile çoğalan öznitelikler basit işlemle küçültülür.

üzerinde işlem yapılan kısımın,  max  pooling  ile en büyüğü , min pooling ile en küçüğü  ve  median pooling ile ortalaması  alınarak özetlenmiş olur.

Bu katmanlar değişik kombinasyonlarlar ve değişik parametrelerle sıralanarak , 



bir öznitelik çıkarma işlevi yapılmış oluyor.  Öznitelik çıkarma işlevi de bir anlamda öğreniliyor.



YSA ksımında ise girdi sayısının ve katman sayısının büyüklüğü sebebiyle klasik metodlarla eğitimi  pek kolay değildir. Bu yüzden gerek öğrenememe -under fitting - gerekse ezberleme - over fitting - problemleri 2 için modern çözümler ve kullanılmaktadır.

Mesela ; Dropout diye tabir edilen bir yöntem var.  Ağ içindeki bazı bağlantıların kaldırılmasıyla  eğitim performansı artırıyor.



Mesela ; aktivasyon klasik fonksiyonları yerine - ReLu - Rectified Linear Unit  kullanımı gibi.



Ezeberleme problemi için tek başına metodlar işe yaramaz.  Bahsedilen büyüklükteki bir ağ yapısı normal bir veri setini kolaylıkla ezberler. Bu yüzden devasa büyüklükte ve genişlikte veri setleri oluşturulur.

Derin denecek kadar çok katmanlı bir yapıda ve devasa büyüklükteki bir veri seti için yine devasa bir işlem gücü gerekiyor olması süpriz olmaz sanırım. İşlem gücü için genel çözüm GPU  kullanımıdır. Günümüzde NVDIA bu işte en öndedir. Çünkü CUDA 3 ile yıllardır bu iş üzerine emek vermişti. 


İnşallah kafanızda derin öğrenme ile ilgili kabacada olsa somut bir şeyler oluşturabilmişizdir.


DeepNN from bluekid on Vimeo.


Üstteki video da Derin öğrenme ile eğitilmiş bir sınıflandırıcının kullanıldığı basit bir örnek hazırladık diyerek  bu yazıyı sonlandıralım.

Devam edecek İnşallah....
Görüş ve önerilerinizi bekleriz....

 Notlar;
1) Bir parça bu yazımızda bahsetmiştik  bakabilirsiniz.
2) YSA lar ve eğitim konusunda  bu yazımızda birşeyler anlatmıştık
3) 2008 de bahsetmişiz.  bakınız