HELLO CYBERNETICS

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

ディープラーニングでの学習収束技術

 

 

follow us in feedly

ディープラーニングでは多くの層とユニットを用いて、非常に高い表現力を持ったネットワーク構造を作り出します。その高い表現力が包含する様々な実現可能な変換の中から、如何にして望む変換を獲得するかが学習のフェイズになります。

この学習では、表現力が高い、すなわちネットワークの構造が複雑であるが故に、多くの困難が待ち受けています。例えば学習の収束に時間がかかる。非常に多くの局所最適解が存在する。表現力が高いあまり過学習をしてしまう。などです。これらを上手く避けながら学習を行う基本的なテクニックを紹介していきたいと思います。

 

 

 ディープラーニング研究の動向

最適化手法や、学習の評価・解析の研究が多い

高速に学習を行い、かつ汎化性能の高いネットワークを構築するためには、単にバックプロパゲーション学習を行うだけでは難しいことが明らかになっています。

そこで、深いネットワークを学習させる際に様々な工夫が施されるようになりました。その工夫を施す際にも、ハイパーパラメータとして学習に用いる変数が増えてしまい、その数値の設定自体も問題となってきます。ハイパーパラメータの数値が良い設定であるかの評価を含め、学習の最適化手法の研究が近年増えているようにようです(以下の記事)。

 

s0sem0y.hatenablog.com

 

 

ディープラーニングに用いられる学習高速化を学ぶ

現状、ディープラーニングの研究というのは、ディープラーニングで上手く学習を進ませる手法を探していると思って良いかと思います。つまりSAEやRNNやCNN、DBMやDBNに加えて、新たなネットワーク構造を得ようという研究よりも、DBMやDBNのような確率モデルに対して学習の際に用いることのできるサンプリングの手法の研究や、学習の際のハイパーパラメータの解析方法の研究が多いということです。(もちろん言うまでもなくディープラーニングを使って、何かしらの識別をするという応用研究も数多くあります。)

 

なぜこれらの研究が多いかというと、それが必要なことだからです。

実は学習のテクニックを使わない場合は、深い構造のネットワークを使っても従来のSVMなどに比べて性能はあまり良くならないのです。悪戯に構造を複雑にするだけではダメということですね。

そこで、今後ディープラーニングを応用していくにしても、最新の知見を吸収していくにしても、ディープラーニングに用いられている基本的な学習のテクニックを知っておく必要があります。

 

学習のテクニック

事前学習(プレトレーニング)

深いネットワーク構造を学習させる上で、最も最初に現れた学習のテクニックはこれです。遡れば色々あるかもしれませんが、ディープラーニングという言葉が生まれたきっかけは、この手法を用いたDBNからです。事前学習は後にSAEの構成にも応用されるようになります。数学的な難易度の観点から、事前学習といえばSAEを題材にしていることのほうが多いです。

 

f:id:s0sem0y:20160926032641p:plain

RBMを応用した事前学習とDNN学習

 

事前学習に関して上記のslideshareが丁寧で分かりやすいかと思います。

事前学習の肝を説明すると、入力(学習データ)と出力からなる2層のネットワークを、出力≒入力(学習データ)となるように学習させます。 そして次に、今得られた出力を学習データとして、また別の2層のネットワークを学習させます。基本的にこれを自分が望む層の数だけ行うのが事前学習です。

 

たくさんの2層のネットワークを個別に学習させ、後で繋げて深い構造にすることで、全体で学習を行う際の良い初期値が得られるとされています。

 

この際に、出力≒入力となるように学習させた2層のネットワークを自己符号化器(オートエンコーダ)と呼びます。そして、自己符号化器を上記のとおりに作成し、繋げたものを積層自己符号化器(スタックドオートエンコーダ)と呼びます。

 

自己符号化器を構成する際の数式をまとめると

 

つまり、入力ベクトル\bf x、出力ベクトル\bf y、活性化関数f、重みベクトル\bf W、バイアスベクトル\bf bとしたときに

 

\bf{y}= f \left( \bf{W^{T}x+b} \right)

 

で、\bf {y≒x}となるように学習を行います。

 

