Zaman içinde kesilmiş geri yayılım (RNN / LSTM) kullanırken ilk kalıpların yakalanması


12

Çoktan bire yaklaşım olan duyarlılık analizi yapmak için bir RNN / LSTM kullandığımı varsayalım ( bu bloga bakınız ). Ağ, zaman içinde kesilmiş bir geri yayılım (BPTT) ile eğitilir; burada ağ, her zamanki gibi son 30 adımda açılır.

Benim durumumda sınıflandırmak istediğim metin bölümlerimin her biri, açılmakta olan 30 adımdan (~ 100 kelime) çok daha uzun. Bildiğim dayanarak BPTT sadece tüm metin bölümünün üzerine geçti ve ikili sınıflandırma hedefi, bilgisayarlı zaman olduğu tek bir metin bölümü için tek bir defa çalıştırılır o zaman hatayı bulmak için kayıp fonksiyonuna karşılaştırır.y

Degradeler daha sonra her bir metin bölümünün ilk kelimeleri ile ilgili olarak asla hesaplanmaz. RNN / LSTM daha sonra sadece ilk birkaç kelimede meydana gelen belirli kalıpları yakalamak için ağırlıklarını nasıl ayarlayabilir? Örneğin, olarak işaretlenen tüm cümlelerin "Bunu seviyorum" ile başladığını ve olarak işaretlenen tüm cümlelerin "Bundan nefret ediyorum" ile başladığını varsayalım. RNN / LSTM, sadece son 30 adımda açıldığında 100 adımlık bir dizinin sonuna geldiğinde bunu nasıl yakalar?positivenegative


genellikle, Kısaltma Zaman İçinde Kesik Geri Yayılım için TBPTT'dir.
Charlie Parker

Yanıtlar:


11

Degrade yayılımınızı 30 zaman adımıyla sınırlamanın , veri kümenizde mümkün olan her şeyi öğrenmesini engelleyeceği doğrudur . Ancak, veri setinize, bunun modelinizdeki özellikler hakkında önemli şeyler öğrenmesini engelleyip engellemeyeceğine kesinlikle bağlıdır!

Eğitim sırasında gradyanı sınırlamak, modelinizin giriş özelliklerini ve gizli durumu yüksek güvenle asimile edebileceği pencereyi sınırlamak gibidir. Test zamanında modelinizi tüm giriş sırasına uyguladığınızdan, tüm giriş özellikleri hakkındaki bilgileri gizli durumuna dahil edebilecektir. Cümle için son tahminini yapana kadar bu bilgilerin nasıl korunacağını tam olarak bilemeyebilir , ancak yine de yapabileceği bazı (kuşkusuz daha zayıf) bağlantılar olabilir.

Öncelikle tartışmalı bir örnek düşünün. Ağınızın, girişinde herhangi bir yerde 1, aksi takdirde 0 varsa, varsayalım. Ağı 20 uzunluk dizileri üzerinde eğittiğinizi ve daha sonra degradeyi 10 adımla sınırlandırdığınızı varsayalım. Eğitim veri kümesi bir girişin son 10 adımında asla 1 içermiyorsa, ağın herhangi bir yapılandırmanın test girişleriyle ilgili bir sorunu olacaktır. Ancak, eğitim setinde [1 0 0 ... 0 0 0] gibi bazı örnekler ve [0 0 0 ... 1 0 0] gibi diğer örnekler varsa, ağ " girişinin herhangi bir yerinde 1 "özellik.

O zaman duygu analizine dön. Eğitim sırasında modelinizin "bundan nefret ediyorum çünkü ... etrafında ve etrafında" gibi uzun bir negatif cümle ile karşılaşacağını varsayalım, elips şeklinde 50 kelime. Gradyan yayılımını 30 zaman adımıyla sınırlandırarak, model "bundan nefret ediyorum, çünkü" çıkış etiketine bağlamaz, bu nedenle bu eğitimden "I", "nefret" veya "bu" kelimelerini almaz misal. Fakat cümlenin sonundan itibaren 30 zaman aralığında olan kelimeleri alacaktır. Eğitim setinizde aynı kelimeleri içeren, muhtemelen "nefret" ile birlikte başka örnekler de varsa, "nefret" ile negatif duygu etiketi arasındaki bağlantıyı alma şansı vardır. Ayrıca, daha kısa eğitim örnekleriniz varsa, "Korkunç olduğu için bundan nefret ediyoruz!" Deyin. modeliniz "nefret" ve "bu" özellikleri hedef etikete bağlayabilecektir. Bu eğitim örneklerinden yeterince fazlasına sahipseniz, model bağlantıyı etkili bir şekilde öğrenebilmelidir.

Test zamanında, diyelim ki modeli "Bundan nefret ediyorum çünkü ... gecko'da!" Modelin girdisi, bazı şekillerde modelin gizli durumuna geçirilecek olan "Bundan nefret ediyorum" ile başlayacaktır. Bu gizli durum, modelin gelecekteki gizli durumlarını etkilemek için kullanılır, bu yüzden cümlenin bitiminden önce 50 kelime olsa da, bu ilk kelimelerden gelen gizli durum, asla olmasa bile çıktıyı etkileme konusunda teorik bir şansa sahiptir. "Bundan nefret ediyorum" ve cümlenin sonu arasında bu kadar geniş bir mesafe içeren örnekler üzerinde eğitildi.


0

@ Imjohns3 haklı, uzun dizileri (N boyutu) işlerseniz ve backpropagation'ı son K adımlarıyla sınırlandırırsanız, ağ başlangıçta kalıpları öğrenmez.

Uzun metinlerle çalıştım ve her K adımından sonra kaybı hesapladığım ve backpagagation yaptığım yaklaşımı kullanıyorum . Dizimin N = 1000 jetonu olduğunu varsayalım, RNN işlemim önce K = 100 sonra tahmin (hesaplama kaybı) ve backpropagate yapmaya çalışıyorum. Daha sonra RNN durumunu korurken degrade zincirini (pitorch-> ayırma) frenleyin ve başka bir k = 100 adım başlatın.

Bu tekniğe iyi bir örnek burada bulabilirsiniz: https://github.com/ksopyla/pytorch_neural_networks/blob/master/RNN/lstm_imdb_tbptt.py

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.