はじめに
画像分類にて、畳み込みニューラルネットワークをよく使ってきました。その経験を整理して、メモとして残したいと、知見を共有し、誰かの役に立てられば、もしく有識者の指摘を頂ければ、嬉しいことです。
問題
ネットワークは何層にしたらいいの?
深いCNNがILSVRCに勝つ
画像分類と言えば、ImageNetにて、毎年行われるImageNet Large Scale Visual Recognition Challenge(通称:ILSVRC)という画像認識のコンペが有名です。
ImageNetというのはスタンフォード大学が立ち上げ、2万2千カテゴリのラベル付けされた、1400万枚の画像セットです。画像分類の多くの研究はこのデータセットを使って行います。
以下は2010年〜2015年の間、ILSVRCに優勝したモデルのtop-5誤認識率とモデルのレイヤ数です。
2012年にAlexNetと呼ばれるCNNを用いた手法が、それまでの画像認識のデファクトスタンダートで有ったSIFT + Fisher Vector + SVMというアプローチに大差を付けて優勝し、一躍深層学習が注目される事となった。
その後、VGG, GoogleNet, ResNetが続々登場して、top-5の誤認識率を毎年更新していた。これらCNNモデルの進化について、一番大きな特徴はネットワークが段々深くなって来た。特に、2015年にMicrosoft Researchから提案されたResNetが最大1000層以上の深いニューラルネットワークを構築することが可能となった。単純に畳み込み層を重ねっていくというわけではないですが、ネットワークの深さは如何に重要であることはわかると思います。
深いCNNの問題
ネットワークは深いほど精度向上すると考えられるので、いざ深いネットワークを学習させようとすると、下図のように精度が劣化する問題がある。
注目して欲しいのは、test error だけではなくてtraining errorでも、深いネットワーク(56-layer)の方が精度が悪くなっており、単純な過学習ではない。
深いネットワークの問題は、学習の時、勾配消失という現象が起きやすいのだ。ニューラルネットワークの訓練には誤差逆伝播法(バックプロパゲーション)が使われて、勾配が消失してしまうと、学習ができなくなり、精度が上がらないのだ。
勾配消失の対策
勾配消失の対策としてよく上げられているのはResNetだと思います。
ResNetのアイディアはシンプルで、「ある層で求める最適な出力を学習するのではなく、層の入力を参照した残差関数を学習する」ことで最適化しやすくしている。
以下は一般的なネットワーク(2層の畳み込みブロック)
kerasで書けば、
# 仮にfilter数64, サイズ3*3
x_conv = Conv2d(64, (3, 3), activation='relu')(x)
x_conv_conv = Conv2d(64, (3, 3), activation='relu')(x_conv)
ResNetでは、Shortcut Connectionというパスを追加して、残差ブロックという構造にする。
kerasで書けば、
x_conv = Conv2d(64, (3, 3), activation='relu')(x)
x_conv_conv = Conv2d(64, (3, 3), activation='relu')(x_conv)
# short connection
add_conv = layers.add([x_conv_conv, x])
# add_convは次のレイヤの入力になる
残差ブロックの導入により、勾配消失を防ぐことが出来て、結果的に学習できるネットワークの深度の限界を押し上げることに成功した。そして精度向上を果たした。
巨人の肩に乗ろう
ネットワークを深くすれば精度は高くなるが、気をつけなければならないのは、レイヤ増加による収穫逓減だ。現場では、モデル精度(accuracy)、学習スピード(operations)、メモリの消費量三者のバランスを如何に取るかというところになるだと思います。
以下は様々なCNNネットワークタイプ
一番シンプルなAlexNetは、精度が低いけど、スピードが早い、メモリ消費も少ない。よく使われているVGGはより深いので、精度が高くなる一方、スピードが遅い、メモリ消費も大きくなる。注目して欲しいのは、InceptionとResNetです、スピードと精度が一番バランスよく取られているのだ。基本的に、精度が欲しければ、極端的に深いResNetを作る、スピードが欲しければ、Inceptionを選ぶ。
ネットワークの設計はゼロから少しずつ模索するのもいいですが、自分のニーズに合うネットワークタイプをベースにして改造した方がもっと効率的だろう。
まとめ
CNNにおいて、層を重ねるごとに、より高度で複雑な特徴を抽出出来て、ネットワークが深いほど精度が高くなる。ところが、深いネットワークには勾配消失現象が起きやすくて、学習することは困難だ。それを解決するため、残差ブロックは有効手段の一つだ。また、現場ではモデル精度(accuracy)以外に、学習スピード(operations)とメモリの消費量も考慮しなければならないので、ニーズに合うCNNタイプをベースにして設計するのは効率的だろう。その有力候補として、ResNet, Inceptionが上げられる。