Posted at

G検定メモ⑬ ディープラーニング RNN編

G検定を受ける前に、公式テキストを読んでメモした走り書きがあったので公開するよ。



6-5.RNN:リカレントニューラルネットワーク

時系列データ処理の分野で用いられるニューラルネットワークをRNNと呼ぶ


1.時系列データの扱い

「時間軸に対して何かパターンを持っている」データが世の中には多い

例)

・電車の混雑状況は朝と夕方にピークを迎える

・電気の使用量は夏と冬が多くなる

・世界の人口は年々上昇している

など

このような時系列データを用いてニューラルネットワークで予測する場合

例)

・過去の株価から明日の株価を予測する

など

データが持っている「過去の重み」を表現したい。

適切に時系列データを用いた予測を行いたい場合

・データは時間軸に沿って入力すべき

・ネットワークは時間情報を反映できるような仕組みが必要

これらに対応したものが、


●リカレントニューラルネットワーク:RNN

RNNでできる事

・時系列データをそのまま入力する事が出来る

・データから時間依存性を学習する事が出来る

RNNには複数の手法がある


2.RNNの基本形

時間依存性を学習するために、過去の隠れ層を追加したネットワークを構築する

RNNモデルに対し、時間軸に沿ったデータを古いものから順番に入力していく。

入力層から隠れ層にネットワークの重みを伝って情報が伝播するのは、通常のニューラルネットワークと同じ。

RNNでは、そこに加えて「過去の隠れ層から現在の隠れ層に対してもつながり(重み)がある」事が大きな違いとなります。

逆伝播する誤差も過去にさかのぼって反映する必要がある。

実際は勾配降下法で式を求めていくだけなので、時間軸に沿って誤差を反映してくため、

BackPropagation Through-Time(BPTT)と呼ばれている


3.LSTM

RNNの問題点


1.勾配消失問題

RNNは時間軸に沿って深いネットワークになるので、誤差を逆伝播する際、過去に遡るにつれて勾配が消えていってしまう


2.時系列データを扱う上での固有の問題

今の時点では関係ないけれど、将来の時点では関係ある という入力が与えられた際、重みは大きくすべきであり、同時に小さくすべきであるという矛盾を抱える

この問題は入力重み衝突とよばれ、RNNでの学習が上手くいかない要因

出力に関しても、出力重み衝突が発生し学習を妨げる


●解決策


LSTM(Long Short-Term Memory)

隠れ層の構造を変えることで勾配消失問題を解決し、同時に入力重み衝突といった問題も解決する

LSTMはLSTMブロックと呼ばれる機構を導入し、時系列情報を上手くネットワーク内に保持する事を可能としています。

LSTMにおける隠れ層は、LSTMブロックがたくさん並ぶことになる。

LSTMブロックは二つの機構から成り立っている

・誤差を内部にとどまらせるためのセル

・必要な情報を必要なタイミングで保持・消去させるためのゲート

セルはCEC(Constant Error Carousel)とも言われ、その名前の通り誤差を内部にとどめ、勾配消失を防ぐためもの

一方ゲートは、入力ゲート、出力ゲート、忘却ゲートの三つからなり、

入力ゲート、出力ゲートはそれぞれ入力重み衝突、出力重み衝突のためのゲート機構、そして忘却ゲートは誤差が過剰にセルに停留するのを防ぐためにリセットの役割を果たす。

LSTMは時系列データを扱う上ではデファクトスタンダードになっているモデルとも言える。

一方LSTMはセルやゲートそれぞれを最適化しなくてはならないため、計算量を多く要する

そのためLSTMを簡略化した、GRU(GatedRecurrentUnit)と呼ばれる手法が代わりに用いられる場合もある。

GRUでは、リセットゲート、更新ゲートというゲートが、入力ゲート、出力ゲート、忘却ゲートの代わりを果たします。


4.RNNの発展系


4.1Bidirenctional RNN

扱う時系列データの種類によっては、LSTM(やGRU)を更に応用させたモデルが用いられます。例えば、時間情報の途中がかけていてそれが何かを予測したい場合は、過去の情報だけでなく、過去と未来両方の情報を使ってよ臆した方が効果的と言えるでしょう。

通常のLSTMは過去から未来への一方向でしか学習をすることができませんが、LSTMを二つ組み合わせることで、未来から過去方向も含めて学習をできるようにしたモデルのことをBidirectional RNN(以下BiRNN)と言います。


4.2 RNN Encoder-Decoder

これまでのモデルは、入力が時系列で出力は1点のもの。

入力が時系列なら、出力も時系列で予測したい。

そうした問題のことを、シークエンストゥシークエンス(Sequence-to-Sequence)と言い、自然言語処理を中心に大きく研究されている分野の一つ。

土台となるアプローチは二つのLSTMを組み合わせる事

RNN Encoder-Decoderという手法

入力も出力も時系列ならLSTMをそれぞれに対応させれば良い

モデルはエンコーダとデコーダの二つのLSTMに分かれており、

エンコーダが入力データを、デコーダが出力データをそれぞれしょりします。

もちろん出力も時系列なため、全出力を一気に行う事は不可能です。

そのため、デコーダは自身の出力を次のステップで入力として受け取って処理する


4.3Attention

RNNの応用によって、様々な時系列タスクで高い精度が出せるようになりました。

RNNは過去の時点がどれだけ影響を持っているかは求めていない。

「時間の重み」をネットワークに組み込んだのがAttention と呼ばれる機構

過去の時点それぞれの重みを学習する事で時間の重みを考慮したモデルを実現する。

このAttention も時系列タスクで精度の向上に多大に貢献しましたが、反面実はタスクによっては直近の過去しか重み付けできていないのではないかという指摘も上がっています。