Recurrent Neural Network Nedir?

Hamza Ergüder
7 min readJun 21, 2018

--

Photo by Franck V. on Unsplash

Recurrent Neural Networks (RNN) ‘ü anlayabilmek için önce feedforward(ileri doğru çalışan) bir ağın çalışma prensibini tekrar inceleyelim. Kısaca katmanlar üzerindeki nöronlara gelen bilgilere bir takım matematiksel işlemler uygulayarak çıktı üreten bir yapı diyebiliriz.

Feedforward çalışan yapıda gelen bilgi sadece ileri doğru işlenir. Bu yapıda kabaca, input verileri ağdan geçirilerek bir output değeri elde edilir. Elde edilen output değeri doğru değerler ile karşılaştırılarak hata elde edilir. Ağ üzerindeki ağırlık değerleri hataya bağlı olarak değiştirilir ve bu şekilde en doğru sonucu çıktı verebilen bir model oluşturulmuş olur.

FeedForward Neural Network Yapısı

Feedforward bir ağın eğitiminde hatanın yeterince düşürülmesi gerekir. Böylece nöronlara giden ağırlıklar yenilenerek girilen inputa uygun output verecek bir yapı oluşmuş olur.

Örneğin, bir fotoğraf üzerindeki nesneleri kategorize etmek için eğitilen feedforward bir ağ düşünelim. Verilen fotoğraf rastgele bir sıra ile de olsa hem eğitim hem de test için kullanılabilir. Bir önceki veya bir sonraki fotoğraf ile herhangi bir bağının olması gerekmez. Yani zamana veya sıraya bağlı bir kavram yoktur, ilgilendiği tek input o andaki mevcut örnektir.

Recurrent Neural Network Yapısı

Recurrent(yinelenen) yapılarda ise sonuç, sadece o andaki inputa değil, diğer inputlara da bağlı olarak çıkarılır. Şekilde de görüleceği gibi RNN’de t anındaki input verilerinin yanında, t-1 anından gelen hidden layer sonuçları da hidden layer’ın t anındaki girdisidir. t-1 anındaki input için verilen karar, t anında verilecek olan kararı da etkilemektedir. Yani bu ağlarda inputlar şimdiki ve önceki bilgilerin birleştirilmesi ile output üretirler.

Recurrent yapılar, outputlarını sonraki işlemde input olarak kullandıkları için feedforward yapılardan ayrılmış olurlar. Recurrent ağların bir belleğe sahip olduğunu söyleyebiliriz. Bir ağa memory eklemenin sebebi ise, belli bir düzende gelen input setinin, çıktı için bir anlamı olmasıdır. Bu çeşit data setleri için feedforward ağlar yeterli olmaz.

Tam bu noktada RNN’ler devreye girer. Yazı, konuşma, zamana bağlı çeşitli sensör veya istatiksel veriler gibi belli bir sıra ile gelen verilerin yapısını anlamada recurrent ağlar kullanılır.

RNN İşlem Döngüsü

Diagramda görüldüğü gibi , RNN’in işlem döngüsünde hidden layer’dan çıkan sonuç hem output üretir, hem content unitlere yazılır. Bu şekilde, her yeni input, önceki inputların işlenmesi sonucu üretilmiş content unitlerle birlikte işlenir. Farklı zamanlarda belleğe alınan veriler arasında korelasyon bulunuyorsa buna “long term” bağımlılık denir. RNN, bu long-term bağımlılıkların arasındaki ilişkiyi hesaplayabilen bir ağdır.

İnsanların davranışlarında, konuşma ve düşüncelerinde de bu yapıdaki gibi önceden memory’de olan bilgi tıpkı bir hidden layer’da yeni veri ile döngüye girerek işlenir. Bu işlemi yaparken kullanılan matemetiksel formül aşağıdaki gibidir.

ht, t anındaki hidden layer’ın sonucudur. xt inputu W ağırlığı ile çarpılır. Daha sonra t-1 anında, content unit ‘te tutulan h(t-1) değeri U ağırlığı ile çarpılır ve Wxt ile toplanır. W ve U değerleri girdi ile katman arasındaki ağırlıklardır. Burada ağırlık matrisi önceki ve şimdiki verinin hangisinin sonuca etkisi daha çok veya az ise ona göre değerler alır. Bu işlemler sonucunda oluşan hata hesaplanır ve backpropagation ile yeni ağırlık değerleri tekrar düzenlenir. Backprop işlemi hata yeterince minimize edilene kadar devam eder. Wxt + Uh(t-1) toplamı sigmoid, tanh gibi aktivasyon fonksiyonuna sokulur. Böylece çok büyük veya çok küçük değerler mantıklı bir aralığa alınır. Bu şekilde non-lineerlik de sağlanmış olur.

