リカレントニューラルネットワークの勾配消失問題対策
リカレントニューラルネットワークにおいても、通常のニューラルネットワーク同様、勾配消失問題がある。
さらに、時系列を扱ううえで固有の問題として、現時点では関係性が少なくても、将来は関係性がある、というような入力があった場合に、重みを大きすべきものであると同時に、重みを小さくしなくてはいけない、という矛盾が生じてしまう。
これを、入力重み衝突と呼び、リカレントニューラルネットワークでの学習の妨げの大きな要因となっている。
出力に関しても同様で、出力重みの衝突の問題が存在している。
こういった問題を対策するために、リカレントニューラルネットワークの一種である、LSTM(Long Short Term Memory)と呼ばれる手法が存在する。
通常のニューラルネットワークでは、勾配消失問題を、活性化関数の工夫により対処するようにしていたが、LSTMも同様、隠れ層の構造を変えることで、勾配消失や重み衝突の問題を回避している。
LSTMは、LSTMブロックと呼ばれる機構で、時系列の情報をネットワークに保持できるような仕組みになっている。
LSTMブロックの構造は、大きく、2つの機構で構成されている。
- 誤差を内部にとどまらせるためのセル
- 必要な情報を必要なタイミングで保持・焼却させるためのゲート
セル
セルとは、CEC(Constant Error Carousel)とも呼ばれ、誤差を内部にとどめ、勾配消失を防ぐためのものである。
ゲート
ゲートは、入力ゲート、出力ゲート、忘却ゲートの3つで構成されている。
入力ゲートは入力重み衝突を、出力ゲートは出力重み衝突のためのゲート機構になっている。
そして忘却ゲートで、誤差が過剰にセルに停留するのを防ぐためにリセットするゲート機構になっている。
スポンサーリンク
こういった仕組みで、リカレントニューラルネットワークでは、勾配消失や、入力重み衝突、出力重み衝突などの問題に対処しているが、LSTMはセルやゲートをそれぞれ最適化するために、膨大な計算を必要とする。
そのため、LSTMを簡略化したGRU(Gated Recurrent Unit)という手法を用いることもある。
GRUでは、リセットゲート、更新ゲートが、入力ゲート、出力ゲート、忘却ゲートの代わりを果たしている。
リカレントニューラルネットワークの基本的な仕組み
時間依存性を学習するリカレントニューラルネットワークの仕組みとは一体どのようになっているのか。
実はそんなに難しいことではなく、通常のニューラルネットワークが持つ隠れ層と同様に、過去の隠れ層が追加されているものが、リカレントニューラルネットワークということになる。
スポンサーリンク
流れとしては、このリカレントニューラルネットワークのモデルに対し、時間軸に沿った順番でデータを古いものから入力するだけだ。
ここからは、通常のニューラルネットワーク同様、隠れ層に重みを与えることで情報が伝わっていくが、リカレントニューラルネットワークでは、ここからさらに、過去の隠れ層から、現在の隠れ層に対してつながり(重み)を持たせる、ということが追加される。
誤差の逆伝播も同様で、過去に遡って反映する必要があることも注意が必要となる。
この時間軸に沿って誤差を反映していくことを、BackPropagation Through-Time(BPTT)と呼ぶ。
時系列に処理をしたいのならリカレントニューラルネットワーク
例えば、こんな事例がある。
- 電車は朝と夕方に混雑する
- 電気代は夏と冬に高くなりやすい
- 年末・年始、ゴールデンウィーク、お盆に外国への旅行者が増加する
- 世界の人口は緩やかに上昇している
これらは、いずれも時間軸に対してパターンを持っている、という共通点がある。
スポンサーリンク
通常のニューラルネットワークでは、事象とともに時間の情報を入力したとしても、どうしても時間の持つ情報が削ぎ落とされてしまうことになる。
そこで、時間情報を反映し、時間依存性を学習することができるモデルが考案された。
それが、リカレントニューラルネットワーク(Recurrent Neural Network:RNN)である。
既存のものを活用する転移学習
ディープニューラルネットワークで、様々な手法の開発により、より深く、複雑な学習が行えるようになった一方で、GPUマシンが1台や2台あったところで、その膨大な計算量を捌ききるのは至難の業ともいえる。
機械学習において重要なのは、最適化されたネットワークの重みであり、その重みを得るためのステップに、膨大な計算と時間を要することになる。
従って、既に学習済みのネットワークがあれば、わざわざ一から学習する必要がない。
スポンサーリンク
例えば、VGGやGoogLeNet、ResNetといった巨大なネットワークは、ImageNetで学習済みのモデルが公開されている。 www.image-net.org 公開済みのモデルは万能なものではないので、ここに、新たに何層か追加してファインチューニングを行うことで、それぞれが目的とする高性能なネットワークを得ることができる。
このように、既に学習済みのネットワークを利用して、新しいタスクの識別に活用することを転移学習と呼ぶ。
色々な畳み込みニューラルネットワーク
画像処理に大きな威力を発揮する畳み込みニューラルネットワークは、様々な工夫が加えられたモデルが多数開発されている。
例えば、AlexNetはトロント大学で開発されたもので、2012年のImageNet Large Scale Visual Recognition Challenge(ILSVRC)で圧倒的な精度で優勝している。
AlexNetでは、
- 畳み込み層
- プーリング層
- 畳み込み層
- プーリング層
- 畳み込み層
- 畳み込み層
- 畳み込み層
- プーリング層
- 全結合層
という構造になっている。
畳み込み層とプーリング層の繰り返しを増やすことによって、より深いネットワークのモデルが実現可能となっている。
VGGはオックスフォード大学が開発したもので、2014年のILSVRCで2位の成績を収めている。
VGG16やVGG19(それぞれ16層、19層)と重みがある層によって、いくつかの種類が存在する。
層を深くした場合、計算量が膨大になってしまい、学習が進まなくなってしまう可能性がある。
そこで、1×1や、3×3など、小さなサイズの畳み込みフィルタを差し込んで、計算量そのものを減らす、というアプローチがとられている。
スポンサーリンク
GoogLeNetは、その名の通りGoogleのチームが開発したもので、2014年のILSVRCで優勝しているモデルだ。
複数の畳み込み層やプーリング層で構成されるInceptionモジュールというブロックを構成することで、並列計算を行いやすくするような工夫がとられている。
しかし、それでも層があまりにも深くなりすぎると、性能の低下や、誤差が逆伝播しにくいといった問題が起きることが判明した。
そこで、Skip connectionと呼ばれる、層を飛び越えた結合を加えることで、この問題を回避している。
Skip connectionを導入したネットワークをResNet(Residual Network)呼んでいる。
Skip connectionの特徴としては、
- 層が深くなっても、層を飛び越える部分は伝播しやすい
- 様々な形のネットワークのアンサンブル学習になっている
となっており、100層以上のネットワークが構築されることもあるという。
データがなければ作ってしまえばよい、という発想
画像認識を行ううえで、いわゆる一般的なものを認識させるために、実は重大な課題が存在している。
- 同じ物体でも角度が異なると画像としては見え方が異なってみえる
- 同じ物体でも拡大縮小によって画像としては見え方が異なってみえる
- 同じ物体でも光の当たり方(影など)によって画像としては見え方が異なってみえる
これらを正しく同一のものと認識するためには、全ての状態が網羅したデータが存在すればよい。
しかし現実問題としては、あらゆるシチュエーションの画像を網羅的に用意することは非常に困難を極める。
スポンサーリンク
そこで、そういったデータを収集するのではなく、手元にあるデータから擬似的に別のデータを生成する、データ拡張(data augmentation)という手法をとることができる。
データの水増しとも言われるこの方法は、次のようなデータを作り出すことができる。
- 上下左右の位置をずらす
- 上下左右を反転する
- 拡大・縮小をおこなう
- 回転する
- 斜めにゆがめる
- 一部を切り取る
- コンストラストを変える
データ拡張は画像認識を行う学習では、必須の処理といってよい。
画像処理の締めは全結合層で!はもう古い?!
畳み込み層やプーリング層を複数組み合わせることで、複雑な処理が行えるようになるが、これらの層をいくら組み合わせても、出力は画像でしかない。
たとえば、犬や猫などの画像を与えたときに欲しい解は、画像ではなく犬や猫であることを識別できたことである。
つまり、出力を1次元化する必要がある。
畳み込みニューラルネットワークでは、畳み込みやプーリングを繰り返した後、通常のニューラルネットワーク同様、隠れ層、出力層へと繋いでいく。
この、最後の隠れ層、出力層に繋ぐ箇所を、全結合層と呼ぶ。
これは、畳み込み層、プーリング層での特徴の抽出精度が高いためだ。
スポンサーリンク
しかし、最近では、全結合層を使用しない手法が増えている。
1つの特徴マップに1つのクラスを対応させる、というGlobal Average Pooling(GAP)と呼ばれる手法だ。
具体的には、各チャンネルの画素の平均を出力する、という手法だ。