CNN(畳み込みニューラルネットワーク)の仕組みを「図解」と「数式」で理解する

スキルアップ

はじめに

これまでの説明で、基本的なディープラーニングについて学んできました。

しかし、このディープラーニングには問題点があります。
そのため、人工ニューロン数が増加すると(特に重みに対する)パラメータの個数が膨大となることです。

このモデルでは、隣り合う層同士で全ての人工ニューロンが情報の受け渡しを行っていました。
つまり、重みパラメータは、隣り合う層同士を掛け合わせた個数が必要になります。

例えば、デジカメの画像(1000万画素)を判定する場合、一般的に隠れ層の人工ニューロンは1000個ほど必要となると言われています。
これでディープラーニングのモデルを作ると、入力層(1000万個)⇔隠れ層(1000個)の間にある重みパラメータはだけで100億個になってしまいます!!

これに出力層は絶対に必要なり、隠れ層も数層ほど追加したら、パラメータの数が爆発的に増加します・・・

今回は、この問題を解消するために考え出さたCNN(畳み込みニューラルネットワーク)というモデルについて紹介します。

ここからは、人工ニューロンをユニットと呼び替えて説明します。

CNNの概要

ディープラーニングでは、隣り合う層同士で全てのユニットを結合していました。
その結果、莫大な数のユニット同士が結び付き、同時に重みパラメータも莫大な数となりました。

今回紹介するCNN(畳み込みニューラルネットワーク)では隠れ層のユニットの配置を工夫してパラメータの数を削減させました。

これを実現するために、新たにフィルタ畳み込み層プーリング層という考え方を導入します。

CNNの図解

今回は、画像データ(9×9 画素)を判定するモデルを例に説明を進めます。

まず、画像データを領域ごとに分割し、次層(畳み込み層)のユニットへ受け渡すことにします。

畳み込み層(Convolution Layer)

入力層から畳み込み層への受け渡しについて、詳細を見ていきます。

畳み込み層(Convolution Layer)は、入力層の各分割領域に含まれる入力値重みの集合(フィルタ)バイアスで計算して作成します。

畳み込み層で作成された出力値の集合は特徴マップ(Feature Map)と呼ばれています。
※1つの特徴マップの各ユニットを計算するには、フィルタとバイアスは同じパラメータを使用しています。

今回の例では、入力層から畳み込み層(特徴マップ)を3つ作成することにします。
この場合のイメージは以下の通りです。

プーリング層(Pooling Layer)

畳み込み層に作成されたデータは、縮約(圧縮)されてプーリング層に受け渡されます。

プーリング層(Pooling Layer)は、畳み込み層の特徴マップを領域ごとに区切り、領域内の要素を指定したルールで縮約(プーリング)して作成します。

この縮約ルールを「プーリング手法」と呼び、代用的なものに次の3つがあります。

  • 最大プーリング :対象領域の最大値を採用する
  • 平均プーリング :対象領域の平均値を採用する
  •  L2プーリング  :対象領域の二乗平均値を採用する。

今回の例で、畳み込み層からプーリング層を作成するイメージは以下の通りです。

出力層(Output Layer)

プーリング層から出力層へのデータの受け渡しは基本的なディープラーニングと同じで全結合となります。

そのため、出力層は、プーリング層の全要素の重み付き入力を受け取って計算します。

CNNの全体像

CNNの数式化

これまでの説明をイメージした上で、CNNで利用する記号を定義し、数式で表します。

「コスト関数の定義」と「勾配降下法の適用」

最後に

ディープラーニングに比べるとアッサリな感じで説明してしまいましたが、押さえるべきポイントはお伝えできたと思っています。

ディープラーニングの説明の繰り返しになりますが、CNNをプログラムで作成する場合は優秀なパッケージを使用します。
そのため、私たちは「フィルタの大きさ」や「畳み込み層の数」などを指定してしまえば、パッケージがいい感じに処理してくれます

しかし、もしフィルタや畳み込み層の意味が分かっていないと「どのように指定すれば良いか分からない」と思います。

今回の説明で、CNNの概要を掴み、パッケージを使いこなす下地を作る手伝いができたなら幸いです。

コメント

タイトルとURLをコピーしました