RNNについての入門メモ

Python, ML12 January 2021

What's?

RNNは「Recurrent Neural Network」の略で、時系列処理をしたい時に使用される。
(昔は「Recursive Neural Network」もRNNと呼んでいたが現在は使用されない)

  • Recurrent Neural Network
    • ループ構造(出力が入力に戻る)
  • Recursive Neural Network
    • 木構造

時系列処理

時系列処理には以下のようなものが代表例としてあげられる。
- 価格 - 音声 - 音声認識 - テキスト - 自然言語処理

音声やテキスト等も、時間に従って進むものとして取り扱うことができる

RNNで解く問題の種類

One To One

入力1に対して出力も1 - 一般的なモデル

One To Many

入力1に対して出力が複数 - 画像からキャプション作成等

Many To One

入力複数に対して出力が1 - テキストや音声から感情を推論等

Many To Many

入力複数に対して出力も複数(同じ数分) - 映像のフレームごとにラベルを付与する等

Many To Many (Encoder-Decoder)

入力複数に対して出力も複数(異なる数分) - 翻訳等

Back Propagation Through Time (BPTT)

  • 時系列データを扱うには今より前の情報を保持しないといけない
    • 前の情報の出力をループさせ、次の入力に渡す必要がある
  • ループさせてしまうと通常のBack Propagationが使えない
  • BPTTでは、前の出力を次の入力に渡すのをループではなく巨大なNNだと見なすことで、BPを実現する

Bi-directional RNN

  • 過去の情報(=前の出力)だけでなく、未来の情報も取り入れる方法
    • 過去の情報だけだと、長期間(後ろの層まで)情報を保持し続けるのがキツイ
  • 文章の処理などでよく使われる
    • 文章の後ろからも処理する

長期依存性によるRNNの問題

  • 時系列が長くなるほど、NNは大きくなる
  • NNが大きいと、最初の方の情報はどんどん上書きされ消えていってしまう
    • 勾配が消失するか発散する
    • 発散は勾配クリッピングで回避できるが消失は厳しい
  • 必要な情報と不要な情報の取捨選択が大事

スキップ接続

  • 1つ前の情報だけでなくそれより前(n個前)の情報も渡す手法
    • パラメータ数は増えるが、効果は期待できる
  • NNの内部で複数の時間スケールで処理が進む
    • 1つ前の情報が渡るスケール
    • 2つ前の情報が渡るスケール
    • ...

でも、実際には前の情報を忘れないだけでなく、不要な情報は忘れたいという要件もある

Long-Short Term Memory (LSTM)

長期保存に問題があるなら、外部メモリを付ければ良いのではないか?
不要な情報を忘れたいなら、要否に応じて保持するか忘却するかを切り替えれば良いのではないか?

3つのゲート

1. 忘却ゲート

  • sigmoidを使用し、0~1の値をメモリに保持した値に乗算する
    • 0を乗算した分については実質忘却したことと等しい
    • 一番大事なゲート

2. 入力ゲート

  • sigmoidを使用し、このゲートが空いてる時だけ、メモリに書き込む
    • 不要な情報は取捨選択が行われる(重みを減らす)

メモリの値は乗算ではなく、加算する。そうすることで勾配の消失と発散を防げる

3. 出力ゲート

  • sigmoidを使用し、このゲートが空いてる時だけ、出力する

GRU(Gated Recurrent Unit)

LSTMの複雑さを払拭するために、メモリセルを取り除いた

2つのゲート

1. リセットゲート

  • 忘却ゲートとほぼ同等の役割

2. 更新ゲート

  • 前の出力と、算出した新しい出力を加味し、どちらをどの程度の重要度で今回の出力を決めるか判定する

Encoder-Decoder

  • エンコードとデコードの処理を分けたいという概念

Sequence-to-Sequence (seq2seq)

  • 受け取った入力の単語をいったんベクトルとして出力し、それを別のネットワークに渡す

tags: Python, ML