Keras ile RNN ve LSTM’e Giriş

keras rnn lstm

🔮Derin öğrenme alanında oldukça önemli olan Keras kütüphanesi ile yapay zekâ yolculuğumuza devam  ediyoruz. Bir ve birden fazla katmanlara sahip Yapay Sinir Ağlarında birçok farklı sinir ağı modeli bulunmaktadır. Bugün sizlerle birlikte yinelenen sinir ağları olarak literatüre geçen RNN sinir ağı modeli ve tekrarlayan sinir ağlarındaki ufak bir probleme çözüm üreterek çıkartılan LSTM sinir ağı modelini inceleyeceğiz.

[gdlr_core_space height=”30px”]

[gdlr_core_space height=”30px”]

🧷RNN (Recurrent Neural Network) sinir ağı modeli, diğer yapay sinir ağlarına göre farklı yapıya sahiptir. En büyük farklarından birisi geçici de olsa bir hafızaya sahip olmasıdır. Bu hafıza kısa belleğe sahiptir. Bu sebepten dolayı çok uzağı hatırlayamazlar, yakın geçmişte hatırlama yapabilirler. Oysaki ANN öyle midir? Hayır. ANN bir hafızaya sahip değildir. Yapay sinir ağlarının unutması mümkündür fakat yinelenen sinir ağları hafızalarından kaynaklanan özellik ile yakın geçmişi hatırlayabilmektedir. Peki geçmişi hatırlayabilen bir sinir ağı bizim ne işimize yarar? Geçmişteki bilgilerini kullanarak geleceğe yönelik çıkarımlar ve tahminler yapabilmektedir. Hatta diyelim ki bir görüntü üzerinde sınıflandırma yapıyoruz. Daha önceden öğrendiği bir özelliğe göre önüne gelen görüntüdeki özellik ile eşleştirerek sınıflandırma gerçekleştirebilmektedir. Bu sebeple diğer algoritmalara göre daha etkili çalışmaktadır 🌟.

[gdlr_core_space height=”30px”]

Yandaki görselde bir RNN ağının yapısını görmekteyiz. Bu modellerde önceki adımdaki çıktı geçerli adıma girdi olarak beslenmektedir. Bilgileri hatırlayan ağlar ise Hidden Layer adını verdiğimiz Gizli Katmanlar aracılığıyla gerçekleşmektedir. Böylelikle bir tekrarlama hiyerarşisi bulunmaktadır . 

Bu modele güzel bir örnek vermek gerekilirse, günlük hayatta neredeyse yoğun olarak gördüğümüz çeviri işlemleri, metin madenciliği kısacası doğal dil işleme alanı RNN mantığı ile çalışmaktadır. Nasıl mı? Düşünün siz bir çeviri yapıyorsunuz, tıpkı bir makinenin çeviri yaptığı gibi, her dilin kendi semantik yapısına göre cümlenin bir sonraki kelimesini tahmin etmek gerektiğinde önceki kelimelere ihtiyaç duyacaksınız. Bu nedenle önceki kelimeleri hatırlamanız gerekecek. Burada yardımınıza RNN koşmaktadır. Fakat RNN’ in de dezavantajları olacaktır elbette. Bu sebeptendir ki LSTM yapısı ortaya konmuştur. Öncelikle RNN hafıza yapısını güzelce inceleyelim daha sonra LSTM’ i de birlikte göreceğiz.

[gdlr_core_space height=”30px”]

[gdlr_core_space height=”30px”]

Görselde görmüş olduğunuz gizli katmanlar içerisinde düğümler bulunmaktadır. Bu düğümler kendi kendini besleyebilen temporal loop dediğimiz zamansal döngülere sahiptir. Bu şekilde iç hafızalarını (internal memory) kısa süreli olarak kullanarak hatırlama mekanizmasını çalıştırırlar. Peki bu kendi kendini besleme olayı derken neyden bahsediyoruz? Sinirler arası bu bağlantılarda nöronların kendi aralarında haberleşmeleri söz konusudur. Aldığı bir giriş bilgisini (input) çıkış vermesine rağmen kendisini o giriş bilgisi ile besleyerek unutmamayı sağlıyor. Bir sonraki nörona bu bilgiyi verdiği zaman daha önce öğrendiği bu bilgi aklında kalıyor ve zamanı geldiğinde hatırlayarak bu bilgiyi kullanılabilir hale getiriyor. 

