GoogLeNet再考:Inception構造に見るCNN深層化の礎石!1×1ボトルネックで切り開くディープCNNの世界

こんにちは、ゆずかきです。
ここからは、「GoogleNet (GoogLeNet)」と呼ばれる、ディープラーニング・コンピュータビジョン史上の金字塔的なネットワーク構造について、テクニカルな視点で解説してみたいと思います。

先日、最新のAI論文を読んでいたら、「GoogleNet」という名前を改めて目にして、
「いやいや今さらGoogLeNet? もうずいぶん昔に出たやつでしょ?」
……と思われる方もいるかもしれません。

しかし実は、GoogLeNetは現在でも多くの研究のベースアーキテクチャとなっている「Inception構造」を包含しており、当時のImageNetの大規模競技会で優勝した実績があるなど、今なお注目・再評価に値する存在なのです。特に、推論の効率性と表現力を両立させるための「Inception Module」の設計思想は、ネットワーク設計の一つの金字塔として取り上げられ続けています。

本記事では論文「Going deeper with convolutions」(Christian Szegedy ら、arXiv:1409.4842)の内容を、技術的な観点からできるだけ丁寧かつ網羅的に解説します。
ターゲットとしては、CNN(Convolutional Neural Network)の基礎を一通り理解している中級~上級エンジニア・研究者向けにしています。

GoogLeNetの歴史的経緯、Inceptionの設計思想、パラメータ構造、そして論文内の実験結果などをまとめました。ブログの後半では、実際のモデル性能やImageNetでの驚異的成果、さらに検出(Detection)タスクへの応用まで解説します。

それでは、早速みていきましょう。


§本記事の構成

  • はじめに: GoogleNet (GoogLeNet)とは?
  • Inception Module:設計思想の背景
  • Inception構造の詳細(寸法削減のアイデアなど)
  • GoogLeNet全体アーキテクチャ
  • 学習方法(Training Methodology)
  • ILSVRC 2014での圧倒的成果(分類 & 検出)
  • まとめと今後の展望

§はじめに: GoogleNet (GoogLeNet)とは?

論文タイトルは、

Going deeper with convolutions
Christian Szegedy, Google Inc.
arXiv:1409.4842, 17 Sep 2014

当時、ディープラーニングは既にAlexNet(Krizhevsky et al. 2012)やVGGなどで急激に注目を浴びていましたが、「とにかく層を増やしたりフィルタ数を増やすだけではメモリや計算量が膨大になる」という問題に直面していました。

これに対し、GoogLeNetは「Inception構造」と呼ばれる工夫を取り入れ、「高次元をそのまま扱うのではなく、1×1畳み込みを活用した次元削減で計算量を抑えつつ、多スケールのフィルタを並列に使う」という革新的な方法を提案。
これが2014年のImageNet Large Scale Visual Recognition Challenge(ILSVRC)で優勝(Top-5エラー率6.67%)を獲得したことで一躍有名になりました。


§Inception Module:設計思想の背景

GoogleNetの中核は何と言っても「Inception Module」と呼ばれるブロック構造です。
「Inception」という名前は、Linら(Network in Network論文)に出てきた1×1畳み込みなどの手法をさらに発展させ、“We need to go deeper”というミームにちなんだものだそうです。

論文では、「大きなSparse接続構造を、既存GPUなどで高速に実装しやすいDenseなブロックに近似する」という考え方を基盤にしています。理想は(理論上)大規模なスパース接続が最適だけれども、それを素直に実装するとハードウェアのメモリアクセス負荷で非効率。ならば小さなDenseな畳み込みブロックを組み合わせ、スパース構造を模倣しようというのがInceptionの基本的発想です。

具体的に言えば、「同じ層で1×1, 3×3, 5×5など複数サイズのカーネルを並列適用し、さらにプーリング(Pooling)も並列に入れる」ことで、多スケールな特徴を(スパース構造を近似する形で)一気に抽出します。
同時に、そのままだと3×3や5×5の計算コストが膨れ上がるので、1×1畳み込みによる次元削減(bottleneck)を前段階に挟むことで、計算量・パラメータ量をコントロールしているのが最大の要です。

Sparse構造とDense実装

論文冒頭でも言及されているように、真にSparseな構造をGPU上で扱うのは大変(ランダムなスパース行列積などはキャッシュミスが増大し、現実的には遅い)。
一方で、Denseな畳み込み演算はCUDNNなどの高度に最適化されたライブラリで爆速に走る、というジレンマがあります。

