本日は、ZFNetについて解説していきたいと思います。ZFNetはAlexNetの改良版という位置づけになるため、そこまで存在感はありませんが、何を改善したのかという観点で、アイディアが感じられます。内容的には次の内容のVGGNetと重なる部分がありますが、解説していきたいと思います。
当サイトはTwitterやYouTubeでも情報発信しています。ご気軽にフォロー(@AGIRobots)、チャンネル登録お願いします!
AlexNetとは
まずは、AlexNetの復習からです。AlexNetとはILSVRC2012の画像認識コンペで1位を獲得した8層の畳み込みニューラルネットワークです。ネットワークの構造は、初期の畳み込みニューラルネットワークであるLeNetに近く、具体的には以下の図に示すような構造をしています。
AlexNetは、以下の5つの大きな特徴を持ちました。
- Overlapping Poolingの使用
- LRNの使用
- Dropoutの使用(←前回の記事で説明し忘れた)
- 出力層を除く前層でReLUを使用
- マルチGPUの使用
まず、224x224x3の画像を受け取って、2つのGPUそれぞれが11x11x48の畳み込みフィルタをストライド4で畳み込み計算を実行し、またLRNを適用して55x55x48の特徴マップを2つ作成しました。そのと、OverlappingによるMaxPoolingを実行し、5x5x128の畳み込みフィルタをもって27x27x128の特徴マップを2つそれぞれのGPUで作成しました。こんな感じで出力層まで計算が進んでいきます。AlexNetについては以下の記事をぜひお読みいただければと思います。
AlexNetの課題
AlexNetに関して、以下の2点の問題が見つかりました。
- 程度良い周波数成分が抽出できていない
- エイリアシングの発生
AlexNetの最初の畳み込み層を見てみると、フィルタサイズがとても大きいです。これは、程度良いサイズの特徴を獲得するのを妨げてしまっていたと考えられています。その代わり、極端に大きな特徴か小さい特徴は獲得できていたようです。また、最初の畳み込みカーネルのストライド幅が大きいことに起因して、エイリアシングが発生してしまったようです。
解決策
解決策はいたってシンプルなもので、畳み込みフィルタサイズおよび、ストライドサイズを小さくすることです。
全体像
ZFNetの全体像を以下に示します。ZFNetでは2つのGPUに分けて計算していないので、以下にように1つのパスで入力から出力層へデータが伝わっていきます。AlexNetの1つ目の畳み込みフィルタ(11x11x48)x2のサイズを(7x7x96)へ小さくし、ストライドを4から2へ小さくしています。これにより、1つ目の畳み込みフィルタを適用した後の特徴マップのサイズは、(110x110x96)になります。その後に、3x3のプーリングフィルタをストライド2でOverlapするように計算し、フィルタサイズ(5x5x256)の畳み込みフィルタを適用しています。2つ目の畳み込みフィルタのストライドは、AlexNetの時は1だったのですが、ZFNetの時は2になっています。特徴マップのサイズの変化からも見て取れると思います(一辺がプーリング層と畳み込み層の適用前後110→26になっているので)。このように計算がされて、出力層までデータが伝わっていきます。
まとめ
ZFNetはAlexNetの改良版なので、これといって大きな特徴があるわけではありませんが、カーネルサイズおよび、ストライドは小さい方がいいのではないかということが実験的に分かったという成果があります。次の記事で扱うVGGNetもZFNetのように、同じようなアイディアを持って更に改良を加えたものになっています。
今回の記事は以上です。最後までお読みいただきありがとうございました。