畳み込みニューラルネットワーク

**畳み込みニューラルネットワーク**（たたみこみニューラルネットワーク、、略称: **CNN**または**ConvNet**）は、畳み込みを使用しているニューラルネットワークの総称である。画像認識や動画認識、音声言語翻訳、レコメンダシステム、自然言語処理、コンピュータ将棋、コンピュータ囲碁などに使用されている。

## 数式表記
畳み込みニューラルネットワークの定義は厳密に決まっているわけではないが、画像認識の（縦, 横, 色）の2次元画像の多クラス分類の場合、以下の擬似コードで書かれるのが基本形である。ここから色々なバリエーションが作られている。損失関数は交差エントロピーを使用し、パラメータは確率的勾配降下法で学習するのが基本形である。これらの偏微分は自動微分を参照。
 以下の繰り返し
     畳み込み層と活性化関数
     最大値プーリング
 ベクトルに平坦化（flatten）
 以下の繰り返し
     全結合層と活性化関数
 ソフトマックス関数

### 畳み込み層
基本形は、入力 \mathbf{X}(H_\text{in}, W_\text{in}, C_\text{in}) とカーネル \mathbf{K}(H_\text{kernel}, W_\text{kernel}, C_\text{in}, C_\text{out}) とバイアス \mathbf{B}(C_\text{out}) から出力 \mathbf{Y}(H_\text{out}, W_\text{out}, C_\text{out}) を下記で計算する。カーネルとバイアスが学習対象である。
: \mathbf{Y}(i,j,n) = \left( \sum_k \sum_l \sum_m \mathbf{K}(k,l,m,n) \mathbf{X}(i+k,j+l,m) \right) + \mathbf{B}(n)

より一般的な畳み込みは以下のように PyTorch では実装している。C_{\mathrm{in}_m}はm番目の入力チャンネルを、C_{\mathrm{out}_n}はn番目の出力チャンネルを、\starは相互相関関数を意味する。

: \mathrm{output}(C_{\mathrm{out}_n}) = \left( \sum_{C_{\mathrm{in}_m}} \mathrm{kernel}(C_{\mathrm{in}_m}, C_{\mathrm{out}_n}) \star \mathrm{input}(C_{\mathrm{in}_m}) \right) + \mathrm{bias}(C_{\mathrm{out}_n})

すなわち各出力チャンネルごとに入力チャンネル C_{\mathrm{in}} 枚分のカーネル \mathrm{kernel}(C_{\mathrm{in}_m}, C_{\mathrm{out}_n}) が用意され、入力の各チャンネルのカーネルを用いた畳み込みの総和へバイアス項 \mathrm{bias}(C_{\mathrm{out}_n}) が加算され、出力の各チャンネルとなっている。

畳み込み自体にその様な制限があるわけではないが、PyTorch 2.3 現在は、式からわかるように、入力チャンネル間は畳み込み処理ではなく和で計算され、また入力チャンネル \mathrm{input}(C_{\mathrm{in}_m}) に畳み込まれるカーネル \mathrm{kernel}(C_{\mathrm{in}_m}, C_{\mathrm{out}_n}) は出力チャンネルごとに異なるという実装になっている。引数 groups を指定するとここら辺の挙動も変わる。

カーネルはしばしばフィルタと呼ばれる。これは位置関係をもつ重みづけ和のスライド演算（畳み込み）がフィルタ適用と等価なことに由来する。

畳み込み処理自体は単純な線形変換である。出力のある1点を見ると局所以外の重みが全て0の全結合と等価であることからこれはわかる。多くのCNNでは畳み込み処理に引き続いてシグモイド関数やReLUなどの活性化関数による非線形変換をおこなう。

### 活性化関数
活性化関数がReLUの場合、入力 \mathbf{X}(H, W, C) から出力 \mathbf{Y}(H, W, C) を下記で計算する。学習するパラメータは無い。
: \mathbf{Y}(i,j,k) = \max \{ 0, \mathbf{X}(i,j,k) \} 

