HELLO CYBERNETICS

深層学習、機械学習、強化学習、信号処理、制御工学、量子計算などをテーマに扱っていきます

ここからはじめるディープラーニングの主流手法まとめ【保存版】

 

 

follow us in feedly

 

s0sem0y.hatenablog.com

 

ディープラーニングは2006年にトロント大学のHinton氏が考案したDeep Belief Networkから始まりました。このとき考案されたのが事前学習という手法で、一層ずつ層を学習させてから繋げていくことで、一気に深い構造を学習させる際に生じていた勾配消失問題を回避することに成功しました。

その後深い構造を使った機械学習が全てディープラーニングと呼ばれるようになり、今やその種類は非常に多岐に渡ります。今回はディープラーニングって言っても色々出てくるけど、どれがどれだか分からないという人のために(そして自分の中で整理するために)、ディープラーニング手法をまとめてみたいと思います。

 

 

ディープラーニングの種類のまとめ

 

ディープラーニングがそもそもどんな種類のものがあるのかをザックリ抑えたい方はお先に覗いてみたください。

 

また最新の機械学習研究の動向については以下の記事をご覧ください

s0sem0y.hatenablog.com

 

Deep Belief Network(DBN)

最初に登場したディープラーニングの手法

まず学習が非常に遅く実用的価値の薄かった統計モデルのボルツマンマシンを、可視層と隠れ層の2層のみから構成し、更に同じ層同士での結合をなくし、制限ボルツマンマシン(Restricted Boltzman Machine:RBM)とすることで実用的な速さでの学習を可能にした。RBMが入力自身を表現できるように学習させ(すなわち入力自体が教師データ)、これを複数個順番に積み重ねる(図参照)ことでDBNを構築する。これを事前学習(pre-training)と言う。事前学習は入力データ以外に必要なデータはないので、教師なし学習に属する。ボルツマンマシン自体が統計モデルなので、学習では分布を推定することを行い、データの発生はその分布から生じるとする。データを生成する分布をモデル化しているので生成モデルに属する。

 

事前学習を終えた後、全体の構造を学習させることをfine-tuningと言い、バックプロパゲーションなどが用いられる。当然この際には目的に応じた教師データを与えることとなる。

 

f:id:s0sem0y:20160928221042p:plain

図 RBMを一層ずつ構築し、積み重ねていく様子

http://www.iro.umontreal.ca/~lisa/twiki/bin/view.cgi/Public/DeepVsShallowComparisonICML2007

 

特徴抽出を人手でやらなくても良くなった!?

fine-tuningを行わない場合は、得られたネットワークは入力自身を別の形で表現し出力していることになる。これを特徴抽出器として利用するという方法もある。

 

従来、機械学習では音声信号にはスペクトログラムやケプストラムを用いるなど、学習データとしての特徴量を人間が選定していた。あるいは主成分分析など、多変量解析の手法を用いて統計的な性質を特徴量に選ぶ試みもなされてきた。

 

DBNは後に述べる積層自己符号化器よりも精度良く学習を行っているとみなせるモデルであり、積層自己符号化器は主成分分析などの手法を包含することも簡単に示されるため、事前学習を終えたDBNの特徴抽出器としての利用も可能であると考えれる。

 

fine-tuningも行った場合には、あたかもDBNが特徴抽出をしつつ識別器としても働くとみなせるため、ディープラーニングでは特徴抽出をしなくても良くなったという表現が見られるようになった。実際には、白色化(主成分分析+正規化)を行ってから学習をしたほうが良いことが後に示されており、特徴抽出の作業は事実上ディープラーニングのチューニングにしわ寄せされている

 

Stacked Auto Encoder(SAE)

DBNに追いつけ追い越せのモデル

DBNが発表された一年後に現れたモデル。統計モデルを用いないため、こちらの方がディープラーニング初学者に向いている。手法はほぼDBNと同じで、出力層が入力自体を表現できるように学習を行う。この際「3ユニット→2ユニット」の構造を作りたい場合は、「3ユニット→2ユニット→3ユニット」という構造を作って学習を行う。その後最後の層だけ削除してしまい、「3ユニット→2ユニット」の構造を取り出す(図参照)。

 

