Recurrent vs Recursive Neural Networks: Które rozwiązanie jest lepsze dla NLP?

48

Istnieją rekurencyjne sieci neuronowe i rekurencyjne sieci neuronowe. Oba są zwykle oznaczone tym samym akronimem: RNN. Według Wikipedii , Rekurencyjne NN są w rzeczywistości Rekurencyjne NN, ale tak naprawdę nie rozumiem wyjaśnienia.

Co więcej, wydaje mi się, że nie znajduję lepszego (z przykładami) dla przetwarzania w języku naturalnym. Faktem jest, że chociaż Socher używa Recursive NN dla NLP w swoim samouczku , nie mogę znaleźć dobrej implementacji rekurencyjnych sieci neuronowych, a kiedy szukam w Google, większość odpowiedzi dotyczy Recurrent NN.

Poza tym, czy istnieje inna nazwa DNN, która lepiej pasuje do NLP, czy zależy to od zadania NLP? Sieci głębokiego przekonania czy autoakodery piętrowe? (Wydaje mi się, że nie znajduję żadnego konkretnego zastosowania dla ConvNets w NLP, a większość implementacji dotyczy maszyn.)

Wreszcie, naprawdę wolałbym implementacje DNN dla C ++ (jeszcze lepiej, jeśli ma obsługę GPU) lub Scali (lepiej, jeśli ma obsługę Spark) niż Python lub Matlab / Octave.

Próbowałem Deeplearning4j, ale jest w ciągłym rozwoju, a dokumentacja jest trochę przestarzała i nie mogę sprawić, by działała. Szkoda, bo ma „czarną skrzynkę” jak sposób robienia rzeczy, bardzo podobny do scikit-learn lub Weka, czego naprawdę chcę.

crscardellino
źródło

Odpowiedzi:

42

Nawracające sieci neuronowe powtarzają się z czasem. Na przykład, jeśli masz sekwencję

x = [„h”, „e”, „l”, „l”]

Ta sekwencja jest podawana do pojedynczego neuronu, który ma pojedyncze połączenie ze sobą.

W kroku czasu 0 jako literę podaje się literę „h”, a w kroku 1 „e” - jako literę wejściową. Sieć po rozłożeniu w czasie będzie wyglądać tak.

RNN

Sieć rekurencyjna to tylko uogólnienie sieci rekurencyjnej. W sieci powtarzalnej wagi są dzielone (a wymiarowość pozostaje stała) na całej długości sekwencji, ponieważ w jaki sposób radziłbyś sobie z wagami zależnymi od pozycji, gdy napotkasz sekwencję w czasie testu o różnej długości w stosunku do tej, którą widziałeś w czasie pociągu . W sieci rekurencyjnej wagi są dzielone (a wymiarowość pozostaje stała) w każdym węźle z tego samego powodu.

Oznacza to, że wszystkie wagi W_xh będą równe (wspólne), podobnie jak waga W_hh. Jest tak po prostu dlatego, że jest to pojedynczy neuron, który rozwinął się w czasie.

Tak wygląda rekurencyjna sieć neuronowa . Rekurencyjna sieć neuronowa

Łatwo jest zrozumieć, dlaczego nazywa się to Rekurencyjną Siecią Neuronową. Elementy potomne każdego węzła nadrzędnego są po prostu węzłem podobnym do tego węzła.

Sieć neuronowa, z której chcesz korzystać, zależy od sposobu użytkowania. Na blogu Karpathy generuje postacie pojedynczo, więc nawracająca sieć neuronowa jest dobra.

Ale jeśli chcesz wygenerować drzewo parsowania, lepiej jest użyć Rekurencyjnej Sieci Neuronowej, ponieważ pomaga w tworzeniu lepszych reprezentacji hierarchicznych.

Jeśli chcesz przeprowadzić głębokie uczenie się w c ++, użyj CUDA. Ma niezłą bazę użytkowników i jest szybki. Nie wiem więcej na ten temat, więc nie mogę komentować więcej.

W Pythonie Theano jest najlepszą opcją, ponieważ zapewnia automatyczne różnicowanie, co oznacza, że ​​kiedy tworzysz duże, niewygodne NN, nie musisz ręcznie szukać gradientów. Theano robi to automatycznie dla Ciebie. Brakuje tej funkcji Torch7.

Theano jest bardzo szybki, ponieważ zapewnia owijki C do kodu Pythona i może być zaimplementowany na GPU. Ma także niesamowitą bazę użytkowników, co jest bardzo ważne podczas nauki czegoś nowego.

Azrael
źródło
11

Duże nawracające sieci neuronowe są uważane za być może najmocniejszy model NLP. Świetny artykuł napisany przez A. Karpathy na temat nawracających sieci neuronowych i modelowania poziomu postaci jest dostępny na stronie http://karpathy.github.io/2015/05/21/rnn-effectiveness/

Po wypróbowaniu dużej liczby bibliotek do głębokiego uczenia się (theano, caffe itp.). Zdecydowanie polecam użycie Torch7, która jest uważana za najnowocześniejsze narzędzie dla NN i obsługiwana przez NYU, Facebook AI i Google DeepMind. Torch7 jest oparty na lua i istnieje tak wiele przykładów, z którymi można łatwo się zapoznać. Dużo kodu można znaleźć na github, dobrym początkiem byłoby https://github.com/wojzaremba/lstm .

Na koniec piękno lua polega na tym, że LuaJIT można bardzo łatwo wstrzykiwać w Javie, Python, Matlab itp.

Yannis Assael
źródło
2
Zaproponuj czytanie bloga Karpathy. Naprawdę obszerne w zrozumieniu RNN.
SolessChong,
1

Nawracające sieci neuronowe (RNN) zasadniczo rozwijają się z czasem. Służy do wprowadzania sekwencyjnego, w którym czynnik czasu jest głównym czynnikiem różnicującym elementy sekwencji. Na przykład, tutaj jest cykliczna sieć neuronowa używana do modelowania języka, która rozwijała się z czasem. Na każdym kroku czasu, oprócz danych wprowadzonych przez użytkownika w tym kroku czasu, akceptuje również wyjście warstwy ukrytej, które zostało obliczone w poprzednim kroku czasu.

RNN


Rekurencyjne sieci neuronowe są bardziej jak sieć hierarchiczna, w której tak naprawdę nie ma aspektu czasu w sekwencji wejściowej, ale dane wejściowe muszą być przetwarzane hierarchicznie w formie drzewa. Oto przykład, jak wygląda rekurencyjna sieć neuronowa. Pokazuje sposób uczenia się parsowania drzewa zdania poprzez rekurencyjne pobieranie wyniku operacji wykonanej na mniejszym fragmencie tekstu.

Rekurencyjne sieci neuronowe


[ UWAGA ]:

LSTM i GRU to dwa rozszerzone typy RNN z bramką „zapominania”, które są bardzo powszechne w NLP.

LSTM

LSTM i GRU


Formuła komórek LSTM:

wprowadź opis zdjęcia tutaj

Benyamin Jafari
źródło