### 最大値プーリング
カーネルの大きさが (p,q) の場合、入力 \mathbf{X}(H_\text{in}, W_\text{in}, C) から出力 \mathbf{Y}(H_\text{out}, W_\text{out}, C) を下記で計算する。学習するパラメータは無い。
: \mathbf{Y}(i,j,m) = \max_{0 \le k 

### 全結合層
ベクトルの全結合層は 入力 \mathbf{X}(C_\text{in}) と重み \mathbf{W}(C_\text{in}, C_\text{out}) とバイアス \mathbf{B}(C_\text{out}) から出力 \mathbf{Y}(C_\text{out}) を下記で計算する。重みとバイアスが学習対象である。
: \mathbf{Y}(j) = \left( \sum_i \mathbf{W}(i,j) \mathbf{X}(i) \right) + \mathbf{B}(j)

## 事前知識
畳み込みニューラルネットワークはいくつかの事前知識がモデルに組み込まれている。これらは、1979年のネオコグニトロンの時に既に導入されている。

### シフト不変性
畳み込みニューラルネットワークは、その重み（行列の）共有構造と並進不変特性に基づいて、**シフト不変**（shift invariant）あるいは**位置不変**（space invariant）**人工ニューラルネットワーク**（**SIANN**）とも呼ばれている。

シフト不変性は1979年のネオコグニトロンの時からそれを目的に畳み込みが導入されているが、実際には厳密に成立しているわけではなく、Aharon Azulay 等の2018年の調査では1ピクセルずらしただけで最大30%精度が悪化することがあることが指摘されていて、厳密にシフト不変性が成立する手法も研究されている。

### 局所的特徴
近くにあるピクセルは関係し合っているという事前知識を使用している。例えば、2次元画像の畳み込みニューラルネットワークにおいて、3x3ピクセルの畳み込みを使用するということは、その3x3ピクセルが関係し合っているという事前知識を使用している。

### 構造性
低次特徴を組み合わせて高次特徴を構成しているが、これは、部分が集まって全体が作られているという事前知識を使用している。

## 畳み込み層のバリエーション
畳み込みニューラルネットワークの核となる手法は畳み込み処理（convolution）であり、それには様々な変種がある。以下はその一例である。

### 点単位畳み込み
2次元画像の場合は、下記を点単位畳み込みと呼ぶ。
: \mathbf{Y}(i,j,n) = \left( \sum_m \mathbf{K}(m,n) \mathbf{X}(i,j,m) \right) + \mathbf{B}(n)

\mathrm{kernel}(C_{\mathrm{in}_m}, C_{\mathrm{out}_n}) がスカラーの畳み込みは**点単位畳み込み**（pointwise convolution）や**1x1畳み込み**（1x1 convolution）と呼称される。例えば2DConvにおける1x1カーネルがある。出力チャネル C_{\mathrm{out}_n} に着目するとこの畳み込みは入力チャネルの加重平均とみなせる。あるいは各点（pointwise）での入力チャネルを跨いだ全結合とみなせる。処理全体では出力チャネルごとに異なる加重を用いて入力チャネル平均を取ることと同義である。利用目的には位置情報を保った（pointwiseな）変換、出力次元数 C_{\mathrm{out}} 調整などが挙げられる。実装上は最小カーネルによる畳み込みで表現される（例: 2DConvにおける 1 \times 1 \times C_{\mathrm{in}} \times C_{\mathrm{out}} カーネル）。全結合層（Linear）を用いても容易に表現できる。

### 深さ単位畳み込み
2次元画像の場合は、下記を深さ単位畳み込みと呼ぶ。C_{\mathrm{in}} = C_{\mathrm{out}} である。
: \mathbf{Y}(i,j,n) = \left( \sum_k \sum_l \mathbf{K}(k,l,n) \mathbf{X}(i+k,j+l,n) \right) + \mathbf{B}(n)

グループ化畳み込みのグループ数をチャネル数と一致させる、すなわちチャネル間の和をなくしたものは**深さ単位畳み込み**（depthwise convolution）と呼称される。

### グループ化畳み込み
畳み込みの変種として**グループ化畳み込み**（grouped convolution）がある。通常の畳み込みでは全入力チャネルの畳み込み和を計算するが、グループ化畳み込みでは入出力チャネルをいくつかのグループに分割しグループ内で通常の畳み込みと和をおこなう。これによりカーネル枚数・計算量の削減、複数GPUを用いた学習、別技術と組み合わせた性能の向上などが可能になる（c.f. AlexNet, ResNeXt)。