Inceptionでは「スパース構造をDenseブロックで近似する」方針に加え、各フィルタの並列化や1×1フィルタでのbottleneckを使うことで、理想的スパース構造に近づけようとしています。これが主要なメリットであり、ImageNetクラスの巨大タスクでも過度な計算量の爆発なくディープ化に成功しました。


§Inception構造の詳細(寸法削減のアイデアなど)

(1) Naïve版 Inceptionモジュール

まず最初に考えられる「Naïve版 Inceptionモジュール」(図 2(a) 参照)は、

  • 同じ層の入力に対し、1×1, 3×3, 5×5畳み込みを並列に適用
  • 並列にプーリング(pooling)もかける
  • 最後に、それらの出力をチャンネル方向に結合(Filter concatenation)

というシンプルな構造です。

ただし、この形だと5×5の計算負荷が大きく、さらにプーリング層の出力もそのまま次層に接続すると、ネットワークが深くなるごとにチャンネル数が膨大になりかねません。

(2) Dimension Reduction付き Inceptionモジュール

そこで論文にある図 2(b)のように、

  • 3×3と5×5の前に1×1畳み込みを挟んで次元削減(bottleneck)する
  • プーリング後にも1×1畳み込み(pool projection)をかける

こうすることで、フィルタを適用する入力チャンネル数を減らして、結果的に「層の出力チャンネル増加を抑えつつ多スケール抽出ができる」ようになりました。

1×1畳み込みは、単なるチャネル方向の線形変換として使えるので高次元ベクトルを圧縮する役割を担います。かつ、ReLUなどの非線形変換も挟まるため、表現能力自体は損なわずに次元削減と計算削減を同時に達成できる、というわけですね。

このInceptionブロックを積み重ねていくことで、ネットワーク深度を稼ぎながらも巨大化を抑え、かつマルチスケールな特徴抽出を実現しています。


§GoogLeNet全体アーキテクチャ

(1) 全体構成:深さ22層(パラメータ層のみカウント)

本論文・本モデル(GoogLeNet)は、冒頭でも述べたとおりILSVRC 2014で第一位を獲得したアーキテクチャです。

  • 入力:224×224 RGB(平均画素値を引いて正規化)
  • 初期の数層は通常の畳み込み+プーリング
  • 中盤~後半でInceptionモジュールを大量に積む
  • Fully Connectedの代わりにGlobal Average Pooling (7×7プーリング) を使用
  • 出力:1000クラスのソフトマックス

論文中の表(Table 1)をざっと見てみると、「inception (3a)」「inception (3b)」「inception (4a)」など、ステージごとにInceptionモジュールが並んでいるのが分かります。

最終層は、Global Average Poolingで1×1×1024のベクトルにして、そのままソフトマックス分類器につなげるという構成。 これはLinらの“Network in Network”手法(Fully Connectedを排して、Global Average Poolingを使う)を踏襲しており、パラメータ数を抑えつつ出力に向けて特徴抽出する、という狙いです。

(2) 追加のAuxiliary Classifier

GoogLeNetは「22層」もの深さがあるため、勾配消失の懸念がありました。その対策として、中間層(Inception (4a)や(4d))からも小さい分類器を出して、補助的にロスを与えるという仕組みを導入しています。

  • 中間層から分岐して、5×5プーリング → 1×1畳み込み(128ch) → FC(1024) → ドロップアウト → ソフトマックス
  • 中間の補助分類ロスはメインロスに0.3倍ほどで加算(重み付け)
  • テスト推論時には、この補助分類器は破棄

これで勾配が中間層まで届きやすくなり、学習も安定。かつテスト時にはネットワークを軽量化できる、という非常に実用的な工夫ですね。

(3) パラメータ数の抑制

当時のAlexNetなどと比較しても、GoogLeNetはパラメータ数がむしろ少ない(約500万~600万程度)と言われます。
論文中では「KrizhevskyらのWinning architectureよりも12倍パラメータ削減」とも書かれており、巨大化に頼るだけではない賢さを示した好例です。


§学習方法(Training Methodology)

論文によると、分散学習基盤DistBelief(Google内部システムの当時の実装)を用いて、モデストなモデル並列&データ並列で学習。
ただし、理論的には高性能GPU数枚を用いれば1週間程度で学習可能だろう、とも言及されています。

  • 最適化:モーメント付き確率的勾配降下(SGD + momentum=0.9)
  • 学習率:8エポックごとに4%ずつダウンなどの固定スケジュール
  • Polyak averaging:パラメータの移動平均を最終モデルに採用

また、データ拡張としてのランダムクロッピング、アスペクト比の変動、フォトメトリックな歪みなどを駆使しているとも。
ILSVRCに合わせてさまざまに試行錯誤しているため、最適な1通りのレシピは確立できていないが、小さい/大きいクロップを混在して学習したり、補助的にフォトメトリック増強を入れたりしてオーバーフィットを防ぐ方針だと説明されています。


§ILSVRC 2014での圧倒的成果(分類 & 検出)

(1) 分類タスクでの優勝

ImageNetの分類(1000クラス)において、GoogLeNetはトップ5エラー率6.67%を叩き出し、第1位に輝きました。
当時のベストモデルと比べても約40%近くエラー率を下げ、2012年のAlexNet対比では約56.5%のエラー削減という凄まじい結果。

論文内でも推論時の工夫として、

  • マルチクロップ(スケールを変えた4通りの画像を左右・上下・中心などから切り出し、さらに左右反転)で144枚の部分画像を作り、それらを平均化
  • 7つのGoogLeNetモデル(重み初期値やサンプリング方法を変えたり、1つは幅を少し広げたモデル)をアンサンブル

などを組み合わせ、最終的なトップ5エラー6.67%に到達。
1モデル・1クロップだけだとエラー率は10%ほどになるという結果も示しており、「アンサンブル + 多クロップ」がさらに精度を上げる主要因となったことがわかります。

(2) 検出タスク(R-CNNへのInceptionベース組込み)

さらに、ILSVRC 2014の検出(Detection)タスクでもmAP 43.9%を記録し1位を獲得しています(ただし、微妙なモデル差やアンサンブル手法での順位変動はあった模様)。

手法自体はR-CNN (Girshick et al.)系のパイプラインを踏襲:

  1. 物体候補領域の抽出(Selective Search + MultiBox)
  2. 抽出領域をGoogLeNetで分類
  3. アンサンブルを組み合わせて最終スコア

とのこと。
大きなポイントとしては「物体候補数を減らしつつカバレッジ率が高い」という工夫を入れて、かつカテゴリ分類にGoogLeNetを使ったことで検出精度も一気に向上。

ただし、バウンディングボックス回帰コンテクスト利用はやっておらず、この状態でも高mAPを達成しているのは、Inceptionの表現力が非常に高いことの証明でもあります。


§まとめと今後の展望

GoogLeNet(Inception v1)は、1×1畳み込みによる寸法削減複数スケール畳み込みを並列に処理するという斬新なアイデアで、高い分類精度・検出性能を同時に達成しました。

  • Sparseな理想構造Denseなブロック(CUDNN最適化)で高速実装
  • 1×1ボトルネックで計算量・パラメータ量の爆発を抑える
  • 層を深くしながらパラメータはむしろ抑えられる
  • ILSVRC2014優勝により広く知れ渡る

このInception Moduleの系譜は、その後もInception v2, v3, v4, Inception-ResNetなどに発展し、ディープラーニング界の一大トレンドを作りました。
2020年代の最新研究ではTransformer系が注目されがちですが、CNN系アーキテクチャの古典的名作であるGoogLeNetの功績は、いまだに多くの応用のベースとなっています。

実際に自前の画像分類・物体検出タスクなどでGoogLeNet系を試してみたい方は、PytorchやTensorFlowに公式サンプルがあるため、比較的容易に実装できるでしょう。特にリソースの限られたエッジ端末等では、パラメータ効率のよいGoogleNet系がまだまだ選択肢に入るはずです。

今後、SparseやAttentionなどさらに高度な手法が研究される中でも、「計算リソースを大きく増やさず効率的にネットワークを深くする」というInceptionの思想は応用範囲が広大だと思われます。

最後までお読みいただき、ありがとうございました。


🔑本記事のポイントまとめ

  • GoogLeNet (Inception v1):2014年のILSVRCで優勝した画期的CNN。
  • Inception Module:並列に1×1, 3×3, 5×5を実行、プーリングも並行するが、1×1で寸法削減して計算負荷を抑える。
  • Sparse構造の近似:理想的にはスパース接続が最適だが、Denseな畳み込みで実装効率を確保。
  • パラメータ数が少ない:従来よりも深いのに、計算量・パラメータが驚くほど小さい。
  • ILSVRC2014で圧倒的:分類トップ5エラー6.67%、検出mAP 43.9%、当時の最先端を大きく上回った。
  • 応用・展開:Inception v2, v3, v4, Inception-ResNetなど多数の後継、および多様なCNNタスクのベースとなる。

§参考文献(論文リンク)

(他にも多数の参照文献は論文中に記載)


画像解析

Posted by yuzukaki-dialog