📝Basit bir doğal dil işleme içeren kelime tahminini ele alalım. “Yapay” kelimesinin olduğu bir RNN karakter seviyesini alalım. İlk dört harf olarak {y, a, p, a} harf kümesini sinir ağına veririz. Buradaki kelime dağarcığı harf tekrarları gözetilmeksizin {y, a, p} sadece üç harften oluşmaktır. Bizim sinir ağından beklentimiz ise son harf olan “y” harfini tahmin etmesidir. Bu ağda y harfini sinir ağına verdikten sonra gelen a harfi için bir önceki çıkıştaki y harfi ile olan bir yineleme formülü uygulanır ve bu tüm sinaptik nöronlarda gerçekleştirilir. Böylelikle yinelenen bir sinir ağı ile istenilen tahmin gerçekleştirilir.

[gdlr_core_space height=”30px”]

[gdlr_core_space height=”30px”]

RNN’ in yapısını anlayabilmek adına bir örnek daha yapalım. Yukarıdaki görüntü baz alındığında öğretmeninizin size ilkokul 1. Sınıfta öğrettiği alfabenin daha sonraki süreçlerde yazı yazmak ve hatta kitap okuyabilmek için cümleleştirerek kullanıldığını hatırlayalım. Örneğin şu anda bu bloğu okurken bile aslında hafızanızda tuttuğunuz alfabedeki harflerin kullanımını hatırlayarak bir bakıma tekrarlayan sinir ağı mimarisini gerçekleştirmiş oluyorsunuz. Aslında bu örnek düşünüldüğünde RNN kısa süreli belleğe sahip olduğu için uzun süreli bellek olan LSTM mimarisi örnek verilse daha uygun olur.

[gdlr_core_space height=”50px”]

RNN Yapıları

[gdlr_core_space height=”30px”]

  • One to One: Bir tane girdiye karşılık bir tane çıktının yer aldığı sinir ağı modelidir.
  • One to Many: Bir tane girdiye sahip bir sinir ağında birden fazla çıktı yer almaktadır. Örneğin, elimizde girdi olarak bir görüntü olduğunu varsayalım. Beklenen çıktı ise bu görüntüdeki yapılan eylemdir. 

Çıktı : Piyano Çalan Bebek 🎹

Görüntüdeki piyano, bebek ve müzik defterindeki notaları (çıktıları) algılayarak daha önceden öğrendiği bu özellikleri hatırlayıp çıktıyı tahmin etmektedir.

[gdlr_core_space height=”60px”]

  • Many to One: Birden fazla girdiye ait sinir ağından bir tane çıktı verilmesi beklenir. Örnek olarak girdilere birden fazla cümle veya cümle içerisindeki kelimeler verilebilir. Çıktı olarak ise örneğin bu cümlede verilmek istenen duyguyu tespit edebiliriz. 

[gdlr_core_space height=”30px”]

  • Many to Many: Birden fazla girdiye ait sinir ağında birden fazla çıktı verilmesi beklenir. Çeviri programları buna en güzel örnek olarak verilebilir. 

“Recurrent models tackle sequence … healthcare” cümlesindeki her bir kelime sinir ağında aslında bir girdi olarak sayılmaktadır. Buradaki İngilizce’ den Türkçe’ ye çeviri işleminde sinir ağı yapısı kullanımı ile görüldüğü gibi birden fazla output içeren bir çıktı verilmiştir.

💡 Haydi sizlerle ufak bir kodlama yapalım! RNN sinir ağının kullanılacağı veri seti olan New York Şehri Airbnb Açık Verisini Kaggle’ dan ücretsiz olarak indirebilirsiniz. İşe veri setini almakla başlayalım, ne dersiniz?

[gdlr_core_space height=”30px”]

[gdlr_core_space height=”30px”]

🗺️Gerekli kütüphaneler tanıtıldıktan sonra uyarıları da göz ardı ederek veri setimizdeki verileri pandas ile alabildik. Şimdi kontrol amaçlı head( ) komutu ile ilk 5 veriyi ekrana bastıracağız.

[gdlr_core_space height=”30px”]

[gdlr_core_space height=”30px”]

Verileri aldıktan sonra bu veri setinde neye göre tahmin yapacağımızı belirlememiz gerekmektedir. Örneğin bu yazıda otel fiyatlarına göre bulunduğu yeri tahmin etmesi ile ilgileneceğim. Bu sebeple eğitim verisine price (fiyat) bilgilerini atadım 🏷️.

[gdlr_core_space height=”30px”]

