rnn

Rnn kullanarak bir dil modelleme nasıl yapılabilir konusuna geçmeden önce farklı rnn mimarileri nelerdir onlardan bashetmek istiyorum.

Rnn Tipleri – Source: http://karpathy.github.io/2015/05/21/rnn-effectiveness/

Giriş dizisi boyutunun çıkış dizisi boyutuna eşit olduğu durum olduğu gibi farkı ihtiyaçlar ve kullanım alanlarına göre giriş dizisinin çıkış dizisine eşit olmadığı durumlarda vardır. Bu nedenle farklı RNN tipleri ortaya çıkmıştır.

One to one: Bu tip rnn’de t anı için bir girişimiz ve o ana ait bir çıkışımız var. Önceki ve sonraki anlar yok. Bu mimari için x(t) =y(t) diyebiliriz. Bu mimariye örnek olarak resim sınıflandırmayı verebiliriz. Giriş olarak bir resim alıyoruz çıktı olarak ise o resmin sınıfını döndürüyoruz.

One to many: Bu rnn türünde girişimiz tek bir t anına ait bir giriştir, çıkışımızda ise o an ve sonraki anlara ait bilgiler üretilir. Bu mimariye örnek olarak Image Captioning‘i verebiliriz. Input olarak resim veriyoruz output olarak o resimde neler olduğunu anlatan kelimeler alıyoruz.

Many to one: Bu mimaride birden fazla input verip tek bir output alıyoruz. Many to one mimarisine örnek olarak sentiment analysis olabilir. Sentiment analysis’te rnn’e bir metin veriyoruz. Sonuç olarak bu yazının olumlu ya da olumsuz olup olmadığını tahmin edip bir output üretmesini bekliyoruz.

Many to many: Many to many mimarisinde input ve output sayılarımız birden fazla ve birbirinden farklı olabilir. Bu mimariye örnek olarak text summarization veya machine translation verebiliriz. Input olarak uzun bir text verip output olarak kısa bir text bekliyoruz.

Bunun dışında ikinci bir many to many mimarisi daha var. Buradaki fark ise her inputtan sonra bir output üretilmesi. Önceki many to many örneğinde önce inputlar işleniyor daha sonra output üretiliyor. Örneğin input bir video olabilir videonun her karesinde bir sınıflandırma yapmak istiyor olabiliriz. Bu durumda bu many to many stilini kullanabiliriz.

I want to sell my phone.

My cell phone has been broken.

RNN ile Dil Modeli Üretimi

Yukarıdaki iki cümleyi incelediğimizde sell ve cell kelimelerinin anlamlarının farklı okunuşlarının aynı olduğunu görüyoruz. İngilizcede bu türlü sözcüklere homophones kelimeler deniyor. İki sözcüğün metinlerde geçme sıklığına göre kullanılma olasılığını bulabiliriz.

P(I want to sell my phone.) = 6.7×10-7

P(My cell phone has been broken.)= 1.7×10-13

Yukarıdaki gibi sell kelimesinin metinde bulunma olasılığı daha yüksek olabilir. Ek olarak sell kelimesinden sonra gelen kelimenin sell kelimesiyle birlikte bulunma olasılığına bakmamız gerekiyor. Buna göre cümlenin tamamının olasılığına bulmaya çalıştığımızda  P(cümle) = (y1,y2,….,yty) her bir kelime için y çıkışını belirtmemiz gerekiyor.

Kelimeleri token haline getirirken fazladan <EOS> (End Of Sentence)tokeni eklememiz gerekiyor. EOS tokeni cümlenin bittiğini gösteren işarettir. Cümlelerdeki noktalama işaretlelerini de birer token olarak kabul ediyoruz.

In American Indian mythology the lynx is considered a ‘keeper of secrets’.<EOS>

Cümlede geçen lynx kelimesi sözlükte bulunması zor bir sözcüktür. Bazı özel kelimeler sözlükteki az kelime sayısından dolayı bulunmayabilir. Bu durumda sözlükte bulunmayan kelimeler Unknown(UNK) sözcükler olarak geçer.

Yukarıdaki cümle için RNN modeli oluşturmaya çalışırsak;

h sıfır vektörü, x(1) girdimiz ise 0, bunun nedeni ilk anda cümlemizin ilk kelimesini bilmiyoruz daha öncede bir değer olmadığı için sıfır alıyoruz. h(1) değeriyle beraber y(1) sonucunu tahmin ediyoruz. İlk kelimeyi tahmin edebilmek için oluşturduğumuz kelime havuzuna bakıyoruz. Bu sözcüklerden herhangi biri y(1) çıkışı için bir aday olarak düşünebiliriz. y(1) çıkışında softmax kullanılarak olasılık hesaplanıyor.