ノイズに強い自己符号化器を作成することを目的に、わざと入力を\bf x+εとノイズを混入させて学習させる方法もあります。このとき、入力は\bf x+εですが、出力はノイズが取り除かれた状態、すなわち\bf y≒xとなるように学習を行います。すなわち、この自己符号化器は入力にノイズが載ってしまったときに、それを取り除く効果を持つことを期待しているわけです。

そのことから、この方法で作られた自己符号化器は雑音除去自己符号化器(デノイジングオートエンコーダ)と呼ばれます。 

 

確率的勾配降下法

ネットワークを学習させる際には、データがN個ある場合にはN個を一気に取り扱うのが従来の手法でした。すなわち、N個全てに対しての評価関数を設定し、これに基づいて(大量のデータを)処理していたのです。これはバッチ学習と呼ばれます。

そうではなく、学習データから少数を使って学習を繰り返すのが確率的勾配降下法です。全データを使うのに比べて、学習に使える情報は非常に少ないということになってしまうのですが、少ないデータに対して学習をしても、少しは良い方向に進んでいるはずです。そして学習データというのは冗長であることが多いため、全てを使うというのが元々無駄な場合も多いのです。

そういう場合は確率的勾配降下法で学習を繰り返しながら、学習が進まなくなったところで止めてしまえば、全部使うときに比べて時間の節約にもなるでしょう。

 

ミニバッチ法

確率的勾配降下法では、もしかしたら大量のデータから少数のデータを選定する際に、学習に使える有用なデータが選ばれない可能性もあります。また、極端にデータが不安定であれば、学習に使うデータが少ない分、選ばれたデータに学習も引きづられて不安定になりかねません。

そこでN個のデータを適当に区切ってn個ずつ学習を行うのがミニバッチ法です。この際のn個のデータ集合をミニバッチと呼びます。

 

バッチ正規化

ニューラルネットの学習はバックプロパゲーションであり、これは勾配法が基本となっています。つまりその場その場で良さそうな方に行くことを繰り返す手法です。学習すべきパラメータが少ないならば良いのですが、深いネットワーク構造になるとこれが上手く行かなくなってきます。

 

L層への入力は第L-1層からの出力であり、L-1層からL層への重みは(もちろんそれ意外の層も)学習が進みにつれて変更されていっているため、L層に対する入力の値がネットワーク内部ではやたらと変わっているように見えてしまうのです。これは内部共変量シフトと呼ばれています。

すると内部共変量シフトに対応するための学習に時間を取られてしまい、本質的な学習開始が遅れてしまうのです。内部共変量シフトを抑えて、すぐに本質的な問題への学習が進むようにするため、各層への入力を毎回ミニバッチ毎に整えるのがバッチ正規化です。

 

整えるというのは、各層への入力を毎回平均0、分散1の標準化することです。やたらと大きい値の変化や、全体的なズレを補正してしまうことで値の変化そのものに注力できるようになります。

 

また標準化によってx'を得た後にγx'+βと変換をしてバッチ正規化は達成されます。

 

※バッチ正規化では、各層の入力を白色化するという表現がありますが、白色化は標準化に加え、各成分を無相関化することです。通常これは計算コストの観点から行われておらず、標準化までしか行っていないのが普通です。(無相関化は主成分分析で達成できます)

 

 

まとめ

事前学習は深いネットワーク構造が学習を上手く進めるための初期値を与えることに成功しました。ここからディープラーニングは始まったと言っても過言ではないです。

確率的勾配降下法は、ただでさえ大量のデータを必要とし、更に学習に時間が掛かるディープラーニングを、少しずつデータを使って学習を進めることで、時間短縮と冗長なデータの利用を避けることを可能にしました。

ミニバッチ法は、バッチ学習と確率的勾配降下法の間を取ったような考えです。多くの場合この学習法が使われていることでしょう。

バッチ正規化は、深い構造故に生じるネットワーク内のデータのズレ(内部共変量シフト)を抑える役割を持っています。これによって内部共変量シフトを無くすための調整に用いられていた学習の時間を削ることができます。

 

これらの手法を知っていれば、とりあえずディープラーニングを使うことは出来るでしょう。

 

基本的なディープラーニングの構造などについては

s0sem0y.hatenablog.com

 

他にも過学習を防ぐためのドロップアウトやディープラーニングに適した活性化関数、学習率を適切に設定するAdaGradやAdamなど様々なテクニックがあります。

これらをまとめた記事も後々掲載する予定です。