Sürekli vs Özyinelemeli Yapay Sinir Ağları: NLP için hangisi daha iyi?


48

Tekrarlayan Sinir Ağları ve Özyinelemeli Sinir Ağları vardır. Her ikisi de genellikle aynı kısaltma ile gösterilir: RNN. Wikipedia'ya göre , Recurrent NN aslında Recursive NN'dir, ancak açıklamayı gerçekten anlamıyorum.

Dahası, Doğal Dil İşleme için hangisinin daha iyi olduğunu (örneklerle ya da öylesine) bulmuyorum. Gerçek şu ki, Socher öğreticisinde NLP için Recursive NN kullanıyor olsa da , özyinelemeli sinir ağlarının iyi bir uygulamasını bulamıyorum ve Google’da arama yaparken, yanıtların çoğunun Recurrent NN ile ilgili olduğu yönünde.

Bunun yanında, NLP için daha iyi uygulanan bir DNN var mı, yoksa NLP görevine mi bağlı? Derin İnanç Ağları veya Yığınlı Otomatik Kodlayıcılar? (NLP'deki ConvNets için herhangi bir özel kullanım bulmuyorum ve uygulamaların çoğu akılda makine vizyonuna sahip).

Son olarak, Python veya Matlab / Octave yerine C ++ (GPU desteği varsa daha iyi) veya Scala (Spark desteği varsa daha iyi) için DNN uygulamalarını gerçekten tercih ederim.

Deeplearning4j'yi denedim, ancak sürekli geliştirilme aşamasında ve belgeler biraz modası geçmiş ve çalışması için çalışamıyorum. Çok kötü, çünkü "kara kutu" gibi şeyler yapmayı seviyor, tıpkı scikit-learn ya da Weka gibi.

Yanıtlar:


42

Tekrarlayan Sinir ağları zaman içinde tekrar ediyor. Örneğin, bir diziniz varsa

x = ['h', 'e', ​​'l', 'l']

Bu sekans, kendine tek bir bağlantısı olan tek bir nörona beslenir .

0 adımında, 'h' harfi girdi olarak verilir. 1 adımında, 'e' girdi olarak verilir. Zamanla açıldığında ağ bu şekilde görünecektir.

RNN

Bir özyinelemeli ağ sadece bir tekrarlayan ağın genellemesidir. Tekrarlayan bir ağda ağırlıklar sekansın uzunluğu boyunca paylaşılır (ve boyutluluk sabit kalır), çünkü tren zamanında gördüğünüz herhangi birinden farklı uzunluktaki test sırasında bir sekansla karşılaştığınızda pozisyona bağlı ağırlıklarla nasıl başa çıkacaksınız? . Özyinelemeli bir ağda ağırlıklar aynı nedenden ötürü her düğümde paylaşılır (ve boyutluluk sabit kalır).

Bu, tüm W_xh ağırlıklarının eşit olacağı (paylaşıldığı) ve böylece W_hh ağırlık olacağı anlamına gelir. Bunun nedeni, zamanla ortaya çıkan tek bir nöron olması.

Bir özyinelemeli sinir ağına benziyor budur. Özyinelemeli Sinir Ağı

Neden bir Özyinelemeli Sinir Ağı dendiğini görmek oldukça basittir. Her bir ana düğümün çocukları, basitçe o düğüme benzer bir düğümdür.

Kullanmak istediğiniz Yapay sinir ağı kullanımınıza bağlıdır. In karpathy blogunda bir tekrarlayan sinir ağı iyi yani, o bir karakterler teker teker oluşturuyor.

Ancak, bir ayrıştırma ağacı oluşturmak istiyorsanız, bir Özyinelemeli Sinir Ağı kullanmak daha iyidir çünkü daha iyi bir hiyerarşik temsiller oluşturmaya yardımcı olur.

C ++ 'da derinlemesine öğrenme yapmak istiyorsanız, CUDA kullanın. Güzel bir kullanıcı tabanı var ve hızlı. Daha fazla bilgim yok, bu yüzden daha fazla yorum yapamam.

Python'da, Theano en iyi seçenektir çünkü otomatik farklılaşma sağlar, yani büyük, garip NN'ler oluştururken, elle degradeler bulmak zorunda kalmazsınız. Theano sizin için otomatik olarak yapar. Bu özellik Torch7 tarafından bulunmuyor.

Theano, Python koduna C sarmalayıcıları sağladığı ve GPU'lara uygulanabildiği için çok hızlıdır. Ayrıca yeni bir şey öğrenirken çok önemli olan harika bir kullanıcı tabanına sahiptir.


11

Büyük Tekrarlayan Yapay Sinir Ağları, NLP için belki de en güçlü model olarak kabul edilir. A. Karpathy'nin Tekrarlayan Sinir Ağları ve karakter seviyesi modellemesi üzerine yazdığı harika bir makale http://karpathy.github.io/2015/05/21/rnn-effectiveness/ adresinde bulunabilir.

Derin öğrenme (theano, caffe vs.) için çok sayıda kütüphane denedi. NN'ler için en gelişmiş araç olarak kabul edilen ve NYU, Facebook AI ve Google DeepMind tarafından desteklenen Torch7'yi kullanmanızı şiddetle tavsiye ederim. Torch7 Lua'ya dayanmaktadır ve kolayca aşina olabileceğiniz pek çok örnek vardır. Github'da birçok kod bulunabilir, iyi bir başlangıç https://github.com/wojzaremba/lstm olacaktır .

Son olarak, lua'nın güzelliği LuaJIT'in Java, Python, Matlab vb.


2
Karpathy'nin blogunu okumanızı önerin. RNN'yi anlamakta gerçekten çok sakıncalı.
SolessChong

1

Tekrarlayan Sinir Ağları (RNN) temel olarak zamanla ortaya çıkar. Zaman faktörünün, dizinin elemanları arasındaki ana ayırt edici faktör olduğu sıralı girişler için kullanılır. Örneğin, burada zamanla ortaya çıkan dil modellemesi için kullanılan tekrarlayan bir sinir ağı var. Her zaman adımında, o zaman adımındaki kullanıcı girişine ek olarak, önceki zaman adımında hesaplanan gizli katmanın çıkışını da kabul eder.

RNN


Özyinelemeli Bir Sinir Ağları daha çok giriş sırasına göre hiçbir zaman yönü bulunmadığı ancak girişin ağaç şeklinde hiyerarşik olarak işlenmesi gereken hiyerarşik bir ağ gibidir. Özyinelemeli bir sinir ağının nasıl göründüğüne bir örnek. Metnin daha küçük bir bölümünde gerçekleştirilen işlemin çıktısını tekrar tekrar alarak cümle ayrıştırma ağacını öğrenmenin yolunu gösterir.

Özyinelemeli Sinir Ağları


[ NOT ]:

LSTM ve GRU , NLP'de oldukça yaygın olan unu kapısına sahip iki genişletilmiş RNN tipidir.

LSTM

LSTM ve GRU


LSTM Hücre Formülü:

görüntü tanımını buraya girin

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.