"BOKU"のITな日常

BOKUが勉強したり、考えたことを頭の整理を兼ねてまとめてます。

ニューラルネットワークの学習を部品(レイヤー)別にざっくり整理/CNNのPooling(プーリング)層

f:id:arakan_no_boku:20190330090249j:plain

目次

CNN(Convolutional Neural Network)の前説

ニューラルネットワークの学習を部品(レイヤー)別にざっくり整理をタイトルにした記事は、専門用語を極力使わず、多少の不正確さは目をつぶっても、なんとなくイメージできることを目標にして整理しています。

まず、ニューラルネットワークで学習する流れをざっくり図にしてみました。

f:id:arakan_no_boku:20170825221728j:plain

ニューラルネットワークの目的のひとつとして「既存の正解がわかっているデータで勉強(学習)して、未知のデータから、正解が導けるようになること」があります。

ポイントはどうやって「勉強(学習)」するか?ですが、ニューラルネットワークでは、それを「計算」でやってます。

どういうことかというと。

既存の正解のわかっている入力データにたいして、パラメータ(重み)をかけあわせる計算を行い、その結果をもとに答えを出して、答え合わせを行い、間違ってたら、正解に近づけるようにパラメータ(重み)を少し修正するみたいなことを延々と繰り返して、もっとも。正解に近い結果を計算で求められる確率の高いパラメータ(重み)の値を決めていく・・のを学習と呼んでいるわけです。

上記の図は、それをごく簡易的に書いてます。

上記の図では「計算して結果を整えて、それを次の入力にする」部分を1回しか書いてませんが、実際は、そこが何層にもわかって繰り返されることで、学習の精度をあげようというのが、ニューラルネットワークであり、ディープラーニングなどと言われるゆえんということです。

今回とりあげるCNN(Convolutional Neural Network)というのは、上図では「① 計算(計算×重み+α)」にあたります。

同じ部分にあたる部品(レイヤー)としては、「全結合層(Affine)」がありますが、画像データの分類に関して、より優れた方法として考え出されたのが、CNN(Convolutional Neural Network)です。

CNN(Convolutional Neural Network)は2段階で構成されます。

  • Convolution(畳み込み)層
  • Pooling層

です。

ここからはPooling層について整理し、Convolution(畳み込み)層は別記事とします。

Pooling層

画像データの場合はその値がどの位置にあるのかという「位置関係の情報」を考慮して比較しないと精度があがらないため、それを実現するために位置情報を考慮した計算をする「Convolutionレイヤー=畳み込み層)」があります。

Pooling層の目的は、「畳み込み層の計算結果をうけて特徴をより強調する」ことです。

Pooling層には、特徴を強調する方法によっていくつかの種類があります。

いくつか例をあげると。

  • MaxPooling:強調するのに最大値を使う
  • AveragePooling:強調するのに平均値を使う
  • SumPooling:強調するのに加算値を使う

などがあります。

代表的な「MaxPooling」

ここからは、上記の種類のうち、代表的な「MaxPooling」に絞って整理します。

MaxPolingについて、リファレンスマニュアルの説明にはこう書いてあります。

MaxPooling
近傍の入力値の最大値を出力します

これの。

  • 近傍ってなんだ?
  • それを出力したら、何が良いんだ?

あたりのことを整理していきます。

MaxPoolingがやっていること

例として、以下のような簡単なデータを使います。

f:id:arakan_no_boku:20181112220545j:plain

これをConvolutionの出力と考えます。

リファレンスでの「近傍」は、Poolingの入力=Convolutionの出力のことです。

MaxPoolingのやることは、事前に決めた範囲の中の「最大の数字」だけを出力する。

ただ、それだけです。

その事前に決めた範囲のことを、フィルターとかカーネルと呼びます。 

今回のサンプルにするフィルター(カーネル)のサイズは、2×2にします。

元データよりフィルターは小さいですから、全体をカバーするために、1か所やったら、位置をずらして、また次をする・・みたいに処理していきます。

この位置をずらす大きさのことを、Strids(ストライド)といいます。

今回はこれも2×2にします。 

Poolingの処理は、左上からはじめます。

まず。

2行2列の範囲の中で、一番大きい数字を選んで出力します。

f:id:arakan_no_boku:20181112221107j:plain

つぎに、右に2列分ずらして、同様に2行2列の中で最も大きい数字だけ出力します。

f:id:arakan_no_boku:20181112221202j:plain

つぎに、下に2行分ずらして、左側から2行2列の中で最も大きい数字を出力します。

f:id:arakan_no_boku:20181112221433j:plain

あとは同様に右に2列ずらして同じことをします。

f:id:arakan_no_boku:20181112221513j:plain

これが、MaxPoolingがやっていることです。

位置を考慮して畳み込み演算した結果の、より特徴の強い部分だけを抜き出して、より学習の精度をたかめるようにした工夫=特徴を強調する。

まさに、そういうことです。

 

CNNからMaxPoolingを外すとどうなるかNNCで確かめる 

CNN(Convolutional Neural Network)の場合、基本的にConvolutionとPoolingはセットで使います。

たとえば、こんな感じです。

f:id:arakan_no_boku:20181112224225j:plain

ここから、MaxPoolingをはずして、以下みたいなモデルをくみました。

f:id:arakan_no_boku:20181112224516j:plain

 

これでMNISTを学習・評価してみると。

f:id:arakan_no_boku:20181112224826j:plain

おーー。

97.8%・・。

あまり、良くはありませんが、無茶苦茶になるわけでもありません。

こういう微妙な結果になるのは、Pooling層の役割が「特徴をより絞り込む」ことだけなので、Convolutionだけでもそれなりに特徴の抽出自体はできているからです。

でも、 Pooling層と組み合わせると、より良い結果になる可能性が高くなる。

そういう位置づけだということがわかります。

まとめ 

プーリング層が何をやっているのかは、イメージができました。

イメージができれば、使ってよい場合と使ってはいけない場合もなんとなく想像できるようになります。

例えば。

Pooling層が、細かい特徴を切り落として、強い特徴をより際立たせるためにあるものだということがイメージできていれば、画像を学習させて、分類ではなく、細部にいたるまで復元に近い状態を出力するようなものを作ろうとするときは、Pooling層を使っちゃダメだろうな・・とかを考えられるようになります。する役目なのだから・・とか。

こんなふうに。

イメージができる、できないって、重要だ・・と、個人的には思うわけです。

ではでは。

 

PS:他の部品(レイヤー)については、以下にまとめてます。

arakan-pgm-ai.hatenablog.com