これまでのネットワークは、入力を受け取って出力を返すだけで、過去の入力を覚えていませんでした。画像認識ならそれで問題ないのですが、文章や音声のように順番に意味があるデータだと困ります。「彼は」という主語を忘れたら、後に続く動詞の意味がわからなくなる。
RNN(Recurrent Neural Network)は、前のステップの出力を次のステップの入力に使い回すことで、系列データを扱えるようにしたモデルです。
内部状態がループする
RNNの特徴は、自分の出力を次のステップに渡すループ構造です。
\[ h_t = \sigma(W_{xh} x_t + W_{hh} h_{t-1} + b) \]\( h_t \) は時刻 \( t \) の内部状態(隠れ状態)です。現在の入力 \( x_t \) に加えて、1ステップ前の内部状態 \( h_{t-1} \) が計算に入っています。
この \( h \) がRNNの「記憶」にあたります。といっても、明示的にどこかに情報を保存しているわけではなく、内部状態のベクトルに過去の情報が圧縮されて残っているという形です。系列が長くなると古い情報はどんどん上書きされるので、覚えていられる範囲には限界があります。
BPTTで時間方向に学習する
RNNの学習も勾配降下法ですが、時間が絡むぶん少し面倒です。ネットワークを時間方向に展開して、未来から過去に向かって勾配を伝播させます。BPTT(Backpropagation Through Time)と呼ばれる方法です。
通常の誤差逆伝播が層方向に遡るのに対して、BPTTは時間方向にも遡る。文章の結末の損失から、数ステップ前の重みに対する勾配を計算して更新します。
ここでも勾配消失が起きる
第7回で書いた勾配消失問題が、RNNでは時間軸方向にも発生します。ステップが長くなるほど、過去の入力に対する勾配が小さくなっていく。
数ステップ前の情報は活かせても、もっと前の情報は勾配が届かず学習できません。短い文なら文脈を拾えるけれど、段落をまたぐような長い依存関係は捉えられない。
「記憶を持てるモデル」と聞くと万能に感じますが、実際に覚えていられる範囲はかなり短い。自分はここが一番もどかしかったです。この限界を何とかしようとして生まれたのが、次回扱うLSTMやGRUといったゲート付きRNNです。
まとめ
RNNはループ構造で内部状態に過去の情報を持ち回り、系列データを処理します。ただし長い系列では勾配消失が起きるため、長期的な依存関係の学習が苦手です。この弱点がRNNの実用上の大きな制約で、それを解消するためにゲート機構が考案されました。
次回はLSTMについて書きます。