GRU (Gated Recurrent Units)
GRU rnn’de karşılaştığımız Vanishing ve Exploding Gradient problemlerin çözümü için geliştirilen RNN mimarilerinden birisidir.(Cho,2014) GRU vanishing gradient problemini update ve reset gate adı verilen yapılarla çözüyor. Update gate zt uygulanan sigmoid sonucu 0 ise bir önceki hafızayı koruyor, eğer 1 ise o an ki hafızayı yeni değerle güncelliyor.
zt = σ(Wz [ht-1,xt])
Bu sayede vanishing gradient probleminin önüne geçilmiş oluyor. Bunun dışında geçmişte kalan sözcüklerin çoğul veya tekil olma durumu, lokasyon veya kişi bilgileri de aktarılmış oluyor. Reset gate rt hafızaya eklenecek aday bilgiyi hesaplarken kullanıyor. Hafıza adayının önceki hafıza ile ne kadar alakalı olduğunu tahmin ediyor. Geçmiş bilgilerin ne kadarının unutulacağına karar veriyor.
rt = σ(Wr [ht-1,xt])
Reset ve update gate’in çıkışa nasıl etki ettiğini incelersek, geçmişteki ilgili bilgileri saklamak için reset gate’i kullanacak yeni bir bellek içeriği sunuluyor. Bu işlem aşağıdaki şekilde hesaplanıyor.
ĥ = tanh(W [rt ∗ ht-1,xt])
Bu durum önceki zaman adımlarından neyin silineceği belirler. Son adım olarak mevcut rnn ünitesi için bilgileri tutan ve tuttuğu bilgiyi tüm networke ileten ht değerinin hesaplanması gerekiyor. Bu işlemi yapabilmek için güncelleme kapısına ihtiyaç duyuluyor.
ht = (1 – zt) ∗ ht-1 + zt ∗ ĥ

