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

0.章の概要

この章では、畳み込みニューラルネットワークについて解説していきます。畳み込みとはフィルターを用いて画像の特徴を抽出する処理です。画像の特徴を抽出するのと同時に、「位置ズレ」に強い処理を施すことで、認識精度が上がります。基本的な畳み込み処理から具体的な計算例まで、順を追って解説していきますので、しっかり理解しましょう。

cnn_filter

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

学習キーワード:単純型細胞と複雑型細胞、受容野(receptive field)、特徴マップ、フィルタ、カーネル、パディング、ストライド、im2col、チャネル、point-wise畳み込み(1x1畳み込み)、depth-wise畳み込み、グループ化畳み込み、アップサンプリングと逆畳み込み、Max pooling、Lp pooling、Global Average Pooling

概要
単純型細胞と複雑型細胞について

単純型細胞と複雑型細胞は、生物の視覚系に存在する神経細胞の種類であり、CNN(Convolutional Neural Network)は、この生物の視覚系を模倣して、画像認識や画像処理に特化した深層学習モデルを指します。単純型細胞は、ある特定の形状に反応する細胞であり、組み合わせることで複雑な形状を認識する事ができます。一方、複雑型細胞は、形状の空間的なずれを吸収するような働きをしています。

cnn

畳み込みニューラルネットワーク(CNN:Convolutional Neural Network)において、単純型細胞は畳み込み層に、複雑型細胞はプーリング層に該当します。畳み込み層では、単純型細胞のように受容野内の特徴を検出するためのフィルタが適用され、プーリング層では、受容野内の特徴を平均化などを用いて抽象化し、複雑型細胞のように形状の空間的なずれを吸収します。

CNNは、この生物の視覚系の原理を基にしたDeep Learningモデルで、画像認識や画像処理のタスクに適用されています。基本的な構造は、「畳み込み層」と「プーリング層」の組み合わせを複数回繰り返し、最後に全結合層を繰り返して出力します。


基本的な畳み込み演算
特徴マップ・フィルタ・カーネル

特徴マップは、畳み込みニューラルネットワークが画像から抽出した特徴の集合です。フィルタ(カーネル)は、特徴マップを生成するために使用される小さい画像で、対象画像の各ピクセルに対して畳み込み演算を行い、特徴マップを生成します。

畳み込みの数式は次のようになります。

\[ F(x, y) = \sum_{i} \sum_{j} I(x+i, y+j) * K(i, j) \]

ここで、\(F(x, y)\) はフィルタの出力、\(I(x, y)\) は画像の入力、\(K(i, j)\) はフィルタの重みです。

※フィルターサイズはハイパーパラメータであり、3×3や5×5などが多く使われています。

パディング・ストライド

パディングは、画像の周囲に追加されるゼロ値の行列で、畳み込み演算の際に画像のサイズを保持するために使用されます。ストライドは、畳み込み演算を行う際にフィルタが移動するステップの大きさを指します。

以下にパディングの参考図を示します。

padding

以下にストライドの参考図を示します。

stride

以下に畳み込み処理を行った際の出力画像サイズの式を示します。

\[ H_{out} = \frac{H_{in} + 2P - F}{S} + 1 \] \[ W_{out} = \frac{W_{in} + 2P - F}{S} + 1 \]

ここで、\(H_{out}\)と\(W_{out}\)は出力画像の高さと幅、\(H_{in}\)と\(W_{in}\)は入力画像の高さと幅、\(P\) はパディングの量、\(F\) はフィルタのサイズ、\(S\) はストライドです。

上記の式からも、パディングを用いずに畳み込み処理を行うと、画像サイズが小さくなることがわかります。

畳み込み演算の例

畳み込み演算は、フィルタと画像の要素ごとの積を計算し、その結果を足し合わせて特徴マップを生成します。

以下に、3×3の画像に対して2×2のフィルタを適用した場合の畳み込み演算の例を示します。(パディングは0、ストライドは1とする)

convolution
チャネル

チャネルは、画像の色(RGB)などを指します。実際のCNNでは4次元データを扱うことが多く、チャネルは(バッチ数、チャネル数、高さ、幅)の中の3次元目として扱われます。例えば、RGB画像では3つのチャネル(赤、緑、青)がありますが、この場合、畳込みの際のフィルターも同じ3チャンネルが必要となり、1チャネルの画像が生成されます。2つのフィルターを利用した場合は、2チャネルの画像が出てくる計算になります。

cnn_channel
効率的な畳み込み計算