このようにして作られたものをAuto Encoder(AE)と言い、これを複数構築し、積み重ねることでStacked Auto Encoder(SAE)とする。DBN同様に、最後にfine-tuningを行う。

 

f:id:s0sem0y:20160424070244p:plain

 

識別モデルであること

SAEはDBNと異なり、データを発生させている分布を得ているわけではなく、生成モデルではない。学習では入力自身を表現できるように入力と出力の二乗誤差関数などを用いており、これはDBNで用いられている分布の学習に比べて、粗い近似を用いていることになる。従って、構築されるネットワークが最終的に出力するデータはDBNに比べて質が良くないことが想定され、実際に、DBNとSAEではSAEの方が若干精度が悪い。

 

一方で、初学者に取っては線形変換と活性化関数による変換の繰り返しで構成されているSAEは非常に勉強しやすい。ディープラーニングを学ぶ上で最も学習しやすい題材だと言える。

また、SAEには多くの改良版が提案されている。

 

Denoising AE

改良版の代表としてDenoising AEがある。

これはAEを構成する際に、本来の入力

 

\bf x

 

にノイズを混入させ

 

\bf x'=x+ε

 

としておき、\bf x'を入力しても出力が\bf y≒xとなるように学習させることで得られる。読んで字のごとく、ノイズが混入してもそれが除去された出力が得られることを期待して考案された。

 

DAEを積み重ねて、構築される構造をSDAEと言う。これによってDBNと同等の精度が得られるようになった。

 

Convolutional Neural Network(CNN)

二次元データ(画像など)を自然と扱える

CNNは主に二次元データを扱う際に用いられる手法。

通常のニューラルネットや機械学習の手法では、画像のような二次元データを扱う際には以下のように二次元配列(あるいは行列)としてのデータ構造を一次元配列(あるいはベクトル)としてのデータ構造に変換してから、高次元の学習問題として処理する。

 

f:id:s0sem0y:20160929205220p:plain

 

二次元配列が輪切りにして直線上に並べられていくときに、本来二次元データが持っているはずである情報が上手く保持されない可能性がある。例えば画像ならば、横隣のピクセルとの数値の関係には大きな意味を持つはずが、輪切りにされた状態では、その位置関係がなくなってしまっている。

 

CNNでは二次元データをそのまま学習データとして扱うことができるため、このように位置関係に重要な意味を持つデータに対して有効に働くことが期待できます。

 

空間フィルタ、エッジ検出を例に

画像処理は従来空間フィルタを上手く構成することで、目的の特徴を見出すことをしてきた。以下の画像は、元データに対してエッジ処理と呼ばれるフィルタを用いることで得られる。

f:id:s0sem0y:20160929205618p:plain

 

エッジ処理とは、輪郭を抽出する処理のことで、具体的なエッジ処理としては、例えばあるピクセルの値からその周りのピクセルの値を使って減算を行うことで達成できる。

 

あるピクセルが濃い色(大きな値)でその周りも濃い色(大きな値)ならば、輪郭なるものは恐らく無いはずで、当然エッジ処理後は小さな値が出てくる。逆に、あるピクセルだけ濃い色で、周りが薄い色ならば、そこに輪郭があるはずである。エッジ処理ではそのように周りと際立って違う値(色)を持つ場合にのみ値が残るために、輪郭の部分が浮き出てくることになる。

以下の画像は赤い部分のピクセルに対してエッジ処理を行う。各成分ごとの積を取ってから和を取る(積和を求める)とり、更にこれを全ピクセルに対して行えば(赤い部分をずらしていけば)エッジ処理ができる。このように積和処理を場所をずらしながら行っていく演算を畳み込み演算と言う。

f:id:s0sem0y:20160929210654p:plain

 

畳み込み層とプーリング層の簡単な説明

