Inception（V3）について今更ながら整理する

## はじめに
以前の記事でNeural Style TransferをInceptionV3を使って実装する記事を作成しました。ライブラリの恩恵を存分に享受し、短時間でNSTを行える嬉しさを噛み締めながら、内部的なNSTの仕組みを理解する貴重な経験をなりました。

https://qiita.com/Hayato-7812/items/45eb21f22917b3a1616d

しかし、前回の記事を作成しながらInceptionのV3って、V1とは何が違うんだろうと思いました。そこで、今回はその辺の差分をざっくり理解する記事を作成しようと考えました。

<br>
(ここから本題)

InceptionV3は、Googleによって提案された深層学習モデルであり、複雑なアーキテクチャを持ちながらも効率的に計算リソースを使用することを目指しています。本記事では、InceptionV3のアーキテクチャの詳細、特徴、およびその背後にある技術について整理した内容をまとめます。

## GoogleNet（InceptionV1）の背景
InceptionV3の前身は、最初にGoogleNet（InceptionV1）として登場しました。

:::note info
C. Szegedy et al., "Going deeper with convolutions," 2015 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), Boston, MA, USA, 2015, pp. 1-9, doi: 10.1109/CVPR.2015.7298594.
:::

- **ISVRC（2014）**: 画像認識コンペティションで注目を集めました。
- **SparsityとInceptionモジュール**: 効率的な計算を実現するために導入されました。

**ISVRC（ImageNet Large Scale Visual Recognition Challenge）** は、コンピュータビジョン分野における主要な競技会の1つです。2009年に始まり、2017年まで毎年開催されていました。この競技会では、`256×256`の入力画像を1000クラスに分類するタスク（train_data:1.2M,validation_data:50k,test_data:150k）を対象に毎年ロマンのある手法とその結果が示されていました。**GoogleNet(Inception)** はその大会の2014年の覇者です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1071957/897ea454-535c-0609-0e25-e46445083b50.png)
[画像引用元](https://dev.to/sandeepbalachandran/machine-learning-transfer-learning-543j):Machine Learning - Transfer Learning - DEV Community

### Architecture
- **AlexNet**: 5層
- **VGG**: 13層
- **GoogleNet**: 22層

従来手法と比較したときのGoogleNetの特徴はなんといってもその層の深さにあります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1071957/8138f714-ddc2-4168-28f9-38f6f74187e5.png)

[画像引用元](https://arxiv.org/pdf/1409.4842):Figure 3: GoogLeNet network with all the bells and whistles

## 従来手法の課題

AlexNetによってもたらされたDeepな画像分類手法のブレイクスルーによってネットワークの深さを増大させることで、モデルの表現力を向上させるような手法に関心が集まりました。 しかし、大量のパラメータが必要で計算コストが高いことや、他のユニットに影響を与えないユニットが存在するような構造(=**Sparse**)に陥るという問題点がありました。（メモリコストが無駄になるため、SparseからDense（密）への変換が必要）

それらの課題を解決するために提案されたのが **Inception Module** です。
  

### Inception Module

GoogleNetでは、以下のようなInceptionモジュールが使用されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1071957/58d18581-752d-e556-2fae-c58f228f9a8f.png)

[画像引用元](https://arxiv.org/pdf/1409.4842):Figure 2: Inception module


1. **マルチスケール特徴抽出**:
    異なるサイズの畳み込みフィルター（1x1、3x3、5x5）を使用することで、画像内の異なるスケールの特徴を同時に捉えることができます。これにより、より豊かな特徴表現が可能となります。
    <br>

2. **計算効率の向上**:
    1x1の畳み込みを活用することで、計算コストを削減しつつ、高性能を維持します。
    

## InceptionV3の改善点

:::note info
C. Szegedy, V. Vanhoucke, S. Ioffe, J. Shlens and Z. Wojna, "Rethinking the Inception Architecture for Computer Vision," 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), Las Vegas, NV, USA, 2016, pp. 2818-2826, doi: 10.1109/CVPR.2016.308. 
:::

上記の論文には、InceptionV2,V3について説明がされています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1071957/2fcfa05e-9395-2329-b26b-27f63c6eb7e3.png)
[画像引用元](https://cloud.google.com/tpu/docs/inception-v3-advanced?hl=ja):Inception v3 詳細ガイド  |  Cloud TPU  |  Google Cloud


### 1. 小さい畳み込みへの分解（Factorization into Smaller Convolutions）
大きな畳み込み（例：5x5）を小さな畳み込み（例：(3x3) x 2）に分解します。これにより、計算コストが（例：28%）削減されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1071957/bdccd4ca-7784-de41-f65c-32d8fa030603.png)
[画像引用元](https://arxiv.org/pdf/1512.00567)：Figure 1. Mini-network replacing the 5 × 5 convolutions

### 2. 非対称畳み込みへの分解（Factorization into Asymmetric Convolutions|Factorization into Asymmetric Convolutions）
フィルタ（例：3x3）による畳み込みを（例：1x3と3x1に）分解します。これにより、計算コストが（例：33%）削減されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1071957/5e08744d-998f-dc2c-dbf5-4342356a9031.png)
[画像引用元](https://arxiv.org/pdf/1512.00567)：Figure 3. Mini-network replacing the 3 × 3 convolutions. 

<br>

以下は（（左）InceptionV1 ｜ （中）Factorization into Smaller Convolutions ｜ （右）Factorization into Asymmetric Convolutions）それぞれのInceptionモジュールの比較です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1071957/c17adb7d-b5b1-3a58-cf57-63c11bc4e682.png)



### 3. 効率的なグリッドサイズの縮小（Efficient Grid Size Reduction）

異なる畳み込みやプーリング操作を **並列** に実行し、その出力を結合することで、情報損失を最小限に抑えつつ計算効率を向上させます。


### 4. 補助分類器の利用（Utility of Auxiliary Classifiers）
補助分類器を使用することで、深いネットワークの収束を改善し、トレーニングの安定性を向上させます。（Google Netでは3つの補助分類器を使用しているのに対して、InceptionV3は2つを使用しています。これは、Auxiliary Classifierに学習を早くする効果はなく、学習終盤でモデルを正則化をする効果があるということがのちの研究で判明したためです。）