畳み込み演算ではコード上で繰り返し文(For文)を多用することになり、計算コストが非常に高くなります。そこで、計算を効率的に行うためのテクニックで画像を列ベクトルに変換し、フィルタとの積を計算する手法を紹介します。

im2col:四次元配列である画像を二次元配列へと変換する関数

col2im:逆伝播時に逆変換を行う処理

ここでは用語紹介のみにしておきますが、E資格ではim2colについて問われることもありますので、詳しい手順やアルゴリズムが知りたい方は以下のサイトをご参考ください。

Qiita-im2col徹底理解
特別な畳み込み
point-wise畳み込み(1x1畳み込み)

point-wise畳み込みは、1x1のフィルタを使用してチャネルごとに畳み込みを行う技術で、縦横方向の畳込みとチャンネル方向の畳込みを分割して計算するための手法になります。

特徴として、パラメーターの次元数を減らして計算量を減らす、層の多重化ができるといった利点があります。

depth-wise畳み込み

depth-wise畳み込みは、チャネルごとに畳み込みを行う技術です。通常の畳み込みでは、全てのチャネルに対して同じフィルタを適用しますが、depth-wise畳み込みでは、各チャネルに対して異なるフィルタを使用します。これにより、各チャネルの特徴を独立して学習させます。

また、depth-wise畳み込みは、通常の畳み込みに比べて乗算回数が大幅に減少します。以下に通常の畳み込みとの乗算回数の違いを示します。

\[ \text{通常の畳み込みの乗算回数} = K^2C_{in}C_{out}HW \]
\[ \text{depth-wise畳み込みの乗算回数} = K^2C_{out}HW \]

ここでは、入力チャネル数を \(C_{in}\)、フィルタサイズを \(K \times K\)、出力チャネル数を \(C_{out}\)、入力の特徴マップのサイズを \(H \times W\) としています。

例えば、入力チャネルが3(RGB画像)、フィルタサイズが3×3、出力チャネルが64、入力画像のサイズが224×224の場合、各手法の乗算回数は次のように計算されます:

\[ \text{通常の畳み込みの乗算回数} = 3^2 \times 3 \times 64 \times 224 \times 224 \]
\[ = 9 \times 3 \times 64 \times 224 \times 224 = 27 \times 64 \times 224 \times 224 = 10,321,920 \]
\[ \text{depth-wise畳み込みの乗算回数} = 3^2 \times 64 \times 224 \times 224 \]
\[ = 9 \times 64 \times 224 \times 224 = 1,024 \times 224 \times 224 = 51,200,256 \]

このように、depth-wise畳み込みは通常の畳み込みに比べてパラメータ数が大幅に少なくなります。これにより、計算コストが削減され、モデルの効率を向上させています。

depth-wise畳み込みは、各層ごとに畳み込みをするため、層間の関係性は考慮されないことに注意が必要です。そのため、以下に説明するDepthwiseSeparable Convolutionのように、pw畳み込みとセットで使うことが多いです。

DepthwiseSeparable Convolution

DepthwiseSeparable Convolutionは、depth-wise畳み込みとpoint-wise畳み込みを組み合わせた技術です。

以下に通常の畳み込み処理との乗算回数の違いを示します。入力チャネル数を \(C_{in}\)、フィルタサイズを \(K \times K\)、出力チャネル数を \(C_{out}\)、入出力の特徴マップのサイズを \(H \times W\) とします。

\[ \text{通常の畳み込みの乗算回数} = K^2C_{in}C_{out}HW \]
\[ \text{Depthwise convolutionの乗算回数} = K^2C_{out}HW \]
\[ \text{Pointwise convolutionの乗算回数} = C_{in}C_{out}HW \]
\[ \text{DepthwiseSeparable Convolutionの乗算回数} = K^2C_{in}HW + C_{in}C_{out}HW \]
\[ \text{DepthwiseSeparable Convolutionと通常の畳み込みの乗算回数の比率} = \] \[ \frac{K^2C_{out}HW}{K^2C_{in}C_{out}HW} + \frac{C_{in}C_{out}HW}{K^2C_{in}C_{out}HW} = \frac{1}{C_{in}} + \frac{1}{K^2} \]

※上記では、出力特徴量マップは入力と同サイズであると仮定しています。

以下にDepthwiseSeparable Convolutionを用いた際の計算コストの削減のイメージを示します。計算をシンプルにするため、上記数式と違い、出力特徴量マップは入力特徴量マップよりも小さくなっておりますのでご注意ください。

depthwise_separable

DepthwiseSeparable Convolutionは通常の畳み込みに比べてパラメータ数が減少し、計算コストが削減されることがあります。

