神野さんに言われました。

読者です 読者をやめる 読者になる 読者になる

神野さんに言われました。

AIの勉強をしています @sesenosannko

ImageNet Classification with Deep Convolutional Neural Networksの論文を読む

とりあえず強化学習については本とかを読んで多少理解が深まっていて、atariのやつを再現したいなと思っています。
まずその前にCNNを実装した経験がなかったので、ImageNet Classification with Deep Convolutional Neural Networksを再現してCNNについての理解を深めつつchainerの練習をしようと思います。

7/16
データセットの大きさとうちのマシンスペックの問題で実装は断念しました・・・残念。
とりあえずatariの方はなんとかやっていきたいです→これもできませんでした・・・

元の論文はこちら。

http://www.cs.toronto.edu/~fritz/absps/imagenet.pdf



ILSVRCでCNNを用いた物体認識が驚異的な精度を達成した有名な論文。画像を1000種類にクラス分けする。5層の畳みこみ層と3層の全結合層で構成されており、6000万のパラメーターと65万のニューロンを持つ。

以下の4点が新しい手法として提案されています。

1,.現在では主流となっているが、活性化関数にReLUを用いている点もこの時点では最新らしい。ReLUを用いるとtanhよりも学習速度がseveral times速くなるらしい。
2.複数のGPUを用いることも新しい技術って言っています。たぶん今でいうModel-parallel Computationのことだと思います。
3 .これはどこかで読んだことがある気がしますが、Local Response Normalizationという正規化方法はこの論文で提案されたようです。隣接したカーネルマップ間で重みの正規化を行う。Chainerでも関数として提供されているのでおそらく現在では広く用いられているみたいですね。
4.Overlapping Poolingも新しい手法として提案されている。これは、プーリング層のフィルタのスライドをフィルタのサイズよりも小さくするというものです。以前の手法ではフィルタのサイズとスライドは一致させて重ならないようにするのが一般的であったらしい。学習率の向上および過学習の防止の効果がみられた。

正則化の手法は2点述べられています。

1.data augmentation、いわゆるデータの水増し。一つ目は回転、移動、水平方向の鏡像変換を施したデータを用いるよくある方法。このために入力画像の大きさは256*256から224*224となっている。二つ目はPCAを用いた方法。初めて聞いたんですが、RGBの強度を変えるというものらしい。それぞれの訓練画像に主成分の倍数を加える。係数は対応する固有値と中心0、標準偏差0.1のガウス分布によるランダム変数との積によって決まる。具体的には、それぞれの画像に対して[p1, p2, p3][α1λ1, α2λ2, α3λ3]を加える。piとλiはそれぞれRGB値に関する3*3の共分散行列の固有ベクトル固有値でαiは上述のランダム変数である。この手法は強度への不変性をもたらすと考えられ、精度を1%程度向上させたとしている。

2.ドロップアウトです。0.5の確率で中間層のニューロンの重みをゼロにし、順伝播にも寄与せず逆伝播にも参加しない。それぞれのニューロンが特定のあるニューロンの存在に依存することがなくなることでニューロン同士の共適合が防がれるとある。テスト時にはドロップアウトを適用した層の重みは0.5倍にします。この論文では全結合層の1番目と2番目で用いられ、ドロップアウトを用いた場合は収束にかかる時間がおよそ2倍になったそうです。

学習の詳細
確率的勾配降下法
バッチサイズ128
モメンタム0.9
重み減衰.0005
この小さい重み減衰学習に重要であることを発見したらしいです。つまり、単純に正則化だけではなく、精度の向上にも影響したということらしいです。
重みの初期値は中央値0、標準偏差0.01のガウス分布によって決定されています。
また、バイアスの初期値は畳みこみ層の2,4,5層と全結合層では1に設定されています。これはReLUに正の入力を与えることで学習初期の学習速度を向上させる効果があるそうです。ほかの層は0です。
学習率は全層で一定ですが、誤差率の向上が見られなくなると10で除します。学習終了までに3回これが行われました。120万枚の画像に対しておよそ90サイクルで学習が行われ、2本のNVIDIA GTX 580 3GB GPUを用いておよそ6日を要します。