Bu aşamada ön işleme olarak 0-1 aralığına ölçeklendirerek MinMax Normalizasyonunu gerçekleştiriyoruz.

[gdlr_core_space height=”30px”]

[gdlr_core_space height=”30px”]

[gdlr_core_space height=”30px”]

📎 Daha sonra örnekler ve tahminlerin oluşumu için boş X ve Y eğitim dizileri oluşturuyoruz. Yukarıdaki grafikte gördüğünüz verilerden ortalama bir örneklem sayısı kullanırız. Örneğin biz X_train için 100 tane örnek (sample) belirleyelim. 100 tane alınan sample verisine göre 101. veriyi ise tahmin (predict) için Y_train kümesinin içine atayacağız. 

[gdlr_core_space height=”30px”]

🧐 Peki bu sadece 100 veri için mi gerçekleşecek? Hayır. Biz bu işlemi hep bir defa kaydırarak (shift) tüm örnekler üzerinde gerçekleştireceğiz. For döngüsü içerisindeki kaydırma işlemini inceleyebilirsiniz.

Yeniden boyutlandırma gerçekleştirilerek X_train veri kümesindeki verileri shape[0] ve shape[1] ile değerlerini yazdırabilirsiniz. Aynı zamanda oluşturulan y_train tahmin kümesini de ekrana bastırabilirsiniz.

[gdlr_core_space height=”50px”]

RNN Modelinin Oluşturulması

Buraya kadar olan kısımda veri hazırlama adımını gördük. Şimdi ise sıra kullanacağımız RNN sinir ağı modelini oluşturmaya geldi. Sequential, aslında tüm bu mimarileri içerisinde barındıran bir yapıdır diyebiliriz. Dense katmanı ise mimarideki katmanları kullandığımız bir yapıdır. Dropout, Overfitting yani aşırı öğrenme sorununu aşmamıza yarayan bir regülarizasyon yöntemidir. SimpleRNN ise RNN mimarisini kullanacağımız katmandır🌲.

Daha sonra Sequential( ) modülü çalıştırılarak mimaride RNN kullanacağımızı bildirmiş olduk.

🔎Haydi bu projede kullanacağımız SimpleRNN’ in içerisine aldığı parametreleri birlikte inceleyelim.

  • units: Çıktı alanının boyutu
  • activation: Kullanılacak aktivasyon fonksiyonu
  • use_bias: Bias değerinin kullanılıp kullanılmayacağını belirten parametre
  • return_sequences:  Çıkış dizisindeki değerin son çıkış mı yoksa tam dizinin mi döndürüleceği değerinin bulunduğu parametre
  • input_shape: Kullanılacak verinin şeklini belirten parametre

[gdlr_core_space height=”30px”]

NOT 🧷

input_shape parametresi yalnızca ilk SimpleRNN katmanında belirtilmelidir. Çünkü sonra gelen katmanlar diğerine bağlı olarak gelişecektir.

[gdlr_core_space height=”30px”]

Yukarıda oluşturulan RNN mimarisinde toplam 4 adet SimpleRNN katman yapısı oluşturulmuştur. Aktivasyon fonksiyonu olarak tanjant kullanılmıştır. Siz bunun yerine ReLU, Sigmoid gibi diğer fonksiyonlar ile de test edebilirsiniz. Dropout işlemi ise daha önce söylediğim gibi sinir ağının ezber yapmasını engelleyen bir yöntemdir. İçerisine aldığı değer kadar %2’ lik sinir ağından nöronları ve bunların sinaptik bağlarını kaldırır. Katmanlar oluşturulduktan sonra optimizasyon yöntemi olarak ‘Adam’ optimizasyonu ve hata hesaplayıcı olarak ortalama hata karesi yöntemi seçilmiştir. Daha sonra 100 epoch kadar fit ile eğitim gerçekleştirilmiştir. Aşağıda ise ilk 5 epoch ve loss değerlerinin incelenmesine yer verilmektedir 🏋️.

[gdlr_core_space height=”30px”]

[gdlr_core_space height=”30px”]