LSTM (Long Short Term Memory)
LSTM RNN in uzun dönem hafızası olan bir türüdür.(Hochreiter, 1997) GRU’unda genelleştirilmiş bir versiyonudur diyebiliriz. LSTM’in temel RNN’e göre avantajı hem uzun hem de kısa dönem hafızası olması.
“the clouds are in the sky,” cümlesinde son kelimeyi tahmin etmeye çalışırsak. Bu zaman akışına ters düşmediği ve cümle kısa olduğu için tahmin edilmesi oldukça kolaydır.
RNN geçmişteki kelimeleri kullanarak öğrenebiliyor. Eğer cümlemiz “I grew up in France… I speak fluent French.” şeklinde olsaydı. (Source : https://colah.github.io/posts/2015-08-Understanding-LSTMs/)
Yani cümlenin başında Fransa’da büyüdüğünü söylüyor aradan birçok cümle geçiyor ve metnin sonunda Fransızcayı akıcı olarak konuşabildiğini söylüyor.. RNN bu konuda yetersiz kalıyor. Teoride RNN France ve French ilişkisini kurabilmesi gerekiyor fakat cümle uzadıkça RNN bu bağlantıyı öğrenemiyor.
LSTM kısa ve uzun dönemli hafızasıyla bu sorunun üstesinden geliyor. LSTM de de GRU da olduğu gibi çıkışa etki eden geçitler bulunmakta, GRU da ki reset geçitinin yerine forget ve çıkış geçitleri kullanılıyor.
ft = σ(Wf [ht-1,xt] + bf)
Forget gate de ft LSTM kendisine gelen bilgilerden hangisinin unutulması gerektiğine karar veriyor. Karar verme işlemini sigmoid fonksiyonu sayesinde yapıyor. Denklemi incelersek t-1 zamanındaki hidden state ve t anındaki input alınıyor. Simoid sonucu 0 yakın olan bilgilerin çoğu geçitten geçemezken, bire yakın olan hesaplanan bilgi aktarılmış oluyor.
it = σ(Wi [ht-1, xt] + bi)
Ĉt = tanh(Wc [ht-1] + bc)
Input gate it hangi bilgilerin güncelleneceğine karar veriyor. Tanh katmanı ise cell state’e eklenmeye aday değerlerden bir vektör oluşturuluyor. Sonrasında iki denklem birleştirilerek cell state ekleniyor. Böylelikle cellstate hangi yeni bilginin hafızaya eklenmesi gerektiği belirlenmiş oluyor. Yukarıdaki 3 sinir ağında işlemler tamamlandıktan sonra eski cell statein Ct güncellenmesi gerekiyor.
Ct = ft ∗ C t-1 + it ∗ Ĉt
t-1 zamanında aldığımız cell state (C t-1) üzerinde forget gate işlemi yapılıyor. Bu sayede unutulması gereken bilgiler cell state’den çıkarılıyor.input gate it ve cell state aday değerleri Ĉt üzerinde işlem yapılarak cell state’e eklenmesi gereken bilgiler belirlenmişti. Toplama işlemi yapılarak yeni Ct oluşturuluyor. Son olarak output’un ne olması gerektiğine output gate ot sayesinde karar veriliyor.
ot = σ(Wo [ht-1,xt] + b0)
ht = ot ∗ tanh(Ct)
Output gate’inde ot output olarak hangi bilgilerin verileceği belirleniyor. Sonrasında cell state tanh fonksiyonundan geçiriliyor. Tanh -1 ve 1 aralığında değerler üreten bir aktivasyon fonksiyonudur. Çıkan değeri output gate değeriyle işleme soktuğumuzda cell state’in istediğimiz kısımlarını output olarak vermiş oluyoruz.

Bidirectional RNN
Cümle içerisinde geçen kelimeleri türüne göre sınıflandırdığımızı düşünelim. Cümlede geçen kelimeleri insan, yer ismi,şirket ismi,tarih gibi etiketlerle etiketleyebiliriz. Örneğin;
“General relativity is an exciting theory about the physics of space and time.”
Buradaki General kelimesini herhangi bir şekilde etiketleyemiyoruz. Eğer cümlemiz aşağıdaki şekilde olsaydı.
“General Lee and the Confederate Army lost the great battle.”
General kelimesini insan olarak etiketleyebiliriz. Benzer şekilde cümle,
General Motors araba üreten bir şirkettir.” Olursa burda General Motors’u şirket ismi olarak etiketleyebiliriz.
LSTM ve GRU cümledeki kelimeleri tahmin ederken General kelimesine tek bir kelime gibi davranacak ve cümle bütünündeki anlamına göre bu kelimenin bir insan ismi mi, bir şirket adımı olduğunu bulamayacak. Bu cümleler bir insana gösterilmiş olsaydı bunu kolaylıkla anlayabilirdi. Çünkü aynı anda tüm cümleyi birlikte görebiliyoruz. RNN geçmişteki bilgileri görebilirken gelecekteki bilgileri göremiyor.
Bu problemin çözümü için bidirectional RNN yapısı kullanılıyor. Öncelikle RNN mimarisinde yapılan hesaplamaların aynısını bidirectional RNN yapısında da benzer şekilde uyguluyoruz. Bu RNN mimarisi GRU veya LSTM de olabilir.

BRNN gelecekteki bilgileri görebilmek ve y çıkışlarını tahmin edilebilmesi için ileri ve geri yönlü işlemlerin tamamlanıp tüm hidden state değerlerinin hesaplanmış olması gerekiyor. Bu aşamada gerçekleşen işlem ileri ve geri yayılım sürecinden bağımsız olarak gerçekleşiyor.
İleri yönde hesaplanan forward states değerleri kendinden önceki forward state değerlerine bağlı, geri yönde hesaplanan backward state değeri ise yine kendinden önce gelen backward state değerine bağlı.Yani bir çıkış hesaplanırken hem geçmişteki hem de gelecekteki verilerden yararlanmış oluyoruz.
BRNN elimizde belli bir metnin olduğu durumlarda oldukça başarılı olurken anlık gerçekleşen serilerde gelecekteki bilgiye sahip olmadığımız için başarılı olamayacaktır. Bunu modeli geliştirirken göz önünde bulundurmalıyız.
Bu makalede en çok kullanılan rnn mimarilerini tanımış olduk. Sonraki yazımlarımda bütün bu mimarilerin gerçek bir uygulamada nasıl bir arada kullanılabileceğini göstermiş olacağım.
Murat.
nice 😊