CNNとは
CNNとはConvolutional Neural Networkの略で、日本語では畳み込みニューラルネットワークといいます。
CNNは人の脳が物体を認識するときに視覚野がどのような働きをするのかをヒントに得たモデルの総称です。
通常、CNNは画像関連のタスクで優れた性能を発揮します。
以下、畳込みの理論的な定義を説明していきたいと思います。
畳み込みニューラルネットワークと特徴階層
機械学習アルゴリズムの性能は、当然ながら、顕著な特徴量をうまく抽出できるかどうかにかかっている。
ニューラルネットワークは、生のデータから特徴量を自動的に学習できる。
このため、ニューラルネットワークは一般に特徴抽出エンジンとみなされており、最初の方の層によって低レベルの特徴量が抽出される。
多層ニューラルネットワークと(特に)ディープ畳み込みニューラルネットワークは低レベルの特徴量を層ごとに組み合わせて高レベルの特徴量を形成することで、いわゆる特徴階層を構築する。
たとえば、画像を扱っている場合の例だと、エッジやブロブといった低レベルの特徴量を最初のほうの層から抽出する。
そして、それらを組み合わせることで、高レベルの特徴量(建物、車、犬などの物体)を形成する。
一般に、CNNは複数の畳み込み層とサブサンプリング層(プーリング層)で構成される。
それに続き、最後に全結合層が1つ以上存在する。
全結合層は、基本的には多層パーセプトロンであり、各入力ユニット$i$は各出力ユニット$j$に重み$w_{ij}$で結合される。
プーリング層には、学習可能なパラメータはまったく存在しないことに注意する。たとえば、重みやバイアスユニットは存在しない。
ただし、畳込み層と全結合層には、これらが存在する。
畳み込み演算
離散畳込み、あるいは単に畳み込みは、CNNにおいて基礎的な演算であります。
したがって、この演算の仕組みを理解することは重要である。
ここでの説明の目的はライブラリの中でどんなことが行われているか理解することである。
1次元で理解する
まずここから使用する基本的な定義と表記を確認する。
2つの1次元ベクトル$\boldsymbol{x}$と$\boldsymbol{w}$の畳み込みは$y = \boldsymbol{x} * \boldsymbol{w}$で表す。この場合、$\boldsymbol{x}$は入力であり、ベクトル$\boldsymbol{w}$はフィルタである。
入力はシグナル、フィルタはカーネルとも呼ばれる。
畳み込みを数学的に定義すると以下のようになる。
$$
\boldsymbol{y}[i] = \sum_{k=-\infty}^{+\infty}\boldsymbol{x}[i-k] \boldsymbol{w}[k]
$$
角かっこ[]はベクトルの要素のインデックスを参照している。
このだけでは疑問が残る。というのも、機械学習のアプリケーションでは、常に有限の特徴ベクトルを扱うことになるからである。
そこで、範囲外のインデックスの値は0で満たされていると考える。
そうすると、出力ベクトル$\boldsymbol{y}$のサイズも無限大となり、やはり大量のゼロで満たされた状態になってしまう。
これは現実的には無意味なので、$\boldsymbol{x}$は有限数の0でのみパディングされる。
両側にパディングされる0の個数を$p$で表すとする。
ゼロパディングを考えた上で、もう一度厳密に数学的でなく、現実的な畳み込みを考えてみる。
もとの入力ベクトル$\boldsymbol{x}$とフィルタ$\boldsymbol{w}$の要素の個数がそれぞれ$n$と$m$($m \leq n$)であるとする。
したがって、パディングされたベクトルを$\boldsymbol{x}^p$で表すとそのサイズは$n + 2p$になる。
よって離散畳み込みを計算するための実際の式は、次のように変化する。
$$
\boldsymbol{y}[i] = \sum_{k=0}^{m-1}\boldsymbol{x}^p[i+m-k] \boldsymbol{w}[k]
$$
これで無限大のインデックスの問題は解消された。
パディングのモード
実際に使用されるパディングには、主なモードとしてfull, same, validの3つがある。
- fullモード
パディングパラメータ$p$は$p=m-1$に設定される。出力の次元数が増えるため、CNNアーキテクチャではめったに使用されない
- sameモード
通常は出力ベクトルのサイズを入力ベクトル$\boldsymbol{x}$と同じにしたい場合に使用される。この場合、パディングパラメータ$p$はフィルタのサイズに基づいて計算される。
- validモード
$p = 0$のとき。
最もよく使用されるのはsameモードである。
サブサンプリング(プーリング演算)
サブサンプリングは、一般に、CNNの2種類のプーリング演算を通じて適用される。
これらのプーリング演算は、最大値プーリングと平均値プーリングである。
通常プーリング層は$\boldsymbol{P}_{n1 \times n2}$で表され得る。
この下付き文字は最大値演算または平均値演算が実行される近傍のサイズ(各次元の隣接ピクセルの個数)を決定する。
ここでは、そうした近傍をプーリングサイズと呼ぶことにする。
プーリングには下記2つの利点がある。
- プーリング(最大値プーリング)は、一種の局所不変性をもたらす。つまり近傍が局所的に少し変化したとしても、最大値プーリングの結果は変化しない。このため、プーリングは入力データのノイズに対してより頑健な特徴量を生成するのに役立つ。
- プーリングにより特徴量のサイズは小さくなる。結果として、計算効率が向上。さらに、特徴量の個数をへらすと、過学習の抑制につながることもある。
CNNの構築
従来のニューラルネットにおいて最も重要な演算は、行列とベクトルの乗算だった。
CNNでは事前活性化(総入力)の式 $\boldsymbol{a} = W\boldsymbol{x} + \boldsymbol{b}$ が、畳込み演算 $A = W * X + b$ に置き換えられる。
畳み込み層とプーリング層を組み合わせることにより、CNNを構築していくことができます。
以下の記事でCIFAR-10を用いたCNNの実装を紹介しているので、参考にしてみてください!