リカレントニューラルネットワークと再帰的ニューラルネットワーク:NLPのどちらが良いですか?


48

リカレントニューラルネットワークと再帰ニューラルネットワークがあります。通常、両方とも同じ頭字語RNNで示されます。ウィキペディアによると、リカレントNNは実際には再帰NNですが、説明は本当にわかりません。

さらに、私はどちらが自然言語処理のために優れているか(例などを使って)見つけることができないようです。事実、SocherはチュートリアルでNLPにRecursive NNを使用していますが、再帰ニューラルネットワークの適切な実装を見つけることができず、Googleで検索すると、ほとんどの回答がRecurrent NNに関するものです。

それに加えて、NLPにより適した別のDNNがありますか、それともNLPタスクに依存しますか?Deep Belief NetsまたはStacked Autoencoders?(私はNLPでConvNetsの特定のユーティリティを見つけていないようで、ほとんどの実装はマシンビジョンを念頭に置いています)。

最後に、PythonやMatlab / Octaveではなく、C ++(GPUサポートがある場合はさらに良い)またはScala(Sparkサポートがある場合は良い)のDNN実装を本当に好むでしょう。

Deeplearning4jを試しましたが、絶えず開発されており、ドキュメントは少し時代遅れであり、動作させることができないようです。残念なことに、それは物事のやり方のような「ブラックボックス」を持っているので、scikit-learnやWekaにとてもよく似ています。

回答:


42

リカレントニューラルネットワークは、時間の経過とともに繰り返し発生しています。たとえば、シーケンスがある場合

x = ['h'、 'e'、 'l'、 'l']

このシーケンスは、それ自体に単一の接続を持つ単一のニューロンに供給されます。

タイムステップ0では、文字「h」が入力として与えられます。タイムステップ1では、「e」が入力として与えられます。時間の経過とともに展開されると、ネットワークは次のようになります。

RNN

再帰的ネットワークは、リカレントネットワークの一般化です。リカレントネットワークでは、テスト時にトレーニング時とは異なる長さのシーケンスに遭遇したときに、位置依存のウェイトをどのように処理するかによって、シーケンスの長さに沿ってウェイトが共有されます(そして次元は一定のままです)。 。再帰ネットワークでは、同じ理由ですべてのノードで重みが共有されます(そして次元は一定のままです)。

これは、すべてのW_xhの重みが等しく(共有)なり、W_hhの重みも同じになることを意味します。これは、単に時間内に展開された単一のニューロンであるためです。

これが再帰的ニューラルネットワークの外観です。 再帰的ニューラルネットワーク

再帰的ニューラルネットワークと呼ばれる理由を見るのは非常に簡単です。各親ノードの子は、単にそのノードに類似したノードです。

使用するニューラルネットワークは、使用方法によって異なります。でKarpathyのブログリカレントニューラルネットワークは良好であるので、彼は一度に文字を1つずつ生成しています。

ただし、解析ツリーを生成する場合は、より優れた階層表現を作成するのに役立つため、再帰ニューラルネットワークを使用することをお勧めします。

C ++でディープラーニングを行う場合は、CUDAを使用します。それは素晴らしいユーザーベースを持ち、高速です。私はそれについてもっと知らないので、これ以上コメントすることはできません。

pythonでは、Theanoは自動微分を提供するため、最良のオプションです。つまり、大きくて厄介なNNを作成する場合、手作業で勾配を見つける必要はありません。Theanoは自動的にそれを行います。この機能はTorch7にはありません。

Theanoは、PythonコードにCラッパーを提供し、GPUに実装できるため、非常に高速です。また、素晴らしいユーザーベースも備えています。これは、何か新しいことを学ぶ際に非常に重要です。


11

大規模なリカレントニューラルネットワークは、おそらくNLPの最も強力なモデルと見なされます。リカレントニューラルネットワークとキャラクターレベルモデリングに関するA. Karpathyの優れた記事は、http: //karpathy.github.io/2015/05/21/rnn-effectiveness/で入手できます。

深層学習のために多数のライブラリ(theano、caffeなど)を試しました。NNの最先端ツールと見なされ、NYU、Facebook AI、Google DeepMindでサポートされているTorch7の使用を強くお勧めします。Torch7はluaに基づいており、非常に多くの例を簡単に理解できます。多くのコードがgithubにあります。良いスタートはhttps://github.com/wojzaremba/lstmです。

最後に、luaの美しさは、LuaJITをJava、Python、Matlabなどに非常に簡単に注入できることです。


2
Karpathyのブログを読むことをお勧めします。RNNを理解するのは本当に大変です。
SolessChong

1

リカレントニューラルネットワーク(RNN)は、基本的に時間の経過とともに展開します。これは、時間要素がシーケンスの要素間の主な差別化要因であるシーケンシャル入力に使用されます。たとえば、言語モデリングに使用されるリカレントニューラルネットワークは次のように展開されています。各タイムステップでは、そのタイムステップでのユーザー入力に加えて、前のタイムステップで計算された非表示層の出力も受け入れます。

RNN


再帰的ニューラルネットワークは、入力シーケンスに実際には時間の側面はありませんが、入力をツリー形式で階層的に処理する必要がある階層ネットワークに似ています。再帰的ニューラルネットワークの外観の例を次に示します。テキストの小さなチャンクで実行された操作の出力を再帰的に取得することにより、文の解析ツリーを学習する方法を示しています。

再帰ニューラルネットワーク


[ ]:

LSTMとGRUは、忘却ゲートを持つ2つの拡張RNNタイプであり、NLPで非常に一般的です。

LSTM

LSTMおよびGRU


LSTMセル式:

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.