CNNとは
CNN(Convolution Neural Network)
CNNとは、Convolutional Neural Networkの略で、日本語では畳み込みニューラルネットワークと言います。「畳み込み層」では、画像の特徴を抽出します。具体的には、特徴を抽出する際、画像のどこを特徴として抽出するかを学習する層です。
生物の視覚野を模した多層構造のモデルのこと。 「畳み込みニューラルネットワーク」とも呼ばれる。
ニューロンの一部の領域を絞って、中間層に畳み込み層、プーリング層、全結合層を何層も加え、各層の間に誤差逆伝播法を取り入れることで画像に対して高いパターン認識能力を実現した。一般的にディープラーニングという場合、CNN(Convolution Neural Network)を指す場合が多い。
画像データに適したニューラルネットワークである。
CNNの原型
1982年 福島邦彦 「ネオコグニトロン」
人間が持つ視覚野の神経細胞の二つの働きを模してみようというもの
・単純型細胞(S細胞):画像の濃淡パターン(特徴)を検出する。
・複雑型細胞(C細胞):物体の位置が変動しても同一の物体であるとみなす。
ネオコグニトロンではS細胞層とC細胞層を交互に複数組み合わせた多層構造をとっている。
畳み込み
畳み込み(convolution)とは、画像処理でよく利用される手法で、カーネル(またはフィルター)と呼ばれる格子状の数値データと、カーネルと同サイズの部分画像(ウィンドウと呼ぶ)の数値データについて、要素ごとの積の和を計算することで、1つの数値に変換する処理のことである。この変換処理を、ウィンドウを少しずつずらして処理を行うことで、小さい格子状の数値データ(すなわちテンソル)に変換する。
畳み込み層
一般的なニューラルネットワークでは層状にニューロンを配置し、前後の層に含まれるニューロン同士は網羅的に結線するのが普通ですが、この畳み込みニューラルネットワークではこのニューロン同士の結合をうまく制限し、なおかつウェイト共有という手法を使うことで、画像の畳み込みに相当するような処理をニューラルネットワークの枠組みの中で表現することに成功しています。この層は「畳み込み層」と呼ばれ、この畳み込みニューラルネットワークでは特に重要な意味を持っています。
プーリング
畳み込みに似た処理で、プーリング(pooling)という処理がある。プーリングとは、ウィンドウの数値データから1つの数値を作り出す処理だ。例えばウィンドウ中の最大値を選択する最大値プーリングや、ウィンドウ中の平均値を選択する平均値プーリングなどがある。最もよく使われるのは最大値プーリングだ。
プーリング層
畳み込みニューラルネットワークにおいて、もうひとつ大きな存在感を発揮しているのが、「プーリング層」と呼ばれる層の存在です。畳み込みニューラルネットワークにおいて、「畳み込み層」が画像からのエッジ抽出等の特徴抽出の役割を果たしているとすると、「プーリング層」はそうした抽出された特徴が、平行移動などでも影響を受けないようにロバスト性を与える役割を果たします。畳み込みニューラルネットワークは、特に画像のカテゴリ分類(一般物体認識)で優れた性能を発揮するネットワークとして知られていますが、例えば写真に写った動物が犬か猫かをカテゴリ分類したい場合、犬と猫が正しく識別できることが重要であり、犬が左端に映っているか、右端に映っているかはあまり重要ではありません。つまり、そうした画像のカテゴリ分類というタスクにはあまり重要でない位置に関する情報を巧妙に削ぎ落としてやっているのが、この「プーリング層」と呼ばれる層の役割になります。
AlexNet
AlexNet は、ImageNet データベースの 100 万枚を超えるイメージで学習済みの畳み込みニューラル ネットワークです。このネットワークは、深さが 8 層であり、イメージを 1000 個のオブジェクト カテゴリ (キーボード、マウス、鉛筆、多くの動物など) に分類できます。結果として、このネットワークは広範囲のイメージに対する豊富な特徴表現を学習しています。
VGG
2014年,画像認識のコンペティション(ILSVRC)のクラス分類の部門で特に高評価を得たネットワークです。
GoogLeNet
GoogLeNet は、深さが 22 層の事前学習済みの畳み込みニューラル ネットワークです。
ResNet
ResNetは、Microsoft Research(現Facebook AI Research)のKaiming He氏が2015年に考案したニューラルネットワークのモデルである。
Residual Network(ResNet)の理解とチューニングのベストプラクティス
転移学習
転移学習(Transfer Learning)とは、ある領域で学習したこと(学習済みモデル)を別の領域に役立たせ、効率的に学習させる方法です。