Derin Öğrenme Hakkında Neredeyse Her Şey [2]

Ömer SAVAŞ
SDTR
Published in
6 min readMar 3, 2022

Son Güncelleme: 02/02/2022

Bu seri toplamda 6 yazıdan oluşmaktadır. Şuan 2. yazıyı okuyorsunuz. Diğer içeriklere aşağıdaki linklerden ulaşabilirsiniz.

Özet: Bu yazıda veri ve katman tiplerine değinilmiştir.

Veri

Bir virgül koyalım. Mimariyi büyük oranda konuştuk. Bu işin veri kısmından konuşalım biraz. İlk olarak elimizde bir veri seti olmalı ve bu veri seti girdileri ve çıktıları içermeli. Örneğin araba bilgileri/özellikleri ve fiyatlar, örneğin resimler ve içinde kedi olup olmadığı bilgisi, örneğin türkçe cümleler ve karşılığı ingilizce cümleler.

Veri setinin sağlaması gereken bazı özellikler var. Önce yeteri kadar büyük olmalı. Eğer kısıtlı bir veri setiniz var ise data artırma (data augmentation) yöntemlerini kullanarak veri setinizi büyütebilirsiniz. Mesela elinizde resimler varsa tüm resimleri sağ-sol yönünde döndürerek yeni resimler üretebilirsiniz. Bilgisayar için resimler sadece dijital bir diziden ibaret. Döndürmüş olduğunuz resim bilgisayar için tamamen farklı bir resim demektir. Yada resmin odak nesnesini kaçırmadan açılı bir şekilde döndürme, kesme, yakınlaştırma gibi yöntemlerle de veri artırımı yapılabilir. Diğer veri türleri için data artırma yöntemleri hakkında çok bilgim yok. Ama beyin fırtınası yaparak bile bir çok yeni veri elde edilebilir diye düşünüyorum.

Bunun yanında veri seti çözmek istediğiniz problemi tamamen içinde barındırmalıdır, aynı dağıtımdan gelmelidir. Örneğin eğitim setinizde hep aynı ışık değerinde çekilmiş resimleriniz varsa gerçek hayatta ışık değeri değiştiği anda doğru sonuçlar alamazsınız.

Veri setimiz hazır, eğitimi gerçekleştirdik. Sonuçlar çok iyi 98% başarı sağlıyor diyelim. Sonra test seti için tahminler gerçekleştiriyoruz. Bakıyoruz ki tam bir fiyasko! Yalnızca 53% başarı gösterebilmiş. İşte bu durumun adı aşırı öğrenme. Modelimiz eğitim setini çok iyi öğrenmiş ama soruna odaklanamamış sadece eğitim setimizdeki veriye odaklanmış.

Burada iki seçenek var birincisi grafikte de görünen “erken durma” noktasındaki başarı sizin için yeterli ise eğitim o noktada kesebilirsiniz. Yada “dropout” dediğimiz bir yöntem var. derin sinir ağındaki bazı nöronları rastgele olarak görmezden gelmek yada ağırlığını düşürmek. Bu sayede modelimizin aşırı odaklanmasını engellemeye çalışabiliriz.

Bir diğer durum da eğitim verisinde bile istediğimiz başarı değerine ulaşamama. Bunun için de veri setimize daha uygun bir model seçmek yada modeli daha derin bir sinir ağı haline getirmek öneriliyor.

Son olarak da şunu söyleyip bu veri başlığından çıkmak istiyorum. Bazı durumlarda veri setimizi eğitime sokmadan önce normalize etmek isteyebiliriz. Bu örneğin tüm girdileri 0 ve 1 arasına getirmek gibi şekillerde olabilir. Burada bu konuda bir makale var detay için okunabilir.

Katman tipleri

Şimdiye kadar hep “Dense” yada “Fully connected” dediğimiz katman tipi üzerine konuştuk. Bunlar isimlerinden de anlaşılacağı üzere tüm nöronların birbiri ile bağlı olduğu düz katmanlar ve lineer sayılabilecek sorunlar karşısında güzel sonuçlar verebiliyorlar. Ama bunlardan başka genel olarak bir kaç katman tipinden daha bahsedebiliriz.

Bunlardan ilki “Evrişimsel Katmanlar“ (Yani Convolutional Layer kısaca: Conv yada CNN). Resim işleme konusunda çok kullanılıyorlar. Önce filtrelerden konuşmak istiyorum. Bir resme filtre uygulamak demek matris halindeki bir resmi filtre dediğimiz bir matrisle çarpmak (doğrusal çarpım) demek aslında. Aşağıdaki 2 resim bu konuda biraz fikir verebilir. Resme “kenar bulma” filtresi uygulanmış.

Yukarıdaki 3×3 lük filtreye bakalım. Daha önceden belirlenmiş ve kendi içerisinde mantığı olan sabit değerli bir matris. Elimizde bir kaç adet çeşitli amaçlara hizmet eden aynı boyutlarda filtre olsun. Ne filtreleri olduğu önemli değil. Sırası ile resmimizi bu filtrelerden geçirip alt alta koyalım. Bir de bu filtrelerimiz 3*3 değil de 4*4*3 yani 3 boyutlu olsun. Hesaplamaların nasıl yapıldığına vs odaklanmayın. Mesele şu: bir giriş resmimiz var 2 tane filtremiz var bu resmi bu filtrelerden geçirince elimizde iki tane filtrelenmiş resim kalıyor.