当然空間フィルタの値を色々変えてみれば、二次元データに対する処理も変わってくる。どんな処理をすれば、画像の特徴を見出だせるか、これを学習させてしまおうというのがCNNの狙いである。

 

手順としては、複数の適当なフィルタを準備しておき、複数のフィルタから得られるデータを更に活性化関数で変換する。この部分は通常畳み込み層と呼ばれている。

 

その後、それぞれのフィルタからの結果を使って、情報の取捨選択をする。これはプーリング層と呼ばれる。どのように取捨選択するかは様々であるが、基本的に複数のピクセルの値から1つの値を選び出して情報を集約する。例えば3×3の領域の中で最も値の大きなピクセルのみを保持するマックスプーリングや、平均値を取って1つの値に集約する平均プーリングなどがある。

 

CNNの構成

畳み込み層とプーリング層を交互に適当に配置して、フィルタの係数を上手く調整するというのがCNNの手法である。実際には画像データは複数準備され、その複数の画像データから同時に上手い係数を調整できるように学習する。

 

ともかく、単純に言ってしまえば、上手い空間フィルタを何個か準備してフィルタリング(畳み込み演算)し、それぞれのフィルタの結果から上手い情報を選択する(プーリング)ことを繰り返すのがCNNである。

 

Recurrent Neural Network(RNN)

時間的変動を自然に扱える構造

通常のニューラルネットでは、学習の際に個々のデータを上手く分類、回帰できるように重みパラメータを調整することをしており、当然識別の際にも個々のデータに対して推定を行う。しかし実際には個々のデータではなく、今から入力されるデータと、その一個前、あるいはもっと前のデータとの関係によって結果が変わるべきである情報も存在するはずである。

 

例えば入力データが今日買った食材、出力データが今日作られる料理の場合に、買ってきた食材に対して作る料理を教師データに使って学習を行えばいい。

しかし似たような食材を使って違う料理を作る場合もある。カレーと肉じゃがだったら材料は似ていそうだ。今日はカレーを作るか肉じゃがを作るかは、昨日何を作ったかに依存しそうである。

 

入力データである「材料」だけでなく、「昨日の料理と昨日の材料」など、過去のデータも使って結果が得られるべきケースでRNNは威力を発揮する。どのような構造をしているかというと、普通のニューラルネットがフィードフォワード構造であるのに対して、フィードバック構造を持たせたものである。如何が最も単純なリカレントネットワークである。実際には出力から入力までフィードバックがあってもいいし、中間層から入力でも良い。

 

f:id:s0sem0y:20160929214548p:plain

ChainerとRNNと機械翻訳 - Qiita

 

RNNを実用化するためのLSTM法

RNNを構成すると、ネットワークは複雑になる。フィードフォワードNNでさえ、勾配消失問題が原因で実用化が困難であったことを思い出せば、RNNではもっと深刻な問題であることは明らかである。

ループ構造がある場合、そのループ構造によって複数活性化関数を通ることとなる。誤差を逆伝搬する際には活性化関数の微分を乗算するが、これを何度も受けることによって、通常誤差は指数的に小さくなってしまい、出力での誤差が正しく入力まで伝わらなくなる。

 

そこでlong short-term memory法(LSTM法)が考案されるようになった。

 

これは、特殊な「データ保持のためのノード」を準備し、更にループ構造に関しては活性化関数を恒等変換にしてしまう(すなわち活性化関数を用いないのと一緒)ことで微分係数も常に1にしてしまう。

しかし過去のデータを保持するためのノードは、入力ゲートや忘却ゲート、出力ゲートを使い構成されており、初学者にとってやけに複雑に見えてしまうが、結局何をしているのかというと、過去のデータをフィードバックしたいのだが学習の妨げにならない構造にしたいということである。

 

 

活性化関数

ニューラルネットワークの復活は事前学習に始まるが

事前学習によってDBNが誕生し、この事前学習を用いることによって構成できるSAEが通常のニューラルネットワークの良い初期値を見出すことがわかった。この初期値からバックプロパゲーション学習を行うと、深いニューラルネットでも学習が上手く進むことが見出され、これを皮切りにニューラルネットは復活を遂げた。

 

