Рекуррентные и рекурсивные нейронные сети: что лучше для НЛП?

48

Существуют рекуррентные нейронные сети и рекурсивные нейронные сети. Оба обычно обозначаются одной и той же аббревиатурой: RNN. Согласно Википедии , Рекуррентный NN на самом деле является Рекурсивным NN, но я не совсем понимаю объяснение.

Более того, я не могу найти, что лучше (с примерами или около того) для обработки естественного языка. Дело в том, что хотя в своем уроке Сочер использует Recursive NN for NLP , я не могу найти хорошую реализацию рекурсивных нейронных сетей, и при поиске в Google большинство ответов касаются Recurrent NN.

Кроме того, есть ли другой DNN, который лучше подходит для NLP, или это зависит от задачи NLP? Сети глубокого убеждения или многоуровневые автоэнкодеры? (Кажется, я не нахожу какой-либо конкретной утилиты для ConvNets в NLP, и большинство реализаций ориентированы на машинное зрение).

Наконец, я бы действительно предпочел реализации DNN для C ++ (еще лучше, если он поддерживает GPU) или Scala (лучше, если он поддерживает Spark), а не Python или Matlab / Octave.

Я пробовал Deeplearning4j, но он постоянно развивается, и документация немного устарела, и я не могу заставить ее работать. Жаль, потому что у него есть «черный ящик», похожий на способ ведения дел, очень похожий на scikit-learn или Weka, чего я и хочу.

crscardellino
источник

Ответы:

42

Периодические Нейронные сети повторяются со временем. Например, если у вас есть последовательность

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

Эта последовательность подается на один нейрон, который имеет единственную связь с самим собой.

На шаге времени 0 буква «h» задается как ввод. На шаге времени 1 «е» вводится как вход. Сеть в разложенном виде со временем будет выглядеть так.

РНН

Рекурсивная сеть - это просто обобщение рекуррентной сети. В рекуррентной сети веса распределяются (и размерность остается постоянной) по длине последовательности, потому что, как бы вы справились с позиционно-зависимыми весами, когда вы сталкиваетесь с последовательностью во время теста, отличающейся от любой, которую вы видели во время поезда , В рекурсивной сети веса распределяются (и размерность остается постоянной) в каждом узле по той же причине.

Это означает, что все веса W_xh будут равны (разделены), и поэтому будет вес W_hh. Это просто потому, что это один нейрон, который был развернут во времени.

Так выглядит рекурсивная нейронная сеть . Рекурсивная нейронная сеть

Довольно просто понять, почему она называется рекурсивной нейронной сетью. Дочерние элементы каждого родительского узла - это просто узел, похожий на этот узел.

Нейронная сеть, которую вы хотите использовать, зависит от вашего использования. В блоге Карпати он генерирует персонажей по одному, поэтому периодическая нейронная сеть хороша.

Но если вы хотите сгенерировать дерево разбора, то лучше использовать рекурсивную нейронную сеть, поскольку она помогает создавать лучшие иерархические представления.

Если вы хотите углубленно изучать c ++, используйте CUDA. Он имеет хорошую базу пользователей и работает быстро. Я не знаю больше об этом, поэтому не могу комментировать больше.

В Python Theano - лучший вариант, потому что он обеспечивает автоматическое дифференцирование, что означает, что когда вы формируете большие, неуклюжие NN, вам не нужно находить градиенты вручную. Theano делает это автоматически для вас. Эта функция отсутствует в Torch7.

Theano очень быстр, поскольку он предоставляет оболочки C для кода Python и может быть реализован на графических процессорах. У него также есть отличная база пользователей, что очень важно при изучении чего-то нового.

Azrael
источник
11

Крупные рекуррентные нейронные сети считаются, пожалуй, самой мощной моделью для НЛП. Отличная статья, написанная А. Карпати о рекуррентных нейронных сетях и моделировании уровня персонажа, доступна по адресу http://karpathy.github.io/2015/05/21/rnn-effectiveness/

Перепробовал большое количество библиотек для глубокого изучения (theano, caffe и т. Д.). Я настоятельно рекомендую использовать Torch7, который считается современным инструментом для NN и поддерживается NYU, Facebook AI и Google DeepMind. Torch7 основан на lua, и существует множество примеров, с которыми вы можете легко ознакомиться. На github можно найти много кода, хорошим началом будет https://github.com/wojzaremba/lstm .

Наконец, прелесть lua в том, что LuaJIT можно очень легко ввести в Java, Python, Matlab и т. Д.

Яннис Ассаэль
источник
2
Предложите прочитать блог Карпати. Действительно куча в понимании RNN.
SolessChong
1

Рекуррентные нейронные сети (РНН) в основном разворачиваются со временем. Он используется для последовательных входов, где фактор времени является основным дифференцирующим фактором между элементами последовательности. Например, вот рекуррентная нейронная сеть, используемая для языкового моделирования, которая была развернута с течением времени. На каждом временном шаге, в дополнение к пользовательскому вводу на этом временном шаге, он также принимает вывод скрытого слоя, который был вычислен на предыдущем временном шаге.

РНН


Рекурсивные нейронные сети больше похожи на иерархическую сеть, где действительно нет временного аспекта входной последовательности, но вход должен обрабатываться иерархически в виде дерева. Вот пример того, как выглядит рекурсивная нейронная сеть. Он показывает способ изучения дерева разбора предложения путем рекурсивного получения вывода операции, выполненной над меньшим фрагментом текста.

Рекурсивные нейронные сети


[ ПРИМЕЧАНИЕ ]:

LSTM и GRU - это два расширенных типа RNN с шлюзом забывания, которые широко распространены в NLP.

LSTM

ЛСТМ и ГРУ


LSTM-Cell Формула:

введите описание изображения здесь

Беньямин Джафари
источник