そういえばAlexNetって何だったっけ？

# 原著論文
### ImageNet Classification with Deep Convolutional Neural Networks
> Krizhevsky, Alex, Ilya Sutskever, and Geoffrey E. Hinton. "Imagenet classification with deep convolutional neural networks." Advances in neural information processing systems 25 (2012).
([元論文リンク]( https://proceedings.neurips.cc/paper/2012/file/c399862d3b9d6b76c8436e924a68c45b-Paper.pdf))

Hinton 大先生のところの Alex さんが優れたネットワークを作成しましたよって話．CNN (畳み込みニューラルネットワーク) を用いた画像認識の元祖とも言えるネットワーク．ただしこれは 2012 年の話なので，当時は優秀だったが今は話すら聞かないレベルになってしまった．**とはいうものの**，今もなお使われている手法を提案したとして元祖なのである．
~~このネットワークは私が学部生時代に，先輩から教えてもらった CNN の 1 つで，当時はこれが最強だと信じていました，懐かしい...~~
ちなみにこの記事は論文をそのまま噛み砕きまくって，特徴的なところだけを搾り取った蒸留済みの離乳食みたいな記事なので，ぜひ元論文でも十年モノ(2022年現在)の論文を味わってみてください．

# AlexNetのすごいポイントってどこにあったの？
原著論文の第三項，"The Architecture" にいくつか書かれている．今回は今もなお使われているであろう技術のみを記載する．~~複数の GPU を使いました〜みたいな記載もあるがこれは取り上げない．~~
1. ReLU Nonlinearity
2. Local Response Normalization
3. Overlapping Pooling
4. その他

## 1. ReLU Nonlinearity
当時メジャーに使われていた出力層での活性化関数は Hyperbolic tangent function
```math
f(x) = tanh(x)
```
![tanh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711990/b72f23da-4f78-1f0d-8d77-e3b1788b79f5.png)

もしくは Sigmoid function
```math
f(x) = (1+e^{-x})^{-1}
```
![sigmoid.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711990/3df531f8-209a-07b1-2554-7eabdaf008c9.png)

であった．
~~そういえば最近どこかで非線形な tanh とか sigmoid とかの活性化関数の見た目が似ているからどれがどれか当てられるかなソムリエみたいな記事を見かけた気がする．似てるなこれ．でも tanh の方が sigmoid と比べると，さすが tan 一族だからか 1 への収束速度が早いなという印象~~

ところがこの論文で用いられたのは ReLU (Rectified Linear Unit) 関数であった．
```math
f(x) = \begin{cases}
    x & (x > 0) \\
    0 & (x \leq 0)
  \end{cases}
```
![relu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711990/dee02746-9738-c181-38cb-707e95d412be.png)

原著論文いわく，勾配降下にかかる時間について言えば非線形で収束傾向にある tanh とか sigmoid とかの関数は， ReLU のような非線形かつ収束傾向にない関数より学習に時間が掛かってしまうらしい．以下のグラフを見ると学習のエラー率 25% に到達するまでの時間が全く異なっていることがわかる．

![Screenshot 2022-05-03 at 12.33.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711990/69031973-9c78-cbf8-09bc-1e06db1d5953.png)

(画像は原著論文より引用)

## 2. Local Response Normalization
~~英国経験があることをいいことに調子乗って British English だと Normali**s**ation になるんじゃないかと思ってたけど，Normalization が通例だと知りました．恥ずかしい．~~
Local Response Normalization，略して LRN は *lateral inhibition* という生物神経学の用語らしく，隣り合う脳神経の活動負荷を減らすことを指すらしい．
さて，深層学習系における NN は名前の通り脳神経を模したわけですが．あくまで中間層は**特徴を取り出すためのフロー**だと考えることにしよう．このとき，特徴を取り出す過程において**必要な特徴 (量) がパキッとわかるようにしておきたい**というのがコンセプトになっています．
例えば，変数 5 つに対して，2 番目の要素が特徴的に "効いている" 場合，以下の 2 つのうちどちらの方が有用だと言えるでしょうか？
```
A: [  0,   0,   1,   0,   0]
B: [0.1, 0.2, 0.7, 0.2, 0.1]
```
A の場合は 2 番目に特徴的な部分があり， B の場合は 2 番目に相対的に特徴的だと言える部分がある． *lateral inhibition* の考え方によれば，B の場合は他のニューロンに "迷惑をかけている" ので，A の方が有用だということらしい．
要は，**中間層の当初の目的通り，特徴を特徴として "らしく" 際立たせようぜ**というのが狙い．
LRN の数式は以下の通り．

```math
b^{i}_{x,y} = a^{i}_{x,y} / \biggl(k + \alpha　\sum_{j=max(0,i-n/2)}^{min(N-1, i-n/2)} (a^{j}_{x,y})^2\biggl)^\beta
```
$a^{i}\_{x,y}$ はi番目のカーネルにおける $(x, y)$ を意味していて，$b^{i}\_{x,y}$ はこれに対する出力を意味している．
例えば CNN ではサイズ $W^{i} × H^{i}$ の特徴マップが出力されたとして，それぞれのマップにおける同座標 $(x, y)$ を
```math
 x = 0\le x \le W^{i}-1 \\ y = 0\le y \le H^{i}-1
```
で比較をして，中でも一番特徴的なものを際立てようとしているのである．
$k, n, \alpha, \beta$ はユーザがその値を決定するハイパーパラメータにあたる．(原著論文では $k=2, n=5, \alpha=10^{-4}, \beta=0.75$ が用いられていた)
**雑に説明していいなら，それぞれのチャンネルにおける特徴マップを同じ座標同士で比較して，適当に $k$ とか $\alpha$ とか $\beta$ とかで重みを付けて重要情報だけをちゃんと残そうぜ大作戦**といった感じ．

## 3. Overlapping Pooling
通常，Pooling 層では特徴マップの出力の特徴をはっきり抽出する (summarise は直訳では「要約する」だがパッとしなかったので意訳してます．間違っていたらご指摘ください．)が，
Downsampling と呼ばれる，画像を圧縮する操作をこの層では実行するのだが，例えば Max Pooling と呼ばれる Pooling 手法を採用する場合は，該当する窓 (画像に対して$(n×n)$の局所領域だけ) に注目した時，その窓内の最大の値を代表値とする．

(例)
```math
\left(
\begin{matrix} 
10 & 9 & 3 \\ 
8 & 9 & 2 \\
1 & 12 & 8 
\end{matrix} 
\right)
→12
```
この窓を特徴マップ内でずらしていくと元の特徴マップより小さい特徴マップが獲得できることが分かる．
さて，例えば $2×2$ の窓かつ $2$ のストライドで Max Pooling をした時のことを想定しよう．この場合は窓同士が重なることはありえない．しかし， $3×3$ の窓かつ $2$ のストライドで Max Pooling をした場合は必ず重なる部分が発生する．つまり，この重なりの発生を許したものが Overlapping (Max) Pooling なのである．これの採用によって損失が減ったと論文では述べられている．
日本語で Overlapping Pooling のことを調べても全く資料が出てこなかったのだが，これは今となってはアタリマエだからであろうか...?

## 4. その他
ネットワークの構築以外でも過学習を防ぐために用いられている技術を紹介する
- Data Augmentation
データの数を水増ししたり，データの多様性を高めるために用いられる技術で，画像を反転させたり，PCAと呼ばれる色を調整する手法が知られている．

- Dropout
50% の確率でニューロンを停止させる手法である．これによって局所解に陥ったりすることを防いでいる．

# 参考リンク集
- ImageNet Classification with Deep Convolutional
Neural Networks https://proceedings.neurips.cc/paper/2012/file/c399862d3b9d6b76c8436e924a68c45b-Paper.pdf
- Understanding AlexNet https://learnopencv.com/understanding-alexnet/
- AlexNet: 大規模な画像認識CNNの元祖 https://cvml-expertguide.net/terms/dl/cnn-backbone/alexnet/