しかしその後、研究が進むに連れて深い構造を学習させる本質は事前学習に宿っているわけではないことも分かってきている。実際に、事前学習をしなくても学習が上手く進む活性化関数が見つかった。

 

偉大で単純な活性化関数ReLU

結論から言えば、ReLUは

 

max(0,x)

 

で表される非常に単純な関数である。入力が0以下ならば0を出力し、それ以上ならば入力xを通過させる。偏微分係数は、入力が0以下ならば0、それ以上ならば1になる。

 

この活性化関数を用いるとどうなるのかというと、入力が0未満の場合はそのユニットに対する偏微分係数が0であるために学習は進まなくなる(つまり出力は0になる)。出力が0より大きい場合にのみ学習が進むが、進んだ先には出力が0になるか、丁度いいとこが見つかるかのいずれかである。要するにほとんどのユニットの出力が0となり、ネットワークはスパースな構造となる。

 

そして偏微分係数は0か1であり、極端に小さな絶対値を取ることもないため、勾配消失問題も避けられている。

 

そしてその結果高い精度を持つネットワークが(なぜか)構成される。

スパース性というのは深層学習の1つのキーワードなのかもしれない。(ちなみに天然ニューラルネットである人間の脳にもスパースコーディングというたった「1つの学習理論」があります。これは、簡単に言えば人間の脳が学習の際に唯一持っているルールが、神経活動をスパース化するということただ1つだけである、という主張です。)

 

s0sem0y.hatenablog.com

 

ただし、ReLUで勾配消失問題が解決されたとて、事前学習の有用性が失われたわけではありません。事前学習は良い初期値が与えられることが証明されているため、両方取り入れれば良いのです。

ただ、ReLUを使えば工夫をせずともある程度は上手くいくという便利なものであることにも間違いはない。

 

区分線形関数、Maxout関数

Maxout関数は深いネットワーク構造を学習させる際に、ドロップアウトという手法を用いる際に適している手法として提案された。

 

通常の活性化関数\bf fは通常シグモイド関数やReLUが使われるわけで、これらは全て、多次元ベクトルの入力の各成分の線形和を非線形変換した値を出力する(ReLUの場合は線形和が0より大きければ通過、小さければ0にする)。Maxout関数の場合は入力された多次元ベクトルの中で最も大きな値の成分を出力とする。すなわち、それ以外の成分は一切捨ててしまうということである。

これはCNNで使われているmaxプーリングと本質的に同じ方法である。普通の方法が、たくさんの情報を集約して上手い情報に書き換えるのに対して、maxoutはたくさんのユニットが集めてくる情報の中から唯一(最も大きな値)の情報を流す。

 

ただしこれが提案された後もReLUが最も優れた活性化関数だと言われている。

 

学習のテクニック

ドロップアウト

ドロップアウトは学習の際に、実際に学習に参加させるノードを限定する方法で、ミニバッチが変わる毎にノードの選定をし直す。つまり、あるミニバッチに対してはとある限定された部分ネットワークで学習を行い、またとあるミニバッチには別の部分ネットワークで学習を行う。

※ミニバッチとは、学習データをN分割した際の1つのデータ集合のことで、通常は学習データを一気に入れるのではなく、分割して、少しずつデータを与えることで学習が上手くいくとされている

 

f:id:s0sem0y:20160929224854p:plain

機械学習プロフェッショナルシリーズ 深層学習 chapter3 確率的勾配降下法

 

 

 

実際の識別では全てのノードを使うことになるが、これはそれぞれ別々に学習したネットワークが協力して1つの予測を導くことになる。

すなわちアンサンブル学習を取り込んだ手法となっている。

ドロップアウトでは、ネットワークの表現力がそれぞれ減らされた状態になるため過学習を緩和することができる。一方で、表現力は減らされているが、そのようなネットワークが複数準備されていることで全体としては精度の高い識別器となっている。

 

モーメンタム

通常、学習は勾配を下っていくように更新が行われる(勾配降下法)。