Sonraki zaman adımında tahmin ettiğimiz y(1) değerini input olarak kullanıyoruz. Input olarak “In” kelimesini kullanarak “In” kelimesinden sonra gelebilecek olan kelimelere bakıyoruz. Sırasıyla In kelimesinden sonra “American” kelimesinin gelme olasılığı, “In American Indian” kelimeleriden sonra “mythology” kelimesinin gelme olasılığı hesaplıyoruz.

Örneğin cümlemizdeki ilk iki kelimeden sonra üçüncü kelimenin ne olduğunu bulabilmek için;

P ( y(1) ,y(2) ,y(3) ) = P ( y(1) ) * P ( y(1) | y(2) * P ( y(1) | y(2) | y(3) )

olasılıklarını çarpıyoruz. (Andrew Ng – Language model and sequence generation coursera course notes)

Bu şekilde EOS tokenı alıncaya kadar yani cümlenin bitmiş olma olasılığına kadar dizi devam ediyor. Bu durumdan kelime sıralamasının, bir önceki kelimenin bir sonraki kelimeye, bir kelimenin kendisinden önceki tüm kelimelere etkisi olduğunu anlıyoruz. RNN her bir zaman adımında bir kelime öğrenmiş oluyor. Tüm anlarda gerçekleşen loss değerleri Loss fonksiyonu kullanılarak toplanıyor. Gerçekleşen loss değerlerini bulabilmek için gerçek değerimizle tahmin edilen değeri karşılaştırıyoruz.

Girişlerimizde her zaman adımında bir kelime aldığı için bu modelin tamamına kelime bazlı dil modeli deniyor. Bu modelin bir dezavantajı input’larda verdiğimiz kelime sözlüğümüzde yoksa bu kelime Unknown olarak geçiyor ve kendinden sonra gelen kelimelerde olasılık hesaplamalarında bozulmalara yol açıyor. Bu sorunun çözümü için çok verimli olmasa da karakter seviyeli dil modeli kullanılabilir.Karakter seviyeli dil modeli kullanarak sözlükte bulunmayan kelimeleri bulabiliriz. Bu en önemli avantajı olarak öne çıkıyor. En önemli dezavantajı ise karakter bazlı olduğu için artan işlem sayısı ve kaynak problemleri.

Exploding ve Vanishing Gradient Problemleri

RNN mimarisinde CNN’de de olduğu gibi öğrenme geri yayılım sürecinde gerçekleşir. Bu süreçte Cost fonksiyonundan alınan değerle gerçek değer karşılaştırılır. Bunun sonucunda geri yayılım Weight ve bias değerlerini güncelleyebilmek için Gradient Descent gibi bir optimizasyon algoritması kullanılır. RNN de geri yayılım aşamasında iki Gradient problemiyle karşılaşılıyor. RNN hücrelerindeki W ve bias değerlerini güncelleyebilmek için Loss’a göre türev almak istediğimizde her hücre içinde W matrisiyle çarpma işlemi yapıyoruz. W matrisi tüm hücrelerde aynı değere sahip. Bir değeri sürekli kendisiyle çarptığımızda 2 durum oluşuyor. Eğer bu değer birden büyükse kısa sürede çok büyük değerlere ulaşır bu duruma Exploding Gradient deniyor. Eğer birden küçükse küçülerek devam edecek ve kaybolma noktasına gelecektir. Bu duruma da Vanishing Gradient deniyor. Daha büyük networklerde çarpma işleme çok daha fazla olacaktır. Bu durumda bu problemlerle karşılaşma olasılığımız artacaktır.

Exploding Gradient problemini çözmek için Gradient Clipping gibi bir yöntem kullanılabilir. Bu yöntemde bir threshold belirleniyor ve Gradient’ın bu değeri geçmesine engel olunuyor. Bu yöntem basit RNN’de sıkça kullanılıyor. Vanishing Gradient için basit RNN de bir çözüm bulunmuyor. Bu problemle karşılaşılırsa farklı bir RNN tipi denenmesi gerekiyor. Bu problemlerin giderilebilmesi için LSTM ve GRU gibi RNN çeşitleri kullanılmalıdır.

Bu yazımda farklı rnn mimarileri,rnn kullanarak dil modeli nasıl yapılıyor görmüş olduk. Bunun yanında rnn kullandığımızda oluşabilecek problemlere değindik. Sonraki yazılarımda LSTM ve GRU gibi rnn çeşitlerinden bahsediyor olacağım.

Murat.

By mgm

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir