(仮投稿)GoogLeNet(Inception)の技術についてアイディアレベルで解説 【Deep Learning アドベントカレンダー2020】

本記事では、GoogLeNetについて解説していきたいと思います。GoogLeNetは、コードネームがInceptionといわれるモジュールを積みかさねて深層にしたニューラルネットワークです。GoogLeNetはあくまでもInceptionを具体的に利用したものにすぎないので、基本的な理論はInceptionに詰まっています。よって本記事の大半は、Inceptionについて紹介し、最後にGoogLeNetの紹介をしようと思います。

当サイトはTwitterやYouTubeでも情報発信しています。ご気軽にフォロー(@AGIRobots)チャンネル登録お願いします!

Inceptionとは

Inceptionモジュールは、かつてのネットワークで一般的だった1つの層には1種類の処理構造(つまり、1つの層の中にサイズの異なるフィルタを使用するなどなく、例えば3×3であれば3×3のフィルタだけがある)というアーキテクチャを大きく覆しました。1つの層は複数のパスに分けられ、1×1畳み込み、3×3畳み込み、プーリングといった複数の処理系を通るようなアーキテクチャをしています。これは、前回説明したNetwork In Networkに着想を得ています。Network In Networkの論文では畳み込みフィルタの中にマイクロネットワークとして多層パーセプトロンを埋め込んでいますが、同様に、GoogLeNetでは、マイクロネットワークとしてInceptionモジュールを埋め込んで多層にしたという感じです。とはいえ、個人的には、Network In Networkを発展させる形で生み出されたのではなく、実現したい課題を解決する際にNetwork In Networkの考え方から大きなヒントを得たという感じだろうと思っています。本来、Inceptionの開発動機は、好奇心的なものだけでなく、ネットワークが深層になるにつてれパラメータ数が膨大になることは、使用範囲を制限してしまうので、パラメータ数を減らしつつ深層にするにはどのようにしたらいいのだろうかという部分に焦点を当てていたからです。そして、ネットワークの性能向上の基本方針として、ネットワークの深さと幅を増やすことという点に着目しました。多層パーセプトロンでも、層あたりのニューロン数を増やせば性能が向上することは知られていますが、異なる畳み込みフィルタを横に並べるというのは新しいアイディアでした。

いま、Inceptionのさわりの部分をお話ししましたが、とても興味深いネットワークなので以降で、初期のナイーブなものから順番に学んでいきましょう。

Inceptionモジュールの基本的思想

最初に、Inceptionモジュールの構造のベースとなる考え方について紹介したいと思います。まず、畳み込みニューラルネットワークは、各層の計算に局所的な受容野を持つフィルタを使用しており、これは、全結合ネットワークで考えると、構造的にとてもスパースなわけですが、

好奇心的な動機
→畳み込みニューラルネットワークの最適な局所スパース構造は、すぐに利用可能なパーツで近似できないか?
基本的な方針
→深層ニューラルネットワークの性能向上の基本はネットワークの深さと幅を増やすこと
問題が発生
→計算量が多い
→ネットワークのキャパが大きいため過学習が陥りやすい
対処法
→制約を加えてスパースにする
 →スパースにすると無駄なゼロが増えて、無駄に計算やメモリを食うことになるので、あまり好ましくない
 →そもそも畳み込み層やプーリング層ってスパースでしょ?
→なら、計算量やモデルのキャパを減らすにはパラメータを減らせばいいんじゃないか?
 このようなボトルネックを解消するには、ボトルネック層を使用しちゃおう!
ナイーブなものから発展的なものまで


さまざまなInceptionモジュール

ナイーブなInceptionモジュール

Inception V1

Inception V2

Inception V3

Inception V4

GoogLeNet

Follow me!

0