しかし、その場で勾配を計算し、単純に下っているだけでは遠回りをしてしまう可能性もある。以下の図では、まっすぐ進めば極小点があるのだが、その場その場で勾配方向に進むためにギザギザ進んでいる。これによって学習が終了するまでに余分な時間がかかってしまうことが考えられる。

モーメンタム法では一個前の更新方向の影響を残すことで、ギザギザに進むことを抑えられる。言わば進む方向に慣性をもたせるということである(画像下)。

 

f:id:s0sem0y:20160929231913p:plain

 

f:id:s0sem0y:20160929232219p:plain

 

Deep learning実装の基礎と実践 

その他のテクニックたち

以下の記事で学習のテクニックたちをまとめています。

s0sem0y.hatenablog.com

 

ハイパーパラメータの調整

ディープラーニングで出くわす最大の困難

ディープラーニングでは、層をいくつにするか、層のそれぞれのユニットを幾つにするのかなどの構造に関することや、学習率、ドロップアウトの選定の割合、正則化の係数など様々なハイパーパラメータが存在する。

いかにしてハイパーパラメータを設定するかがディープラーニングの最大の困難とも言える。

 

ハイパーパラメータの探し方:グリッドサーチ

通常、ハイパーパラメータの全ての組み合わせを考え試していくグリッドサーチはあまり良い結果をもたらさない。

 

理由は、ハイパーパラメータの幾つかは実はあまり学習に影響がない場合もあり、そのような場合は全てのパターンを試さずとも、そう見当がついた時点でそのハイパーパラメータをあれこれいじるのはやめるべきだからである。

 

ハイパーパラメータの探し方:ランダムサーチ

ランダムサーチは、その名の通り適当な値を試してみるということを繰り返すのだが、これで学習がどうなっているのかを調べて行ったほうが(グリッドサーチよりは)意外といい値が見つかる。要するに実験するということである。

 

自動でハイパーパラメータを評価する

ハイパーパラメータによって学習後の精度が変わるのであれば、ハイパーパラメータを最適化してしまえばいいということになる。しかしハイパーパラメータを最適化するための目的関数がどのようなものであるかは定かではない。しかし何とかしてそれを知ることができれば、あとはその目的関数を最小化するようにハイパーパラメータを決めればいいということになる。

 

従って適当なハイパーパラメータを使い実験しながら、精度が良かったものを選ぶランダムサーチではなく、ハイパーパラメータの変化によってどのように精度に影響が出たのかを少ない実験回数で調べ上げ、目的関数がどうなっているべきかを推定する試みが進んでいる。

 

この目的関数自体もニューラルネットで推定するなど、自体は非常に複雑になっていると思われる。(ニューラルネットのハイパーパラメータを決定するための目的関数の推定をニューラルネットでするという状況)

 

またベイズ推定によって、ハイパーパラメータ自身も推定すべきパラメータにする、すなわちハイパーパラメータによる条件付き分布を推定するのではなく、ハイパーパラメータと予測値の同時分布を推定する試みもされている(が面白い成果は出ていないらしい)。

 

 

Ladder Networks

私も研究で良い方法ないかを色々調べていて、こんなのがありました。

教師ありではもちろんのこと、半教師あり学習でも高い威力を発揮するようです。

正解データを正確にたくさん集めることができないような状況でも威力を発揮する手法ということだそうです。

 

www.slideshare.net

 

ちなみにNIPS2016の採択論文ではladder networkの話題はあまりありませんでした。半教師あり学習自体があまり大きな話題にはなっていないという状況でしょうか。個人的にはデータの選定、整理はかなり骨が折れる部分だと思われるので、半教師あり学習の手法が出来上がれば嬉しいなとは思っています。 

基本的にはDSAE(雑音除去自己符号化器)の各層の復号の精度も評価に含むことでロバストな学習を行えるようになっているようです。

 

 

 

ディープラーニングを応用するときの方針を得たい方

是非以下の記事を参考にしてください。

s0sem0y.hatenablog.com