Conv katmanlar da bu mantıktan yola çıkıyor. Yapay zekaya diyoruz ki; biz sana daha önceden bir nöron veriyorduk sen bunlardaki w ve b değerini bulmaya çalışıyordun. Şimdi de 3 boyutlu bir matris (filtre) veriyoruz. Bunu hesapla ve en doğru değerleri bul. Aslında w ‘muz 3 boyutlu matrisimiz oluyor. Yine daha önceki katman mantığına denk olarak; nasıl ki bir katmanda birden fazla nöron verebiliyorduk şimdi de birden fazla filtre verebiliyoruz. İşte bunu yapan “Evrişimsel katman“.

Bir de bunun ardında kullandığımız “Pool Layer” var. Bu katmanın ana amacı hesaplanacak değişkenlerin sayısını düşürmek. Peki nasıl? Elimizdeki büyük matrisin ortalamarını yada max değerlerini almak gibi seçimler sonucunda daha küçük bir matris haline getirerek. Bunu resim küçültme gibi düşünebiliriz.

Conv layerlar ve pool layerlar ard arda kullanılırlar. Daha doğrusu genellikle resim bir kaç katman conv+pool ikilisinden geçirildikten sonra bir yada bir kaç katman da dense layer dan geçirilir ve model oluşturulmuş olur.

Yukarıdaki model resmi alır ve bir çıktı üretir. Bir de bunun tam tersi bi model var, çıktı olarak resim üretiyor. Bunun için kullanılan katmanlar da üst paragraflarda bahsettiğimiz katmanların tam tersi olan Deconvolution ve Unpooling katmanları.

Bir diğer katman tipimiz ise “Recurrent neural network“. Genellikle bir serinin ileriki elemanlarını tahmin etmek gibi durumlarda kullanılıyor. Borsa tahminleri, kelime çevirileri en meşhur olduğu alanlar. Bunun da kendine has bir yapısı var. Hemen aşağıda anlamsız bir resim paylaşayım.

Eşitliği sağ tarafı daha anlamlı geliyor bana. Şöyle düşünelim bir cümlemiz var kelimelerimiz X0, X1, X2… şeklinde gidiyor. Her bir kelimeyi teker teker veriyoruz. Girdi verimiz bu (tabi önce özel bir yöntemle sayısallaştırıyoruz). Sonra biz kelime verdikçe ağımız tahminlerde bulunmaya çalışıyor. Amacı bu tahmin yapan mekanizmayı mükemmelleştirmek. Öncesinde verilen kelimeleri hafızasında tutarak; her bir sonraki kelimeyi doğru tahmin etmek. Tamam bitti dağılabiliriz :p Burada detayını merak edenler için güzel bir yazı var.

RNN ‘in ilk problemi seri içindeki ağırlıkları tam olması gerektiği gibi dağıtamama. Şöyle düşünelim bir cümlemiz var 10 kelimeden oluşuyor. 8. kelimeyi tahmin etmeye çalışıyoruz. Bunun için de tekillik çoğulluk bilgisi lazım olsun. Ama o bilgi malesef taa 2. kelimede. Modele göre 8. kelime için en önemli olan kelime 7. kelime bu sebeple tekillik çoğulluk bilgisini tam istenilen gibi alınamıyor.

İkinci sıkıntılı kısım da, uzun uzun girdileriniz var ise geri yayılım sırasında ağırlıklar çarpılarak azalıp bitecekler.

Kabaca bu sebeplerden ötürü revize modelleri çıktı. LSTM ve GRU önemli iki RNN modeli.

Yukarıdaki resim şemasal olarak farklılıkları gösteriyor. Aslında ana mesele şu: bu yeni yaklaşımlarda unutma ve hatırlama da bir öğrenmeye bağlanmış. Ağ gerektiği yerleri hatırlıyor gerektiği yerleri unutuyor. Böylelikle 2. kelime gerektiği kadar önemlendirilerek; 8. kelimeyi tahmin etmek için gerekli tekillik/çoğulluk bilgisi alınabilyor. Detaylı bilgi için yine bir yazı bırakıyorum buraya. Kullanım örneklerine değineceğiz.

Çıktı Katmanı

Çıktı katmanı artık bizim için beklenilen sonucu üreten katman. Rakam tanıma, sınıflandırma gibi örneklerde softmax kullanılır. Bunu şöyle düşünebiliriz; rakam tanıma için 10 tane rakam var. Demek ki çıktı katmanımızda 10 tane sonuç olacak. Kaba bir tabirle bu çıktılardan en büyük olanı hangisi ise tanımaya çalıştığımız rakam o dur. Kelime çevirisi, cümle üretme gibi modellerde de çıktı katmanı o işe özeldir. Tasarımınıza göre, tek yada çoklu çıktınız olabilir (GRU yada LSTM çıktı katmanı olabilir). Son olarak da bir resim üreten bir modeliniz varsa çıktı katmanı da ona uygun olacaktır. Convensiyonel katman olabilir örneğin. Velhasıl çıktı katmanı sizin istediğinizi verecek olan katman.

--

--