問題タブ [recurrent-neural-network]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
neural-network - LSTM NN: 順伝播
私はニューラル ネットワークが初めてで、LSTM をゼロから作成しています。順伝播は機能していますが、訓練されたモデル、逆伝播、およびメモリ管理のコンテキストでの順伝播の移動部分についていくつか質問があります。
したがって、現在、順方向伝播を実行すると、新しい列f_t, i_t, C_t, h_t, etc
が対応する配列に積み上げられ、bptt 勾配計算のために以前の位置が蓄積されます。
私の質問は4つの部分です:
1)合理的に長期の記憶を保持するためには、どのくらい前にさかのぼる必要がありますか? (メモリを 20 ~ 40 時間ステップ戻すことは、おそらく私のシステムに必要なものです (ただし、より長い期間の恩恵を受けることができますが、これはまともなパフォーマンスのための最小値にすぎません)。今、私はそれを機能させることができます)
2)モデルが「トレーニング済み」であると考えたら、次の値を計算するために必要な 2 つ以上の時間ステップを保持する理由はありますか? C
h
(C_t
はセルの状態で、h_t
は LSTM ネットの最終出力です) その場合、順伝播関数の複数のバージョンが必要になります
3)トレーニングする時系列データが限られており、モデルをトレーニングしたい場合、モデルのパフォーマンスは、トレーニング データで何度もトレーニングするときに収束します (最大平均パフォーマンスの周りで振動するのに対して)。 ? また、ドロップアウトを実装すると収束しますか?
4)勾配のいくつの要素を考慮する必要がありますか? さまざまな行列の勾配を計算すると、時間ステップ t で一次寄与が得られ、時間ステップ t-1 で二次寄与が得られます (そして、計算は t=0 までずっと繰り返されます)。(言い換えると、一次寄与が勾配計算を支配しますか? 時間ステップを逆伝播するときに再帰の実装を保証するのに十分な二次成分のために勾配が変化しますか...)
python - TensorFlow で可変長シーケンスを使用してバッチを処理する方法は?
シーケンス予測に RNN (具体的には LSTM) を使用しようとしていました。ただし、可変シーケンス長の問題に遭遇しました。例えば、
このBenchmark for building a PTB LSTM model に基づく単純な RNN を使用して、現在の単語の次の単語を予測しようとしています。
ただし、num_steps
パラメーター (以前の非表示の状態に展開するために使用される) は、各 Tensorflow のエポックで同じままにする必要があります。基本的に、文の長さが異なるため、文のバッチ処理はできません。
ここで、num_steps
私の場合、すべての文に対して変更する必要があります。いくつかのハックを試しましたが、何も機能していないようです。
machine-learning - Keras でのシーケンスのラベル付け
私は文のラベル付け問題に取り組んでいます。自分で埋め込みとパディングを行いましたが、入力は次のようになります。
文中のすべての単語について、4 つのクラスのいずれかを予測したいので、目的の出力は次のようになります。
私の単純なネットワーク アーキテクチャは次のとおりです。
トレーニング中は約 95% を示していますが、トレーニング済みモデルを使用して新しい文を予測しようとすると、結果は非常に悪くなります。モデルは最初の単語のいくつかのクラスを学習したばかりのようで、毎回それを示しています。問題は次のとおりだと思います。
自分でパディング (文末のゼロ ベクトル) を書いた場合、学習が悪化する可能性はありますか?
パディングなしで、さまざまな長さの文を学習しようとする必要があります (はいの場合、Keras でそのような種類のモデルをトレーニングする方法を教えてもらえますか?)
学習目的を間違えましたが、平均二乗誤差、バイナリクロスエントロピーなどを試してみましたが変わりません。
TimeDistributedDense
との何かsoftmax
、私はそれがどのように機能するかを知っていると思いますが、それでも 100% 確実ではありません.
この問題に関するヒントやヘルプをいただければ幸いです。ありがとうございます。
python - LSTM レイヤーをスタックして音声ファイルを分類する方法
私は離散音声を分類するために LSTM ベースの分類子を実装しようとしています。13 個の mfcc で特徴ベクトルを作成しました。特定のファイルの 2D ベクトルは [99, 13] です。mnist_irnn の例に従った後、音声ファイルを分類するために単層 RNN をセットアップできました。しかし、ネットワークにレイヤーを追加したいと考えています。したがって、2 つの LSTM 層とソフトマックス層を出力層としてネットワークを実装しようとしています。ここで多くの投稿を行った後、次のようにネットワークを設定できました。ここでは、モデルの構築時に例外がスローされません。
私はさまざまなポイントでさまざまな値を試してきました。(今のところ、小さなサンプルで試しているため、値は非常に小さいです)しかし、現在、トレーニング中に例外がスローされています。若干の寸法ミスマッチ。
ここで何が間違っているのか知りたいです。私は一日中コードを調べてきましたが、それでも次元の不一致の理由を理解できません。
さらに、誰かが output_dim の意味を説明できれば、本当にありがたいです。(特定のレイヤーに n 個のノードがある場合、単一のノードによって出力されるベクトルの形状ですか? 次のレイヤーのノードの数と等しくなければなりませんか? )
python - 双方向 LSTM (BLSTM) のトレーニング、テスト、および検証セット
通常の ANN や標準的な機械学習手法に関して言えば、トレーニング、テスト、および検証セットがどうあるべきか (概念的にも、経験則の比率でも) を理解しています。ただし、双方向 LSTM (BLSTM) ネットの場合、データを分割する方法がわかりません。
監視された健康値で構成される個々の被験者データの予測を改善しようとしています。最も単純なケースでは、被験者ごとに 1 つの長い時系列の値 (>20k 値) があり、その時系列の連続部分は、被験者の現在の健康状態に応じて一連のカテゴリからラベル付けされます。BLSTM の場合、ネットはすべてのデータで同時に順方向および逆方向にトレーニングされます。問題は、1 つの被験者の時系列をどのように分割するかということです。
- たとえば、最後の 2,000 個の値だけを取得することはできません。それらはすべて 1 つのカテゴリに分類される可能性があるためです。
- また、時系列をランダムに切り刻むことはできません。学習フェーズとテスト フェーズの両方がバラバラなチャンクで構成されるためです。
最後に、各被験者は (私が知る限り) わずかに異なる (しかし類似した) 特性を持っています。では、おそらく、私は何千もの被験者を持っているので、一部をトレーニングし、一部をテストし、他のものを検証しますか? ただし、科目ごとに違いがあるため、1 つの科目だけを開始することを検討している場合、どのようにテストを設定すればよいでしょうか?
python - LSTM ネットワーク テンソルフローへの入力
長さ t (x0, ...,xt) の時系列があります。それぞれの xi は d 次元ベクトル、つまり xi=(x0i, x1i, ...., xdi) です。したがって、私の入力 X の形状は [batch_size, d] です
tensorflow LSTM の入力は、サイズ [batchSize, hidden_size] である必要があります。私の質問は、時系列を LSTM に入力する方法です。私が考えた解決策の 1 つは、サイズ [d,hidden_size] の追加の重み行列 W を持ち、X*W + B で LSTM を入力することです。
これは正しいですか、それともネットワークに何か他のものを入力する必要がありますか?
ありがとう
python - seq2seq モデルでエポック ポイントに到達したかどうかを知るにはどうすればよいですか?
seq2seq モデルのデフォルト設定を使用して、約 100 万文のカスタム並列コーパスで何日もの間、seq2seq モデルをトレーニングしています。以下は、チュートリアルで述べたように 350k ステップを超えた出力ログです。バケットのパープレキシティが突然大幅に増加したことがわかりました。全体的なトレインのパープレキシーは長い間 1.02 で一定であり、学習率も 0.5 で初期化されていましたが、現在は約 0.007 を示しているため、学習率も大幅に低下しています。システムのアウトプットは満足のいくものにはほど遠い。エポック ポイントに到達したかどうかを知るにはどうすればよいですか? また、パラメーターの調整やオプティマイザーの改善などの設定を停止して再構成する必要がありますか?
そして、これはいつ停止しますか?
python - theano を使用した RNNLM
theano ユーザーリストで同じ質問をしましたが、返事がありませんでした。
この素敵な投稿に基づいて、 http://www.fit.vutbr.cz/research/groups/speech/publi/2010/mikolov_interspeech2010_IS100722.pdfの RNNLM を再実装しようとしています。PTB トレーニング データ ( http://rnnlm.org/からダウンロード) の最初の 100 文をトレーニング データとするおもちゃのテスト ケースを試しました。同じデータを評価にも使用しました。
ベースライン:
http://rnnlm.org/の rnnlm-0.4b を使用して、25 回の反復で LM をトレーニングしました。テスト ログ確率: -4107.323481 PPL ネット: 85.496622
ベースラインを生成するコマンド ラインは次のとおりです。
私の実装を使用すると、25 回の反復の後、PPL に大きな違いがあります。
エポック=24: ログ確率=-5374.255371 ppl=337.187731
私はまだ Theano を学んでいます。
ありがとう
私の実装はここにあります: