Deep Learning はじめました【CIFAR-10の識別】
最近趣味で機械学習の勉強をしていて、中でもDeep Learningに興味を持って取り組んでいたので、備忘録としてブログにまとめておきます。
はじめに
本稿の目的は
- Deep Learning で実際に画像識別を行う
- Deep Leraning の特性を理解する(性能向上について考察を行う)
の2点です。Deep Learningの概要・アルゴリズムについてはあまり触れません。ニューラルネットやDeep Learningについて参考にした書籍・Webサイトは以下の通りです。
書籍
- 深層学習(機械学習プロフェッショナルシリーズ)
- Python機械学習プログラミング 達人データサイエンティストによる理論と実践
- データサイエンティスト養成読本 機械学習入門編
- 初めてのディープラーニング --オープンソース"Caffe"による演習付き
- はじめてのパターン認識
Web
Deep Learningフレームワークについて
今回、Deep Learningのフレームワークとして、「Caffe」を使用しました。
他にもいろいろとフレームワークがありますが、Caffeを選んだ理由として、高速であること、ドキュメント・チュートリアルが豊富であること、開発コミュニティが活発であること、などがあります。
Caffeのインストール
実験の概要
実際にCaffeを用いてCIFAR-10の画像を識別してみます。Caffeの公式サイトにはCIFAR-10を使用したチュートリアルが公開されています。
CaffeではDeep Learningの細かい条件を設定して学習・テストを行うことができます。今回はこの条件を変化させながら実験して精度の比較を行い、以下の点について考察を行います。
- 勾配降下法の学習率の影響
- 活性化関数の影響
- ニューラルネットワーク構成の影響
初期設定
実験の際の初期設定は以下の通りです(細かいパラメータは割愛)。このうちいずれかの条件を変化させながら実験を行います。なお、学習回数について、これは十分な回数とは言えませんが、今回はできるだけ高精度なモデルを作ることが目的でないので、処理時間も考慮してあえて少なめにしてあります。
- 学習回数(Iterations): 5000
- バッチサイズ(Batch Size): 100
- 勾配降下法の学習率(Learning Rate): 0.001
- 活性化関数(Activation Function): ReLU関数
- ニューラルネットワーク: CNN(Convolutional Neural Network)
下図はCaffeのPython用ライブラリ「Pycaffe」を用いて描画したCNNのネットワーク図です。文字が小さくて見にくいですが、青が入力層・出力層、赤が畳み込み層、オレンジがプーリング層、紫が全結合層を表しています。また緑色の部分で活性化関数を施します。
なお今回は、100回のIterationごとに学習データの損失関数の値(Training Loss)を、500回のIterationごとにテストデータの正解率(Test Accuracy)を算出します。
結果と考察
勾配降下法の学習率の影響
ニューラルネットのエッジの重みの最適化には、勾配降下法を利用します。勾配降下法は以下の式で変数の更新を行います。
ここで、はある時点の変数の値、は勾配、は更新後の値です。つまり、変数を勾配の方向に動かしていくわけですが、この変数を動かす量が学習率(あるいは学習係数)です。したがって、この学習率の決め方が学習の性能に大きな影響を与えます。そこで、学習率を変えたときの影響を見ていきます。
下の図は、学習率を0.0001、0.001、0.01とした時の損失関数の値を比較したグラフです。学習率が0.001、0.0001の時は学習が進むにつれて損失関数の値(訓練誤差)が小さくなっているのに対し、学習率が0.01の時は損失関数の値が全く減少しません。学習率が小さいと学習を重ねるごとに確実に誤差を小さくしていくことができますが、学習率が大きすぎると変数の移動が大きすぎるために精度がすぐに頭打ちになり、途中で学習自体が破綻することがあります。
また、学習率が0.001の時と0.0001の時を比べると、0.0001の時のほうが誤差関数の値の落ち込みが遅いことが分かります。学習率が小さすぎると、エッジの重みの更新量が小さくなってしまうので、反復回数が増加し学習にかかる時間が大きくなってしまいます。
このように、学習率の決定が学習の性能に大きな影響を及ぼすことが分かります。一般的に、学習の序盤(誤差が大きい時)では学習率を大きめに設定し、学習が進むにつれて徐々に学習率を小さくしていくのが良いとされています。
活性化関数の影響
活性化関数とは、前の層のノードとエッジの重みの積の和に対して施す関数のことです。今回、中間層の活性化関数としてSigmoid関数、TanH関数、ReLU関数の比較を行います。それぞれの関数は下図のようなグラフになります。
(画像引用: http://www.rubedo.com.br)
下のグラフはそれぞれの活性化関数を利用した時の、テストデータの正解率の変化の様子を表したものです。グラフを見ると、ReLU関数>TanH関数>Sigmoid関数の順で正解率が高いことがわかります。TanH関数やSigmoid関数は値が大きくなると関数の勾配が0に近づき学習が進みにくくなるのに対し、ReLU関数は比較的学習の速度が早く、学習が止まってしまうことも少ないです。
ReLU関数が登場する以前は、活性化関数としてSigmoid関数やTanH関数が使われていましたが、最近は収束の速さや安定性の観点からReLU関数がよく利用されています。
ニューラルネットワーク構成の影響
最後に、ニューラルネットワーク構成を変化させた場合の影響を検証します。今回、CNNとの比較対象として、全結合ニューラルネットワークを考えます。
CNN(Convolutional Neural Network)とは、畳み込み層とプーリング層を含むニューラルネットのことであり、画像認識でよく使われます。畳み込み層は、前の層で近くにあるノードの集合同士が次のノードと接続するような構造を持ち、ある画像の局所的な部分を抽象化する役割を果たします。プーリング層は、前の層のノードの局所的な部分をまとめあげる処理を行い、小さな平行移動に対する不変性を持たせる役割を果たします。
一方、全結合層(Inner Product)とは、前の奥ノードと自分の層のノードがすべてエッジで結ばれている層を指します。今回は、下図のような5つの全結合層を持つニューラルネットを用いて実験を行います(これより層の少ないネットワークでは全く精度が上がりませんでした)。
下のグラフはCNNと全結合ニューラルネットワークを利用した時のテストデータの正解率の変動を表したものです。グラフを見ると明らかにCNNのほうが精度が高いことがわかります。画像のような2次元情報においては、縦・横方向のズレを吸収できる畳み込みやプーリング層をもつCNNのほうが有効であるといえます。
全結合層では、ノード同士の組み合わせの分のエッジが必要となり、計算量が増大する傾向があります。したがって、ノード数の多い層で全結合層を利用することはあまり好ましくなく、隠れ層の後半や出力層によく利用されます。
最後に
今回、Deep LearningのフレームワークCaffeを用いてCIFAR-10の画像識別を行い、以下の項目を検証しました。
- 勾配降下法の学習率の影響
- 活性化関数の影響
- ニューラルネットワーク構成の影響
それぞれの条件は学習の性能に大きく影響し、慎重に選ぶ必要があることがわかりました。Deep Learningは人間が何も考えなくても問題を解決してくれる魔法の杖というわけではないと言えます。
今後
Deep Learningアルゴリズムには他にも様々なパラメータがあるため、それらも変更しながらいろいろなパターンを試してみようと思います。
また、今回の知見も踏まえ、学習回数を増やしてCIFAR-10の識別を行い、訓練誤差と予測誤差の関係を見たり、中間層の可視化をやったりしようと思います。