Deep convolutional models: case studies
CouseraのDeeplearningのコースの学習メモ.
Case studies
今週はケーススタディを見て行く.
Why look at case stduies?
ネットワークを構築する上で,ほかの誰かが作ったネットワークのアイディアを知ることはとても有益だし,そのまま活用することもできる.
今回はComputerVisionの分野で成功を納めてきたネットワークを見て行くが,ComputerVisionの分野以外でも考え方などすごく参考になる部分があるので,ケーススタディは大切.
今週は
- LeNet-5
- AlexNet
- VGG
- ResNet
- InceptionNet
を実例として見て行く.
Classic Networks
LeNet-5
これは,手書き文字の分類(グレースケール)の識別で大きな効果を発揮したネットワーク. ネットワークを図1に示す.
約6万のパラメータがある,比較的小さいネットワーク.
図1を見るとわかるが,nHとnWといった縦横は層を超えるごとに小さくなっていき,nCといったチャネル数は増えて行くようにネットワークを構築することが一般的に取られる手法であり,設計時のガイドラインとなる.
AlexNet
画像認識で高い精度を出したネットワーク. 大体6千万パラメータがある中堅クラス.
図2にネットワークを示す.
VGG-16
これまで見てきたように,hyperparameterがとても多い. hyperparameterのチューニングをほとんどしないで良いために,畳み込み層を3×3でstrideを1,sameパディングとして,マックスプーリング層のフィルタサイズを2×2でstrideを2と固定して用いるネットワークとしてVGGがある.
チャネル数も64=>128=>256=>512=>512とリーズナブルに選択されている.
図3にネットワークを示す.
1億3800万ほどのパラメータがある非常に大きなネットワークになる.
ResNets
Residual block
ResNetはResidualBlock(残差ブロック)層を用いたネットワークである. まずは残差ブロックの説明から.
残差ブロックのイメージを図4に示す.
通常のネットワークにショートカットする線を足したものを残差ブロックと呼ぶ.
これを行うと,レイヤーを深く深くして行くことができるという利点がある.
ResNetではなく通常のネットワークにおいて,レイヤーを深くして行くと,理論的にはトレーニングセットに対するエラーは単調減少するはずだが,実際には勾配消失を起こしてしまい,単調減少にならない. これが,ResNetを用いると解決でき,単調減少するようにできる.
これによって,レイヤーを深くすることで精度を高めたいという狙いを実現できる可能性が高まる.
レイヤー数とトレーニングセットに対する誤差のイメージを図5に示す.
ではなぜこんな特徴になるのか? 次の章で見て行く.
Why ResNets work
Residual blockを数学的に記載すると図6のように示せる.
ここで,勾配が仮に消失して0になっていた場合,図7のように数式が展開できる.
つまり,勾配が消失して0になってしまうという最悪の状態であっても,その層がなかった場合と変わらない予測が可能になるわけである. 最悪のケースにまでいかない場合はモデルが意味のある知見を学び,それを持ってトレーニングセットに対するエラーが減少するのである.
Networks in Networks and 1 by 1 Convolutions
フィルタサイズが1のフィルタをかける. なんの意味があるのだろうか?
inputが1チャンネルだった場合は,ただ単に定数倍するだけで,意味はない. inputがNチャンネルになった場合は,チャネルにまたがってフィルタをかけ,それらを足し合わせるという動きになる.
つまり,チャネルにまたがってニューラルネットワークのような計算をしてくれる.
さらに1×1のフィルタを複数チャネルかけることによって,inputのチャネル数を所望のチャネル数に増減させることが簡単にできる.
プーリングでは縦横のサイズを調整できるがチャネル数は調整できなかった. 1×1のフィルタは縦横のサイズは調整できないがチャネル数を調整できる方法と言える.
Inception Network Motivation
CNNのパラメータはたくさんある. フィルタサイズをどうするのか,Maxプーリングをするのか. 選ぶのが大変だ.だったら,全部やってしまえばいいじゃないかというのがInception Networkのモチベーションである.
InceptionNetworkでは,異なるフィルタをかけたものを1つのoutputにまとめる. 図10のようなイメージで動く.
これをすることで,hyperparameterの選択が不要になる. が,これは計算量が膨大になる.とてもとても大きい数になる.
これを解決するために,1×1フィルタを使った中間層(ボトルネック層と呼ぶ)を設けて計算量の削減を行う(図11).
こんなことして性能に影響は出ないのか?と不安になるが,性能には大きく影響が出ないことがわかっており,有意義な手法となっている.
Inception Network
前の章のブロックを積み重ねたのがInceptionNetworkである.
Practival advices for using ConvNets
Using Open-Source Implementation
たくさんの種類のアーキテクチャを見てきたが,どれも複雑で,パラメータの設定などとても大変になる. アプリケーションに応用するためには,自分でここらへんの設定をするのではなく,GitHubとかに上がっているオープンソースの実装を活用すると良い.
GitHubからCloneしてくる方法とかの説明なので割愛.
Transfer Learning
ソースコードだけではなく,学習済みのモデルなんかもネットには上がっている. このモデルを使って転移学習をすることで,特定タスク向けのデータが少なかったとしても,精度の高い分類器を作れる可能性が広がる.
転移学習をする際に,どこからどこまでを学習済みのモデルを使って,どこからをFineTuningしていけば良いかは,持っているデータの量による.
データが少なければ最終層だけをFineTuningするなど,できるだけ深い層まで学習済みモデルで固定してしまう.
データ量が増えるにつれて,固定する層を減らし,深い層を学習するように調整して行く.
もしも大量のデータがあるのであれば初期値に学習済みモデルを使って,後は全て学習を進めて行くようなことも可能である.
データ量に応じた意思決定が必要になる.
Data Augmentation
データ拡張を行うことでデータ量を増やすことができる. 細かい話は割愛.
State of Computer Vision
ComputerVisionの研究から得られた知見を共有する.
まず,機械学習のモデルを育てる上で,2つの知識をシステムにinputする必要がある. 1つがラベル付きの教師データで,もう1つが人が手動で調整した特徴量である.
片方が多かったり優れていたりすれば,もう片方は少なくて良い. ラベル付き教師データが大量にあれば,人の調整した特徴量はなくても良い.
教師データが少なければ,必然的に人の調整した特徴量が必要になる. データが少ない際には,データ拡張や転移学習を行うことでデータ量を増やすことができる可能性があり,有力なオプションとなる.
また,可能であればオープンソースの実装を使うのは良い判断である. 論文で言われている構造やオープンソースで実装されているもの,公開されているモデルなどのデータをうまく使ってアプリケーションを構築しよう.