### 深さ単位分離可能畳み込み
2次元画像の場合は、下記の深さ単位畳み込みして点単位畳み込みしたものを深さ単位分離可能畳み込みと呼ぶ。
: \mathbf{Y}(i,j,m) = \sum_k \sum_l \mathbf{K}_1(k,l,m) \mathbf{X}(i+k,j+l,m)
: \mathbf{Z}(i,j,n) = \left( \sum_m \mathbf{K}_2(m,n) \mathbf{Y}(i,j,m) \right) + \mathbf{B}(n)

**深さ単位分離可能畳み込み**（depthwise separable convolution）は空間方向の畳み込み層とチャネル方向の全結合層に分離した畳み込みモジュールである。すなわち通常の畳み込みを 深さ単位畳み込み + 点単位畳み込み で置き換えるモジュールである。計算量・パラメータ量を1/10スケールで削減できる利点がある。

### 転置畳み込み
2次元画像の場合は、ストライドを (p, q) とした時、下記の擬似コードで書かれるものを**転置畳み込み**（transposed convolution）と呼ぶ。p = q = 2 の時、最大値プーリングは約半分の大きさになるが、転置畳み込みは約2倍の大きさになる。
 **for** i, j, k, l, m, n **in** それぞれの値域
     \mathbf{Y}(pi+k,qj+l,n) += \mathbf{K}(k,l,m,n) \mathbf{X}(i,j,m)
逆畳み込み（decovolution）やfractionally-strided convolutionとも呼ばれるが、逆畳み込みは別の意味で使われている言葉なので誤用である。

## プーリング層のバリエーション
現代では、最大値プーリングが基本形であるが、これも色々なバリエーションがある。

### 平均プーリング
2次元画像の場合は、カーネルの大きさが (p,q) の場合、下記を**平均プーリング**（average pooling）と呼ぶ。
: \mathbf{Y}(i,j,n) = \frac{1}{pq} \sum_{k=0}^{p-1} \sum_{l=0}^{q-1} \mathbf{X}(pi+k,qj+l,n)

ネオコグニトロンやLeNetでは平均プーリングを採用していた。

### グローバル平均プーリング
2次元画像の場合は、カーネルの大きさが (p,q) = (H_{\text{in}}, W_{\text{in}}) の平均プーリングを**グローバル平均プーリング**（global average pooling）と呼ぶ。ベクトルに平坦化（flatten）して全結合層を適用する代わりに使用できる。
: \mathbf{Y}(n) = \frac{1}{H_{\text{in}} W_{\text{in}}} \sum_i \sum_j \mathbf{X}(i,j,n)

### 空間ピラミッドプーリング
カーネルの大きさが (1,1), (2,2), (4,4) のように、異なる大きさのプーリングを使用する手法を**空間ピラミッドプーリング**（spatial pyramid pooling）と呼ぶ。画像認識対象の物体の大きさが異なる場合に、事前知識としてスケール不変性を導入するために使用する。

## 畳み込みニューラルネットワークのバリエーション
畳み込みニューラルネットワークは畳み込み処理を用いたニューラルネットワークの総称である。畳み込みの種類、カーネルのサイズと層の関係、特殊なモジュールの有無などにより様々なサブタイプ（変種）が存在する。

### Recurrent CNN
単純なCNNは順伝播型 (FFN)、すなわち浅い層から深い層へのみ結合をもつ。ただしCNNは2層間の結合様式を規定するクラスでありFFNと限らない。非FFN型CNNの一例として大局的に回帰結合をもち層間では畳み込みをおこなうRecurrent CNNが提唱されている。

Recurrent CNN（**RCNN**）は回帰結合を持つ畳み込みニューラルネットワークである。すなわちフィードフォワード型 (FFN) ではなく回帰型 (RNN) のネットワーク構造を持ち、層間の結合に全結合 (MLP) ではなく畳み込みを採用したニューラルネットワークである。ゆえにCNNでありRNNでもある。

