ニューラルネットワークの学習

学習を行う際には、収集したデータを訓練データと検証データに分ける。そして、学習時には訓練データだけを使って重みを調整し、それが終わると、検証データを使って、それまでに見たことが無い画像でも認識がうまく行くかという学習の成果を確認するというやり方がとられる。

そして、訓練データの画像を使って正解に近づくよう、各層の重みの調整を行う。

訓練データを全部使って学習を行い、その後、検証データを全部読ませてエラー率の検証を行うのを1エポックという。通常、学習では、この過程を数10～100エポック程度繰り返す。このエポックを繰り返すと、訓練時のエラー率は次の図の青線のように減少して行く。そして、左の図のように検証時のエラー率も減少して行けば、学習は成功である。

一方、訓練時のエラー率は下がるのであるが、検証データを読ませた場合のエラー率が十分に下がらない場合は、学習は失敗である。学習がうまく行かない場合、訓練データを追加する、あるいは雑音を入れて過学習を防ぐDrop outなどの方法が採られるが、この講義ではカバーされなかった。いずれにしても、検証時のエラー率がどのように下がってきているのかをモニタしながら学習を進めることが重要である。

この講義では、図に書けるように数個のニューロンとせいぜい数十個の重みしか書かれていないが、実際の畳み込みニューラルネットワーク(Convolutional Neural Network:CNN)では、層数は10層、重みの数は10億にも上る。そして訓練データは1000万枚から1億枚という膨大な画像データが使われる。このため、ディープラーニングの学習に必要な計算量は30ExaFlopsにのぼり、GPUを利用しても30日掛かるということになる。

そして、顔認識を学習させた場合、この図の中段に示されているイメージのように、顔写真の入力に対して、最初の層は斜めの線などの単純なパターンに強く反応し、層が進むにつれて、目や鼻のようなパターンに反応するようになる。そして、終わりの層になると人間の顔らしいパターンに反応するという特性になっている。