web-dev-qa-db-ja.com

PyTorchを使用したLSTM時系列の生成

ここ数日間、これまでの成功を垣間見ることなく、LSTMを使用して単純な正弦波シーケンス生成を構築しようとしています。

時系列予測の例 から始めました

私が別の方法でやりたかったことはすべて次のとおりです。

  • LBFGSとは異なるオプティマイザ(RMSprobなど)を使用する
  • さまざまな信号を試してください(より多くの正弦波成分)

これは my code へのリンクです。 「experiment.py」がメインファイルです

私がしていることは:

  • 人工時系列データ(正弦波)を生成します
  • それらの時系列データを小さなシーケンスにカットします
  • モデルへの入力は一連の時間0 ... Tで、出力は一連の時間1 ... T + 1です。

何が起こるか:

  • トレーニングと検証の損失はスムーズに下がります
  • テストロスが非常に少ない
  • しかし、シード(テストデータからのランダムシーケンス)から始めて、任意の長さのシーケンスを生成しようとすると、すべてがうまくいきません。出力は常にフラットになります

Shape of the generated signal

何が問題なのかわからない。私はこれを1週間遊んでいますが、何の進歩もありません。どんな助けにも感謝します。

ありがとうございました

21
OSM

これは正常な動作であり、ネットワークが入力の品質に自信を持ちすぎており、過去(内部状態)に十分に依存することを学習せず、入力のみに依存しているために発生します。生成設定でネットワークを独自の出力に適用すると、ネットワークへの入力は、実際の入力を得たトレーニングまたは検証の場合ほど信頼性が低くなります。

私には2つの解決策があります。

  • 1つ目は最も単純ですが直感的ではありません。ガウスノイズを少し入力に追加します。これにより、ネットワークは非表示状態にさらに依存するようになります。

  • 2番目は、最も明白な解決策です。トレーニング中に、実際の入力ではなく、特定の確率pで生成された出力を供給します。 p = 0でトレーニングを開始し、徐々に増やして、独立してより長いシーケンスを一般化することを学習します。これはスケジュールされたサンプリングと呼ばれ、詳細については https://arxiv.org/abs/1506.03099 を参照してください。

8
patapouf_ai