「.NET 開発基盤部会 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
(Recurrent Neural Network: RNN)
≠ Recursive Neural Network(木構造を処理するネットワーク)
特徴 †
- 記憶があり系列データの可変長入力が可能な点が最大の特徴
- 中間層に再帰構造(再帰セル)を追加したニューラルネットワークの総称。
- 特に自然言語や音声データの時間的構造を学習する。
- 時間順序を持つ可変長の系列データ入力を扱える。
- 過去の系列を記憶した上で将来の予測ができる。
- 一時刻前の中間層の出力を自らの入力に戻す。
- 情報を一時的に記憶して振る舞いを動的に変化させる。
- 長期に渡る特徴の学習は苦手。
- 勾配消失・爆発の問題(の回避方法、BPTT法が定着
- 入力重み衝突、出力重み衝突(重み更新時、時系列を考慮できない)
- 入力重み衝突:入力が重要なら重みを大きくするが、時系列を考慮できない。
- 出力重み衝突:出力(再帰の入力)が重要なら重みを大きくするが、時系列を考慮できない。
構造 †
再帰構造 †
- 隠れ層(追加可能)
- 隠れ層 → 隠れ層(再帰)
- オプション:(隠れ層 → 隠れ層(再帰))
- オプション:(隠れ層 → 隠れ層(全結合))
表記方法 †
- 時間軸で展開している(最大で入力する系列データ分展開)。
- 書き方(上下左右)
一般的には...
- 上:出力
- 下:入力
- 左:展開(時系列の前
- 右:展開(時系列の後
上下が逆のケースもある。
トポロジー †
- 多対1(Seq2Vec)
- 系列 → 符号化
- 系列の意味を符号化する(Encoder単体)。
- 例:記事のトピック分類や時系列データ予測
- 1対多(Vec2Seq)
- 符号 → 系列
- 符号の意味を系列化する(Decoder単体)。
- 入力が画像の場合ある意味、Encoder-Decoder
- 例:画像のキャプション(見出し説明文)生成
RNNでできること †
系列データ(順序関係に重要な意味のあるデータ)の解析
画像処理 †
その他 †
系列データ †
時系列データの変動 †
- 長期変動(トレンド)
- 通り長期に渡る全体的な上がり下がりの変動
- 毎日(週/月/年)の、より長い期間で同じ傾向が見れられる。
- 周期変動(季節性)
- 一定期間ごとに繰り返される周期的な上下変動
- 年単位や月単位、週単位の周期等が考えられる。
- 不規則変動(残差)
- 長期変動、周期変動を除去したあとに残った傾向
- ランダムに発生するであろうノイズ
説明系列と目的系列、教師データ化 †
- 目的系列は1つの系列から成る。
- 説明系列は複数の系列から成るケースがある。
- 目的系列を教師データに変換するには
元データからxタイムステップずらす。
- 1ステップ先を予想する場合、x=1
- 3ステップ先を予想する場合、x=3
- 説明系列と目的系列は1つの同じ系列であるケースがあり、この場合、
目的系列は説明系列をxタイムステップずらして教師データを作成する。
時系列データのデータ分割 †
- 時系列を維持して訓練・テストのデータ分割を行う。
- ランダムとかシャッフルをして取り出さない
詳細 †
順伝播 †
概要 †
- Wh、Wx、bの変数の再帰的な学習が必要(xt, ht-1が入力、htが出力)
- h0=tanh(x0Wx+h-1Wh+b)
- h1=tanh(x1Wx+h0Wh+b)
- ...
- hn=tanh(xnWx+hn-1Wh+b)
- 重みは、WhとWxで別々に存在する。
- 出力のhtは再帰の入力になる。そのまま順伝播する場合は、ht ≒ yt。
- なお、h0は0だが、RNN Encoder DecoderのDecoderでは0ではないケースも。
ちなみに、 †
- x, hはベクトルで、例えば言語系であれば、単語のベクトル表現が入力される。
- 再帰セル以外はDNNと同じで、なんらかの層を積み重ねる。
出力層は... †
- 時系列だと回帰で恒等関数
- 言語系だと分類問題なのでSoftmax関数
- 損失関数も問題に合わせたものを選択する。
逆伝播 †
- 学習で重みは誤差逆伝播法で更新されるが、
全体を見ると以下の2つのパスがあるよね?
- って、例えば言語系でコレで何を学習できんのよ?
...と考えるがノード数が多いんだろうね?と
(何ノードあるのだろう?)。
BPTT法 †
- Backpropagation Through Time: 通時的誤差逆伝播法
- DNNと同様に誤差逆伝播法による学習ができる。
- 二乗誤差関数(回帰)、クロスエントロピー誤差(分類)
- 出力層から入力層へ遡る。再帰層は時間方向にも遡る。
- ただし、以下の再帰層の部分がDNNの誤差逆伝播法と異なる。
- 出力層から逆伝播した、それぞれの勾配の平均値を全体の勾配として使用しパラメタ更新する。
(ただし、これって、系列 → 系列の場合の話だよね?という気がするが?)
- 再帰層を遡るには、
- 重みが2つあるので、...hn=tanh(xnWx+hn-1Wh+b)の微分を求めると、...
- 再帰層は前再帰の勾配を算出して連鎖律に加える必要があり、全部遡って勾配を算出する必要がある。
- 遠く離れた依存性を学習しなくなりRNNの利点を生かせなくなる(→ LSTM)。
Truncated BPTT法 †
- サンプル毎ではなく分割されたタイムステップ(再帰回数)の
ブロック毎にBPTT法で重みを更新してから、次のブロックの処理に移る。
- 順伝播は分断されておらず前ブロックの記憶を次ブロックに引継いでいる。
- ミニバッチの入れ方が異なる。
- BPTT法でもTruncated BPTT法でも、どちらでもバッチ化はサンプル数を増やして実現。
- Truncated BPTT法では、サンプルをタイムステップで分割するが連続性を保つ必要がある。
・行がバッチサイズのサンプル数、列がタイムステップ数の場合
・n番目のミニバッチのx行目とのn+1番目のミニバッチのx行目は連続したサンプルになるように分割する。
RTRL法 †
というものもあるらしい。
RNNの原型・発展形 †
Enc-Dec、Seq2Seqモデルとも呼ばれるトポロジー
- 入力の順序と出力の順序や長さが対応していない機械翻訳や質問応答タスクで使用されることが多い。
- RNN Encoderによってエンコードされた情報(≒LSTMのコンテキスト)をRNN Decoderの始めの内部状態として入力。
(バイディレクショナル リカレントネットワーク)
- 前方向のRNN層に加え、逆方向のRNN層も追加。
- 過去だけでなく未来の情報も利用し効果的に予測。
参考 †
YouTube? †
AIcia Solid Project †