Örnek Bir Recurrent Neural Network

Aşçı Yemek Döngüsü

Bir aşçının 3 farklı yemeği sırasıyla yaptığını düşünelim. 1. gün pizza yaptıysa 2. gün sushi 3. gün waffle yapıyor olsun. Bir sonraki gün ne yapacağını tahmin etmemiz gerekiyorsa öncelikle nasıl bir problemle karşı karşıya olduğumuz anlayarak, bu probleme uygun bir metot kullanmamız gerekir. Burada yemek bir sıraya göre geldiği için, yani önceki gün yapılan yemeğin sonraki günde etkisi olacağı için uygulanması gereken metot recurrent neural network metodudur. Bu sayede elimizdeki bilgilerle yeni bilgi olmasa dahi birkaç hafta sonraki günde yapılacak yemeği dahi tahmin edebiliriz.

RNN yapısıyla örneğin incelenmesi

Backpropagation Trough Time(BPTT)

Recurrent ağların amacı sıralı inputları doğru bir şekilde sınıflandırmak diyebiliriz. Bu işlemleri yapabilmek için hatanın backpropunu ve gradient descentini kullanırız. Backprop, feedforward ağlarda sonda outputtaki hatayı geriye hatanın türevini ağırlıklara dağıtılarak yapılır. Bu türev kullanılarak öğrenme katsayısı, gradient descent düzenlenerek hatayı düşürecek şekilde ağırlıklar düzenlenir.

RNN için kullanılan yöntem ise BPTT diye bilinen zamana bağlı sıralı bir dizi hesaplamanın tümü için backprop uygulamasıdır. Yapay ağlar bir dizi fonksiyonu içiçe f(h(g(x))) şeklinde kullanır. Buraya zamana bağlı değişken eklendiğinde türev işlemi zincir kuralı ile çözümlenebilir.

RNN Backpropagation İşlem Döngüsü

Yukardaki RNN’in çalışma mantığı anlatılmıştır. Üstteki figürde ise sıralı 5 girdili bir recurrent ağ yapısı gösterilmektedir. E burada oluşan hatayı ifade etmektedir. Örneğin, E3 için backpropagation yaparken yaptığımız işlemde w ağırlığına göre türevi kullanılmaktadır. Bu türevi çözebilmek için zincir kuralı ile birkaç türevin çarpımını kullanırız.

Bu çarpım yukarıda gösterildiği gibidir. Burada s3’ün açılımında s2’ye bir bağımlılık bulunur. Bunu çözebilmek için yine zincir kuralını kullanarak s3’ün s2’ye türevini de ekleyerek sonucu bulabiliriz. Böylece formüldeki gibi gradient zamana bağlı şekilde dağıtılmış olur.

Truncated BPTT

Truncated BPTT ise BPTT ‘nin uzun bir sıralı veri için bir çok ileri, geri işlemler çok masraflı olacağından, BPTT için yaklaşım yapar. Bunun kötü yanı gradient kesilmiş hesaplandığından ağ “long term” bağımlılıkları full BPTT kadar iyi öğrenemez.

Vanishing/Exploding Gradient ( Gradient yokolması/uçması)

Gradient tüm ağırlıkları ayarlamamızı sağlayan bir değerdir. Ancak birbirine bağlı uzun ağlarda hatanın etkisi oldukça düşerek gradient kaybolmaya başlayabilir. Bu da doğru sonucu bulmayı olanaksızlaştırır. Bütün katmanlar ve zamana bağlı adımlar birbirine çarpımla bağlı olduğundan, türevleri yokolma veya uçma yani aşırı yükselme tehlikesindedir.

Sigmoid Aktivasyon Fonksiyonunun Türeve Bağlı Değişimi