🧮 Eğitim işlemi gerçekleştirildikten sonra bir test klasörü oluşturabilirsiniz ya da veri seti için hazır oluşturulmuş test klasörünü kullanarak tahmin (predict) gerçekleştirebilirsiniz. RNN yapılarından bahsettik fakat hatırlayacağınız üzere kısa süreli belleğe sahip bir yapıydı. Bu sebeple çok uzak geçmişi hatırlayamazlar. Bu eğitimde 100 epoch çalıştırmayı sürdürdüğünüzde test işlemi ile sonucun çok iyi çıkmadığını da fark edeceksiniz. Bu problemin önüne geçmek için ise hem kısa süreli hem uzun süreli belleğe sahip olan LSTM adını verdikleri Long Short Term Memory yapısı oluşturulmuştur. Bu sayede sinir ağları hem yakındaki bilgileri hem çok uzaktaki geçmişin bilgilerini hatırlayabilmektedir. LSTM, RNN mimarisinin özelleştirilmiş bir yapısıdır.

[gdlr_core_space height=”30px”]

[gdlr_core_space height=”50px”]

X : Bilginin ölçeklendirilmesi, kendisine gelen bağlantıların birleşip birleşmeyeceğine karar veren yapılardır.

+ : Bilgilerin toplanması, X’ den gelen bilginin toplanıp toplanmayacağına karar veren yapılardır.

σ : Sigmoid katmanı, bu katmana gelen verilerin sonucu olarak 0 veya 1 gibi değerler döndürmektedir. (Sigmoid aktivasyon fonksiyonu, belirli bir değerin üzerini 1 altını 0 yapar)

tanh : Çok küçük gradyan değerinden kaynaklanan yavaş öğrenme (vanishing gradient) eylemi için tanh aktivasyon fonksiyonu kullanılmaktadır.

h(t-1) : Bir önceki girdiden gelen çıktı değeri

h(t) : Çıktı değeri

C(t): Bir sonraki sinir ağına ulaşılacak bilgi 

C(t-1): Bir önceki sinir ağından aldığı bilgi

Bu şekilde LSTM bellek yapısını da öğrenmiş olduk. Keras ile LSTM mimarisi de oluşturduktan sonra yukarıda RNN kodlarındaki gibi eğitim ve test işlemini gerçekleştirebilirsiniz 🤸‍♀️.

[gdlr_core_space height=”50px”]

LSTM Modelinin Oluşturulması

Aşağıdaki gibi Keras’ a ait modelleri yine aynı şekilde hızlıca oluşturalım ve LSTM mimarisini oluşturmaya geçelim.

[gdlr_core_space height=”30px”]

[gdlr_core_space height=”30px”]

Sequential( ) ile genel yapımızı oluşturmaya başlayalım. LSTM katmanını ve Dense ekleyerek tıpkı RNN’ de olduğu gibi compile edebilirsiniz. 

[gdlr_core_space height=”30px”]

Eğitim ve test işlemi gerçekleştirildiğinde RNN’ den daha başarılı sonuçlar elde ettiğinizi göreceksiniz. RNN ve LSTM mimarileri de derinlemesine öğrenmiş olduk. Sizlere iyi günlerde bol kodlamalar dilerim. Başka bir yazımda görüşmek dileğiyle 😊

Diğer yazılarıma buradan ulaşabilirsiniz.

[gdlr_core_space height=”60px”]

REFERANSLAR

  1. DATAI TEAM, Deep Learning ve Python: A’dan Z’ye Derin Öğrenme Kursu, Udemy.
  2. Keras Recurrent Neural Network, https://keras.io/layers/recurrent/ adresinden alınmıştır.
  3. https://becominghuman.ai/a-noobs-guide-to-implementing-rnn-lstm-using-tensorflow-1907a5bbb1fa adresinden alınmıştır.
  4. https://en.wikipedia.org/wiki/Long_short-term_memory adresinden alınmıştır.
  5. https://medium.com/@ishakdolek/lstm-d2c281b92aac adresinden alınmıştır.
  6. https://nvestlabs.com/recurrent-layers-of-keras-8/ adresinden alınmıştır.
  7. https://vinodsblog.com/2018/12/31/how-neural-network-algorithms-works-an-overview/ adresinden alınmıştır.
  8. https://www.analyticsvidhya.com/blog/2017/12/introduction-to-recurrent-neural-networks/ adresinden alınmıştır.
  9. http://www.crvoices.com/archives/2779 adresinden alınmıştır.
  10. Gatech, CS7650 Spring, Introduction to Deep Learning.
  11. https://onedio.com/haber/agzinizin-acik-kalmasina-sebep-olacak-bilimin-aciklayamadigi-20-sasirtici-bilgi-695050 adresinden alınmıştır.
  12. https://www.kaggle.com/dgomonov/new-york-city-airbnb-open-data adresinden alınmıştır.

Leave a Reply

Your email address will not be published. Required fields are marked *