この学習では、表現力が高い、すなわちネットワークの構造が複雑であるが故に、多くの困難が待ち受けています。例えば学習の収束に時間がかかる。非常に多くの局所最適解が存在する。表現力が高いあまり過学習をしてしまう。などです。これらを上手く避けながら学習を行う基本的なテクニックを紹介していきたいと思います。
高速に学習を行い、かつ汎化性能の高いネットワークを構築するためには、単にバックプロパゲーション学習を行うだけでは難しいことが明らかになっています。
そこで、深いネットワークを学習させる際に様々な工夫が施されるようになりました。その工夫を施す際にも、ハイパーパラメータとして学習に用いる変数が増えてしまい、その数値の設定自体も問題となってきます。ハイパーパラメータの数値が良い設定であるかの評価を含め、学習の最適化手法の研究が近年増えているようにようです(以下の記事)。
なぜこれらの研究が多いかというと、それが必要なことだからです。
実は学習のテクニックを使わない場合は、深い構造のネットワークを使っても従来のSVMなどに比べて性能はあまり良くならないのです。悪戯に構造を複雑にするだけではダメということですね。
深いネットワーク構造を学習させる上で、最も最初に現れた学習のテクニックはこれです。遡れば色々あるかもしれませんが、ディープラーニングという言葉が生まれたきっかけは、この手法を用いたDBNからです。事前学習は後にSAEの構成にも応用されるようになります。数学的な難易度の観点から、事前学習といえばSAEを題材にしていることのほうが多いです。
たくさんの2層のネットワークを個別に学習させ、後で繋げて深い構造にすることで、全体で学習を行う際の良い初期値が得られるとされています。
ノイズに強い自己符号化器を作成することを目的に、わざと入力を とノイズを混入させて学習させる方法もあります。このとき、入力は ですが、出力はノイズが取り除かれた状態、すなわち となるように学習を行います。すなわち、この自己符号化器は入力にノイズが載ってしまったときに、それを取り除く効果を持つことを期待しているわけです。
ネットワークを学習させる際には、データが 個を一気に取り扱うのが従来の手法でした。すなわち、 個全てに対しての評価関数を設定し、これに基づいて(大量のデータを)処理していたのです。これはバッチ学習と呼ばれます。
そうではなく、学習データから少数を使って学習を繰り返すのが確率的勾配降下法です。全データを使うのに比べて、学習に使える情報は非常に少ないということになってしまうのですが、少ないデータに対して学習をしても、少しは良い方向に進んでいるはずです。そして学習データというのは冗長であることが多いため、全てを使うというのが元々無駄な場合も多いのです。
そういう場合は確率的勾配降下法で学習を繰り返しながら、学習が進まなくなったところで止めてしまえば、全部使うときに比べて時間の節約にもなるでしょう。
確率的勾配降下法では、もしかしたら大量のデータから少数のデータを選定する際に、学習に使える有用なデータが選ばれない可能性もあります。また、極端にデータが不安定であれば、学習に使うデータが少ない分、選ばれたデータに学習も引きづられて不安定になりかねません。
整えるというのは、各層への入力を毎回平均0、分散1の標準化することです。やたらと大きい値の変化や、全体的なズレを補正してしまうことで値の変化そのものに注力できるようになります。
※バッチ正規化では、各層の入力を白色化するという表現がありますが、白色化は標準化に加え、各成分を無相関化することです。通常これは計算コストの観点から行われておらず、標準化までしか行っていないのが普通です。(無相関化は主成分分析で達成できます)
事前学習は深いネットワーク構造が学習を上手く進めるための初期値を与えることに成功しました。ここからディープラーニングは始まったと言っても過言ではないです。
確率的勾配降下法は、ただでさえ大量のデータを必要とし、更に学習に時間が掛かるディープラーニングを、少しずつデータを使って学習を進めることで、時間短縮と冗長なデータの利用を避けることを可能にしました。
ミニバッチ法は、バッチ学習と確率的勾配降下法の間を取ったような考えです。多くの場合この学習法が使われていることでしょう。
これらの手法を知っていれば、とりあえずディープラーニングを使うことは出来るでしょう。