- リカレントニューラルネットワークRNNについてざっくりと知りたい方
- LSTM (Long Short-Term Memory) についてざっくりと知りたい方
- G検定対策で人工知能の勉強をしている方
こんにちは.けんゆー(@kenyu0501_)です.
今日は,時間依存性のあるデータを学習しようとした場合によく用いられるリカレントニューラルネットワーク(RNN)について詳しく書いていきたいと思います.
時間的に変動する一連のデータとは,例えば,
- テキスト
- 話し言葉
- センシングデータ
- 株の価格
などです.
時間軸に対して何らかのパターンを持っている!!
RNNは,時間的に意味のある一連のデータのパターンを認識するように設計されています.
また,一連のパッチに分解してシーケンス(順序)として扱うと,画像の認識にも適応できる強力なタイプのニューラルネットワークです.
さらに,時間的な概念を持っているので,人間で言うところのある種の「記憶」を持っていると考えられ,よく脳内の記憶との類似性が挙げられたりもします.
では,詳しく見ていきましょう!
フィードフォワードネットワークスのおさらい
RNNを理解するためには,フィードフォワードネットワークの概念を理解した方が良いです.
リカレントもフィードフォワードも両方とも,ネットワークのノード間における一連の数学的操作を通じて,情報を伝達する方法にちなんで名前が付けられています.
情報を直接送信したり(フィードフォワード),ループを介して情報を循環させたり(リカレント)します.
(特定のノードを二回経由することはありません)
フィードフォワードネットワークの振る舞い
フィードフォワードネットワークの場合は,入力が供給され隠れ層を経由し単純に出力に変換されます.
隠れ層は,データの持つパターンや特徴を抽出する層だったね!
教師あり学習の場合は,出力はラベル(入力に付けられた名前)と同様な値になることが目的です.
つまり,入力データに「犬」とか「猫」などのラベルがついていることを示すパターンを認識しながら,生データの処理を行います.
この種類のネットワークには,時間的な順序の概念はなく,あくまでも,現在のデータにのみ対応しています.
リカレントニューラルネットワーク
リカレントニューラルネットワークでは,現在の入力データだけではなく,以前に認識していたデータも入力として用います.
リカレントは「循環する」という意味だぞ!
RNNの概念としては,以下の図のような感じです.
RNNには,現在と過去の2つの入力ソースがあります.
これは,ネットワークそのものに,時間情報を反映できる仕組みを取り入れているからです.
これらを組み合わせることによって,人間の活動と同等に,新しいデータに対してどのように応じるかを決定します.
RNNは,過去の状態を反映するための隠れ層があれば良いので,入力として,時々刻々と自分自身の出力を同時に取り組みます.
つまり,シーケンス(連続している順序)自体に情報があると考えているため,そのように工夫して処理しているということです.
一般的に,連続的な情報は,RNNの隠れ層に保存されていきます.
現在に対して時間的に下側の層は,以前に発生した1つ前以上の層に依存する関数として機能します.
若干わかりにくですが,時間とともに各層と段階的に重みを共有する仕組みです.
これを,数学的に記述すると以下のようになります.
hは,時間ステップtにおける隠れ層の状態です.
これは,同じ時間ステップでの入力関数x (それ自身の重み行列Wをかけたもの)と,前の時間ステップt-1の隠れ層の状態h_t-1に,隠れ層の状態を表す行列Uを掛けたものの和となります.
マルコフ連鎖っぽいのだ
重み行列は,現在の入力と過去の非表示状態の両方に一致させるための重量度を決定するフィルタの役割をします.
「過去の隠れ層から現在の隠れ層に対しても重みがあることが重要」です.
つまり,過去の情報が,新しい情報に対してどのくらい影響を与えているのかを重みというもので学習していきます.
それらが発生する誤差は,通常通り,バックプロパゲーションによって,誤差が減らなくなるまで調整されます.
大体は,勾配降下法によって計算されますが,時間軸に沿って用いられるため,BackPropagation Through-Time (BPTT)と呼ばれます.
リカレントであろうとなかろうと,ニューラルネットワークは,単純にf(g(h(x)))のような入れ子構造になった複合関数です.
これに時間要素を追加することは,ノードの連鎖ルールで微分を計算する関数を取り入れるような形にするのみです.
Long Short-Term Memory (LSTM)とは
過去の情報を持った隠れ層を追加することによって,その重み情報から時系列データの分析ができると思えるRNNですが,いくつか問題があります.
- 勾配消失問題
バックプロパゲーションの際,過去に遡るに連れて,勾配が消えていく - 入力重み衝突
過去のデータが,現在の時点では関係ないけど,もう少し将来の時点では関係するという場合,重みをどのようにとれば良いのかややこしくなる. - 出力重み衝突
出直に関しても入力と同様.
このような問題を解決するために考えられたのが,LSTM (Long Short-Term Memory)です.
(ドイツの研究者,Sepp HochreiterとJuergen Schmidhuberによって提案されました.)
通常のニューラルネットワークでは,勾配消失問題を解決するために,活性化関数を工夫していたりしたね!
LSTMでは,活性化関数の工夫ではなく,隠れ層自体の構造に着目して問題解決を図っています.
具体的には,LSTMブロックと呼ばれる機構で,時系列データの情報をネットワーク内で保持する仕組みを持っています.
そして,そのブロックには,以下2つの重要な機構があります.
- 誤差を内側に保持しておくセル
- 適切なタイミングで,情報を保持・消却させるゲート
複雑ですが,こちらのページが,すごく分かりやすかったです.
(いつか自分でもまとめますが,今は優秀なページに委ねます笑)
おまけ:G検定について
G検定対策として,人工知能のあれやこれやについて学習してますが,覚えることが多くてとても大変ですね..笑
しかし,資格試験を受けるということは,人工知能を学習するための良いモチベーションになるかと思います.
G検定について詳しく知りたい人はこちら
この記事はこんな人にオススメです AI検定(G検定,E資格)について詳しく知りたい方 2019年3月9日のG検…
皆さんも挑戦して見てくださいー!
では!