Gradient exploding yani aşırı büyümesi ağın çok büyük değerler üretmesini sağlayarak doğru sonuçtan uzaklaştıracaktır. Bunun için threshold koyarak çok yüksek değerli gradientleri kesmek basit ve etkili yollardan biridir. Gradientlerin aşırı küçülerek yokolması ise çok daha zor bir problemdir. Nerde, ne zaman durdurulması gerektiği çok açık değildir.

Neyse ki bu sorunu çözmek için de birkaç çözüm bulunmaktadır. W için uygun başlangıç değerleri seçmek yokolma etkisini azaltacaktır. Bir diğer çözüm ise sigmoid ve tanh aktivasyon fonksiyonları yerine ReLU kullanmaktır. ReLU fonksiyonunun türevi 0 veya 1’dir. Bu sebepten böyle bir problem içerisine girmeyecektir. Bir diğer yöntem ise bu problemi çözmek için dizayn edilmiş olan LSTM metodudur.

Long Short Term Memory (LSTM)

Sepp Hochreiter ve Juergen Schmidhuber 1997 yılında vanishing gradient problemini çözmek için LSTM’i geliştirdiler. Daha sonra birçok kişinin katkısıyla düzenlenen ve popülerleşen LSTM şu anda geniş bir kullanım alanına sahiptir.

LSTM backprop’ta farklı zaman ve katmanlardan gelen hata değerini korumaya yarıyor. Daha sabit bir hata değeri sağlayarak recurrent ağların öğrenme adımlarının devam edebilmesini sağlamaktadır. Bunu sebep sonuç arasına yeni bir kanal açarak yapmaktadır.

LSTM Network Yapısı

LSTM yapısında tekrar eden modülün farkı tek bir neural network katmanı yerine, özel bir şekilde bağlı 4 katman bulunmasıdır. Bu katmanlara kapı da denmektedir. Normal akışın dışında dışarıdan bilgi alan bir yapıdır. Bu bilgiler depolanabilir, hücreye yazılabilir, okunabilir.

Hücre neyi depolayacağını, ne zaman okumasına, yazmasına veya silmesine izin vereceğini kapılar sayesinde karar verir. Bu kapılarda bir ağ yapısı ve aktivasyon fonksiyonu bulunmaktadır. Aynı nöronlarda olduğu gibi gelen bilgiyi ağırlığına göre geçirir veya durdurur. Bu ağırlıklar recurrent ağın öğrenmesi sırasında hesaplanır. Bu yapı ile hücre, datayı alacak mı bırakacak mı silecek mi öğrenir.

Aşağıdaki diyagramlarda bir LSTM hücresi adım adım anlatılmıştır.

Temel RNN gösterimi

Birinci diyagramda normal RNN çalışma sistemi gösterilmiştir. İkinci diyagramda ise birinciden farklı olarak hücreye bellek eklenmiştir. Bunu yaparak, uzun süre önceki verileri de kullanarak karar verilmektedir.

Memory Birimi

Diyagramda görülen + işareti element bazda toplama işlemini göstermektedir. x işareti ise element bazda çarpım işlemidir. Element bazda yapılan çarpma işlemi ile verinin hangisinin ne kadar kullanılıp kullanılmayacağı, bellekteki verilerin ağırlıklarla çarpılması ile hesaplanır. Daha sonra + işlemi ile bellekten gelen ile olasılıktan gelen toplanarak bir tahmin üretilir.

Selection Birimi

Bu diyagramda ise yeni bir kapı daha eklenmiştir. Bu kapı toplama işlemi yapıldıktan sonra hangisini ne kadar kullanacağımızı seçmek için bir filtre bir bölümdür. Bu bölümde bellekte verileri tutup tahminden ayırma işlemi yapılır. Yine bu kapı da kendine özgü bir neural networke sahiptir.

Ignoring Birimi

Bir diğer kapı ise yine ilk gelen olasılıkları bellekten gelenlerle toplamadan önce filtreleme için kullanılır. Yine burada da bir ağ yapısı vardır. Gelen sonuçlar element bazda çarpılarak diğer işleme geçer. Böylece belleğe gitmesi gerekmeyen veriler filtrelenmiş olurlar.

LSTM’in farklı ihtiyaçlara göre farklı modelleri bulunmaktadır. Bunlar yukarıda söylediğimiz kapıların girdilerini farklı yerlerden alması veya çıktılarını farklı yerlere göndermesi ile sağlanmıştır.

--

--

Hamza Ergüder

PhD / Machine Learning / React & React Native / Robotics