グループ化畳み込み

グループ化畳み込みは、チャネルを複数のグループに分割し、それぞれのグループに対して独立に畳み込みを行う技術です。この手法は、計算速度向上およびワイド化による表現力向上を利点としています。

グループ化畳み込みの式は次のようになります。

\[ F(x, y) = \sum_{g=1}^{G} \sum_{c=1}^{C_g} I_g(x, y) * K_g \]

ここで、\(G\)はグループの数、\(C_g\)はグループ \(g\) におけるチャネル数、\(I_g\)はグループ \(g\) の入力、\(K_g\)はグループ \(g\) のフィルタです。

アップサンプリングと逆畳み込み

逆畳み込みは入力データを拡大してから畳み込みを行う処理の事を指します。逆畳み込みの手順は以下の通りです。

  1. strideから1を引いた値分だけ、入力データのピクセル間に0を追加する。
  2. カーネルサイズから1引いた分だけ特徴マップの周囲に0を配置する。
  3. paddingで指定されたpixel数だけ周囲の0を削る。
  4. 畳み込み処理を行う。(必ずstrideは1とする)

例として、入力データ(2×2)、カーネルサイズ(2×2)、stride=2, padding=0の場合の逆畳み込みの手順を下図で示します。

deconvolution

逆畳み込みは、特に生成モデル(例:GANやオートエンコーダ)で使用されており、畳み込み層やプーリング層などで圧縮した特徴マップを拡大する目的などで用いられています。


プーリング

プーリングとは、特徴マップの各領域から最大値や平均値を選択する処理の事を指し、縦・横方向の空間を小さくする演算のことです。画質が粗くなりボケてしまいますが、画像が多少シフトしても、同じものと判断できるようになります(位置不変性)。また、畳み込み処理と異なり、学習パラメータは存在しないということも理解しましょう。

プーリングの種類はいくつかありますが、代表的なものを以下に解説します。

Max pooling

Max poolingは、特徴マップの各領域から最大値を選択する処理です。

max_pooling

※実際には、pooling処理ではカーネルサイズとストライドを一致させることが多く、その場合の出力画像のサイズは縦・横方向に半分になります。

Lpプーリング

Lpプーリングは、特徴マップの各領域からLpノルムを計算する技術です。Lpノルムは、各要素の絶対値を \(p\) 乗した値の合計の \(p\) 乗根です。

Lpプーリングの式は次のようになります。

\[ F(x, y) = \frac{1}{H^2} \left(\sum|I(x, y)|^p\right)^{1/p} \]

ここで、\(F(x, y)\) はLpプーリングの出力、\(I(x, y)\) は画像の入力、\(p\) はLpノルムの次数、\(H\) は画像の高さ(もしくは幅)です。

Lpプーリングのメリットは、\(p\) の値によって異なる特徴を抽出することができます。例えば、\(p=1\) の場合は平均プーリングに近似し、\(p=2\) の場合はL2ノルムを計算することになります。また、\(p\) が無限大の場合は、Maxプーリングに近似します。

Lpプーリングは、MaxプーリングやAverageプーリングと異なり、\(p\) の値を調整することで柔軟に特徴を抽出できることが特徴です。

Global Average Pooling

Global Average Poolingは、特徴マップ全体の平均値を計算する技術です。ネットワークの最後の全結合層の代わりに取り入れられた手法で、各チャネルの値の平均を算出してパラメータ数を削減し、全結合層に渡します。これにより計算量が減少し、パラメータの多さによる過学習問題を改善できます。

global_average_pooling

※抽出してきた各チャネルの特徴マップを1つの値にまとめるのは、違和感(特徴が失われている?)を感じますが、実際にはGlobal Average Poolingで抽出されたデータはしっかりと特徴量を保持できており、精度としては問題ありません。


関連用語の補足
  • ネオコグニトロン:1980年代に提案された、初期のCNNのモデルです。画像認識に成功し、CNNの基礎を築きました。このモデルは、単純型細胞と複雑型細胞の概念を導入し、画像の特徴を階層的に抽出することが可能としています。
  • Mean Pooling:特徴マップの各領域から平均値を選択する処理です。Max Poolingと異なり、より平滑な特徴を抽出します。

キーワードまとめ

単純型細胞と複雑型細胞、受容野(receptive field)、特徴マップ、フィルタ、カーネル、パディング、ストライド、im2col、チャネル、point-wise畳み込み(1x1畳み込み)、depth-wise畳み込み、グループ化畳み込み、アップサンプリングと逆畳み込み、Max pooling、Lp pooling、Global Average Pooling