Derin öğrenme ile ilgili kısa kısa notlar

Evrişim işlemiyle Lenet5 yapısında karşılaşıyoruz. Lenet5 yapısını Yann LeCun, 1998 de MNIST veri setinde yapmış oldukları çalışma ile duyurmuştur.

Gradient demek eğim demektir. Ve buradaki karşılığı türevi almak demektir. Öğrenmeyi artırmak için gradient kullanıp ağırlıkların değerini tekrar değiştiriyoruz.

PyTorch ve TensorFlow en çok bilinen ve kullanılan deep learning kütüphaneleridir.

Deep learning cpu, gpu veya tpu yu kullanılabilir.
Cpu : Bilgisayarın işlemcisi
Gpu : Bilgisayarın ekran kartı
Tpu : Derin öğrenme için geliştirilmiş ekran kartlarıdır.Tensor processing unit

Her ekran kartı GPU değildir.

Flop : kayan noktalı işlem sayısı demek.

Cuda : Nvidia da çalışan, gpu için tasrlanmış bir yapıdır. cuBLAS, cuFTT, cuDNN gibi API lara sahiptir. cuDNN ile optimize edilmiş bir model 3 kat daha hızlı çalışabilir.

Modelimizi gpu da çalıştırdığımızda ve gpu yeterimce hızlı olduğunda bu taraftaki sorunu halletmiş oluyoruz ama veriyi harddiskten çekeceğimiz için, harddiskin yavaş kalması sorunu ile karşılaşıyoruz..
Bunun çözümü için;

  • Bütün datayı RAM e yazabiliriz.
  • HDD yerine SSD kullanabiliriz.
  • Paralel cpu önbellekleri kullanırız.

Deep learning frameworklerinde yeni fikirlerimizi hızlı bir şekilde geliştirip test edeceğiz. otomatik gradient hesaplatacağız. Verimli bir şekilde GPU kullanacağız.

Amacımız var olan derin öğrenme yapılarını öğrenmek. AlexNET, VGG, INCEPTION vb. Sonra bu yapıları iyileştirip daha iyi sonuçlar almak.

Numpy kütüphanesi ile temiz bir API a sahip olunabilir, kolay numeric kodlama yazılabilir fakat gradyan hesabını otomatize edemeyiz, kendimiz yazmak zorundayız aynı zamanda numpy GPU da çalışmaz. O yüzden PyTorch yada TensorFlow kullanacağız.

L2 loss yani mean Square Error ortalama karesel hatayı hesaplarken tahmin ettiğimiz değerden gerçek değeri çıkarıp karesi alıp topluyoruz.

Adam veya SGD gibi optimizerler vardır bunlar ağırlıkların iyileştirilmesi sağlarlar.

Batch size aynı anda alınan girdi sayısıdır. Girdimizin boyutuna ve ram miktarımıza göre değiştirmemiz gerekmektedir.

Önceden eğitilmiş modelleri alıp kullanmamıza transfer learning denir.

axis = 1 sütuna göre işlem yapacağını belirtiyor.
axis = 0 ise satıra göre işlem yapacağını belirtiyor..

Keras TensorFlow’u kolaylaştıran bir library. Önceden 3.Parti bir library iken şimdi TensorFlow’un içinde built-in olarak gelir.

Keras‘ da compile dediğimizde döngü yazmamıza gerek kalmıyor. Epoch sayısını batch size‘ ı model.fix de belirtiyoruz.

Statik hesaplama ve dinamik hesaplama grafiği diye bir nane var ve yaptığımız işleme göre seçilmesi gerekiyor. Statik hesaplama grafiğinde, grafik her defasında hesaplanmaz bir defa hesaplanır ve hep o kullanılır. Dinamik hesaplama grafiğinde grafik her defasında hesaplanır. Statik hesaplama grafiği ile işlem yapmanın her zaman daha iyi sonuçlar vereceğini düşünebilirsiniz. Ama her zaman öyle olmaz. Bende sizin gibi düşündüm ve yanıldım.

TensorFlow 2.0 , Mart 2019 da yayınlandı ve dinamic graph default, dtatik graph optional olarak geldi. 2.0 dan önceki sürümlerde tam tersi durum geçerliydi. Yani statik graph default idi dynamic graph optional idi. Şimdi yeni verisyonda dynamic in default olmasından yine dynamic in iyi çalışacağını düşünebilirsiniz ki çoğu çalışma dynamic de iyi sonuc veriyor bu durumda çokta yanılmış olmazsınız. Fakat aşağıdaki örnekte statik’in daha yavaş çalıştığını görebilirsiniz.

TensorFlow da 2.0 dan sonra statik yapıyı kullanmak istersek @tf.function ibaresini kullanıyoruz.

TensorFlow’u distributed kullanabiliyoruz. PyTorch’u bilmiyorum bilen arkadaşlar varsa yorum bölümünde yazarsa öğrenmiş oluruz.

Yukarıda 2012 yılında Derin Öğrenme’nin popüler olmasını sağlayan çalışmanın kullandığı GPU ‘nun işlem hızını görüyorsunuz. 0.2 TFLOP günümüzde ise 11 TFLOP ve daha üzeri kartlarla işlem yapmaktayız.

Dinamik graph uygulamalarını tercih edeceğimiz yapılar;

  • Recurrent Network (RNN)
  • Recursive Network
  • Modular Network ( soruya cevap verme özelliği gibi)

Aşağıda moduler network’e örnek bir yapı göreceksiniz;


Yukarıdaki örnekte LSTM ile bir soru analiz ediliyor. LSTM bir RNN yapısıdır. Long – Short Term Memory Uzun kısa süreli bellek demektir, ve özellikle doğal dil işlemede kullanılır. Burada da Are there more cubes than yellow things sorusuna cevap aranmaktadır. Görsel tarafıda CNN ile işlenerek ortada iki yapıdan elde edilen bilgiler analiz edilerek cevap bulunmaya çalışılmaktadır.

Dinamik ve statik graph durumuna geri döndüğümüzde, sabit ve değişmez ise static graph’ları veri değişken ise dinamik graph’ları kullanmak daha iyi olabilir.

PyTorch dinamik graph’dır ve statik olması için Caffe2 veya ONNX kullanılabilir. Caffe2 facebook tarafından geliştirilen deep learning framework’udur. Core’u C++ ile yazılmıştır. iOS ve Android’ de çalışır. Python ile eğitilir sonra Python’suz deploy edilebilir. Static graph’dır.

Son olarak; Stanford’takilerin tavsiyesi ve kişisel favorileri PyTorch’dur. Temiz API’ a sahip olması, dynamic graph olması ,kolay develop ve debug edilmesi. PyTorch ile model build edildikten sonra Caffe2 veya ONNX ile production’a veya mobile’a export edilebilir. TensorFlow ise çoğu proje için güvenlidir. Syntax (Söz Dizimi) iyidir ama mükemmel değildir. Çok fazla kullananın olması ve büyük bir community sahip olmasından dolayı kaynak yönünden daha elverişlidir. Ve eğer TPU kullanacaksanız TensorFlow kullanmalısınız derler.

Buradaki notlar Stanford cs231n kodlu dersin 6. Slaytından çıkarılmıştır.

alierbey | 23/10/2019