### U-Net

U-Net はセマンティック・セグメンテーション用の畳み込みニューラルネットワーク。

## 受容野
**受容野**（）は出力中の一点と結合している入力の広さ・幅である。すなわち出力中の一点へと情報を伝達しうる入力域である。視覚等の感覚神経における「受容野」から転用して名付けられた。

例えば1次元の入出力をもつ1層のCNNがあったとする。CNNのカーネルサイズが 3 だった場合、出力 o_2 は入力 i_1, i_2, i_3 の重みづけ和で計算されるため受容野は 3 になる。このCNNを2層重ねた場合、o_3 は中間層 m_2, m_3, m_4 の和でありさらに m_2 は i_1, i_2, i_3、m_4 は i_3, i_4, i_5 の和となるため、CNNの受容野は 5 になる。

Convパラメータ・変種およびネットワーク変種によって受容野サイズへ異なる影響を与える。以下はその一例である。

* Kernelパラメータ: 受容野の端をカーネルで置き換える形で広げる
* Strided Convolution: 受容野の端以外の部分をstride倍率に合わせて倍増させる
* Dilated Convolution: 歯抜けカーネルであるため、より大きいカーネルとして振る舞う（例: k3d2はk5と同じ受容野）

受容野のサイズは再帰的に求めることができる。

N 層の畳み込みからのなるCNNを考える。ここでは第 l 層 L_{l} を畳み込み C_{l+1} で変換して次の層 L_{l+1} を得る（例: 入力層 L_{0} に C_{1} を作用させて中間層 L_{1} を得る）。ここで C_{l} はカーネルサイズ k_{l} 、ストライド s_{l} をもつとする。出力層 L_{N} から見た L_{l} における受容野を RF_{l} としたとき、次の式が成立する（図参照）。

RF_{l-1} = \left ( RF_{l} - 1 \right ) s_{l} + k_{l}

よって RF_{N} = 1 を初期条件としてこの式を入力層受容野 RF_{0} まで再帰することで受容野を計算できる。 

## 歴史
画像処理のフィルタとして畳み込みを使用するという手法はコンピューターでの画像処理が登場した初期の段階から使われている手法である。エッジ検出やガウシアンぼかしなど多数ある。

畳み込みニューラルネットワークは動物の視覚野から発想を得て福島邦彦によって提唱されたネオコグニトロンに起源を持つ。ネオコグニトロンはニューラルネットワークで畳み込みを使用した。

有名なモデルとして以下のものがある。
* 1979年 - ネオコグニトロン
* 1989年 - LeNet
* 2012年 - AlexNet。トロント大学のチーム名 SuperVision が ImageNet Large Scale Visual Recognition Challenge 2012 (ILSVRC 2012) で優勝。ディープラーニングのブームが始まる。
* 2014年 - VGG。オックスフォード大学のチーム名 VGG が ILSVRC 2014 で優勝。
* 2015年 - ResNet。マイクロソフトのチーム名 MSRA が ILSVRC 2015 で優勝。

2012年からのディープラーニングブームより前の画像認識は画像（ピクセルデータ）を注意深く設計されたデータ前処理により特徴量（1999年のSIFTや2006年のSURFなど）へ変換し、それを用いた学習が主流だった。例えば AlexNet が優勝した ILSVRC 2012 の2位のモデルの ISI は SIFT などを使用している。畳み込みニューラルネットワークはピクセルを直接入力に用いることができ、特徴量設計において専門家の知識に依存しない特徴をもつとされた。現在では畳み込みニューラルネットワーク以外のニューラルネットワーク（例: Vision Transformer; *ViT*、MLPベースの *gMLP*）でもピクセル入力の画像処理が実現されている。ゆえに畳み込みそのものが特徴量設計を不要にするキー技術であるとは言えないことがわかっている。

## 脚注
### 注釈

### 出典

## 参考文献
* 

## 関連項目
* ニューラルネットワーク
* ディープラーニング
* 畳み込み
* ネオコグニトロン
* LeNet
* AlexNet
* ヤン・ルカン