本記事では前回の内容であるZFNetに引き続き、畳み込みニューラルネットワークの世界で名を残しているVGGNetについて解説していきたいと思います。
当サイトはTwitterやYouTubeでも情報発信しています。ご気軽にフォロー(@AGIRobots)、チャンネル登録お願いします!
本記事の解説動画です。ぜひご覧ください!
VGGNetとは
VGGNetとはILSVRC2014年において、GoogLeNetに続いて好成績を残した深層畳み込みニューラルネットワークでオックスフォード大学のVisual Geometry Group(略称:VGG)といわれるチームが開発したネットワークです。
このニューラルネットワークが考案された当時、畳み込みニューラルネットワークを代表に、層を深してくのが流行りでした。そこで、VGGは、CNNの深さが正解率へ与える影響を調査しようとしました。ILSVRC2012に優勝したAlexNetを改良したZFNetは、最初の畳み込みフィルタサイズを小さく、かつストライドを小さくすることで性能向上を実現したので、VGGでは上下左右中心といった特徴を捉えることができる最小のフィルタサイズである3×3の畳み込みを使用しネットワークを深くすると、正解率にどのような効果があるのか調査しました。その際に作成されたネットワークがVGGNetと呼ばれるものです。
VGGNetの功績として、サイズが3×3の畳み込みフィルタを何層も重ねることで、5×5や7×7といった受容野の大きい畳み込みフィルタと等価な受容野で、より高性能な検出が実現でき、さらに未知のデータに対しても対応できる一般化された特徴を学習可能であることを発見しました。
VGGNetには、11層、13層、16層、19層のものがあり、なかでも有名なものは16層と19層のネットワークで、それぞれVGG16、VGG19という愛称で呼ばれています。VGGチームは、畳み込みフィルタサイズに関する調査以外に、LRNに必要性があるのかどうかにも議論していて、LRNあり、なし、1x1畳み込み層あり、なし、でも実験を行っています。一般的にVGG16、VGG19と呼ばれるネットワークはLRNも1x1畳み込み層も使用せず、3x3畳み込み層、最大値プーリング層、全結合層のみから構成されています。
いきなり1x1畳み込み層の話が出てきましたが、チャンネル方向へ変換を施す点はLRNと同じなので、比較として使用しているものと思われます。
VGG19については最後に示すので、先にVGG16として頻繁にみられる図を以下に貼りました。
この図は、それぞれの処理が施された後に出力された特徴マップを示していて、畳み込み層が何層も連続で続いていることが分かると思います。
全結合層まで示した図です。詳しい内容については、要点を紹介した後に、VGG19のほうで解説しようと思います。
要点
主な要点は以下の2つです。
- 受容野の小さい畳み込み層を幾つか重ねるとよい
- LRNにあまり効果はない
3×3畳み込みフィルタの万能さ
受容野の等価性
ここでは、7×7の受容野を持つフィルタや5×5の受容野をもつ1層のみからなる畳み込みフィルタを、複数層の3×3畳み込みフィルタで構築できることを説明します。
以下の図を見てください。7x7畳み込みフィルタの受容野は7x7の領域です(下図:左)。同様に、5x5畳み込みフィルタの受容野は5x5の領域です(下図:中心)、3x3畳み込みフィルタの受容野は3x3です(下図:右)。
ここで、7x7と5x5という受容野を1層の畳み込み層ではなく、3x3の受容野をもつ畳み込み層を複数層重ねることで実現させることを考えたいと思います。まず、3x3の畳み込み層を2層重ねてみます。このとき、以下のアニメーション前半(3x3→5x5)のように、2層目の3x3畳み込みフィルタの受容野に収まる1層目の3x3畳み込みフィルタの移動可能範囲は5x5になます。つまり、5x5の受容野は2層の3x3畳み込みフィルタで実現できることが分かります。同様に、7x7の受容野は3x3畳み込みフィルタを3層重ねることで実現できることが分かります。
なぜ受容野の大きい単一のフィルタだと駄目なのか
同じ受容野を持つフィルタがあったとき、単一で実現したものと、受容野の小さいフィルタを複数重ねて実現したものがあることが理解できたと思いますが、どちらが高性能だと思いますか。前者と回答される方が結構いるのではないでしょうか?
しかし、後者の方が捉えることができる特徴的に優れているのです。フィルタサイズに関しては、AlexNetからZFNetへ修正された際の教訓として実験的に小さい方が良いことが分かっています。つまり、サイズが大きいフィルタは、とりわけ大きい、もしくは小さい周波数成分の特徴しか捉えることができなかったのです。そこで、ZFNetでは強制的にフィルタサイズを小さする制約を課すことで丁度良いサイズの周波数成分をとらえられるようにしました。具体的にフィルタサイズの違いについて説明すると、AlexNetの1層目の畳み込みフィルタのサイズは11x11で、ZFNetの1層目の畳み込みフィルタのサイズは5x5です。
VGGNetでは、まだ小さくする余地があるということで、更に小さくい3x3のフィルタを使用しました。
LRNと1x1畳み込み層
この話題は動画では解説していないので、あっさりとポイントだけ以下に示します。
ポイント
- LRNも1x1畳み込みも、特徴マップにおいてチャンネル方向に計算を行う。
- LRNは周辺抑制に特化した決まった変換を実施する。
- 1x1畳み込み層はチャンネル方向に対して線形変換を施す。
- 1x1畳み込み層は一般的な畳み込み層の特別な場合であり学習パラメータを持つ。
どちらの手法もチャンネル方向に対して変換を施すのですが、1x1畳み込み層は学習可能なパラメータをもつため、学習によって、LRNが実現する周辺抑制に限らず色々な変換を習得できるという点で柔軟性に長けています。
VGG19の概要
先にVGG16について触れましたが、最後にVGG19について説明していきたいと思います。VGG19ではボトルネック層(1x1畳み込み層)は使用されておらず、3x3の畳み込み層のみで構成され、VGG16に比べ少し深層になっています。VGG19では3x3畳み込み層が最大で4層連続し、その範囲だけで考えれば受容野は3x3から、9x9に増加します。下図において、一番左の数字の列は、連続する畳み込み層を1つの単位として、受容野がどのように広くなるのかを示しています。真ん中の列は層の処理が適用されたあとの特徴マップのサイズを示しています。右はそれぞれの層の一連の流れを示しています。例えばConv3 64は、3x3の畳み込みフィルタが64種類あることを示しています。
このように、位置を検出できる最小サイズのフィルタ(3x3)を連続に何層も繰り返すことで、大きなサイズのフィルタ(上図では5x5、7x7、9x9)の処理を高性能に実行する点は、VGGの大きな発見ということになりました。
最後に
ここまで、AlexNet、ZFNet、VGGNetと、基本的な構造をする畳み込みニューラルネットワークについて見てきました。これらは、初期のLeNetのような畳み込みニューラルネットワーク構造に少しの改良を加えるような変化でしたが、次回以降は別の視点から、更に複雑で深層になっていきます(GoogLeNet、ResNet)。
次回以降の記事も頑張って執筆していきたいと思っていますので、どおぞ本アドベントカレンダ最後までお付き合いいただけると幸いです。
最後までお読みいただきありがとうございました。