CNNにの自分なりの簡単な説明(畳込みの基礎編)

 

   CNNについて

  はじめまして。Qiita初デビューです。記念作として、画像認識やアルファGoに使われてる畳み込みニューラルネットワークを紹介したいと思います。テレビで画像認識等の情報を見てスッゲーと思ってる人は沢山いるでしょう。そして、関連の本を調べているうちにそれらにはCNNと言う技術が使われてる事に気づきます。しかし、いざ自分でCNNの知識を理解しようとしても難しすぎて分からない人もいるでしょう。筆者もその内の一人です。何度も関連の本を読み返しました。何回も読んでるうちに分かるようになってきました。ですので、今回は私が(自分なりに)簡単(?)な言葉で説明しようと思います。

 初めに

まず、初めにこのブログを読む前に必要最低限な前提知識と本ブログの読み方を紹介します。
本ブログを読むにあたり、皆さんはもうニューラルネットワークの知識は習得済みだという事を過程します。まだ前提知識の無い方はhttps://web.archive.org/web/20170821131808/http://hokuts.com:80/ のブログを見る事を推奨します。私はこの方より簡単に説明できる自信がありません。よって、説明はこの方のブログにお任せします。
次に、このブログの読み方を紹介します。このブログでは、色々な図がでてきます。これらの図は数式に対する理解を一層深める為のものです。本ブログは図形で直感的に皆さんに説明する為のものです。図で直感的にイメージを掴み、数式と照らし合わせながら読むのがベストでしょう。専門書だけだと、文字メインの説明になり、よく分からないでしょう。よって、私は図でそれらのギャップを補いたいと思います。
以上が本ブログを読む際に注意すべき事だと思います。それでは、本題にはいりましょう。

 畳み込みとは(ここの説明は丸パクリ)

CNNとはConvolution Neural Networkの略で、日本語では畳み込みニューラルネットワークと言われてます。では、この畳み込みとは何なのでしょうか?説明する前に以下の図をご覧下さい。

https://deepage.net/features/numpy-convolve.html
convolve2.jpg

画像を記載されてるリンクからパクらせて頂きました。上の図を見ると、a欄に[0, 1, 2, 3, 4, 5]の配列がありますね。v欄には中の要素が[0.2, 0.8]の配列があります。それぞれ対応してる要素同士を掛けあわせ、最後に足し算してるのが分かりますね。このように、対応してるマス同士を掛け合わせ、足す事を(CNNにおける)畳み込みと言い、畳み込みされた答えを(図では0.2)畳み込み積と言います。勿論、v欄の配列は必ずしもa欄の配列の一番最初に対応される訳でもありません。右に要素をずらす事もできます。以下が例です。

https://deepage.net/features/numpy-convolve.html
convolve3.jpg
convolve-last.jpg

そして、v配列の右に進むごとの畳み込み積の変化を畳み込み関数と言うのです。

 特徴量抽出

それでは、畳み込みを利用した特徴量抽出を説明しようと思います。
まず、下の画像をご覧下さい。

convo.gif
メキシカンハットが左から右に移動してますね。青い線は輝度を表します。今回はこのように、メキシカンハットを左から移動させ畳込み積を計算します。輝度の関数を分かりやすくヒートマップで表すと下のようになります。
figure-intro.png

白と黒の色の感覚が段々大きくなっているのが分かりますね。畳込み関数は以下のようになります。

tatamikomi.png

x軸は前述のグラフでメキシカンハットが右に移動した距離です(今回の畳込みは配列のインデックスなので、整数である)。y軸は畳込み積を表します。図で見ると、大体x = 2600の位置で畳込み積は最大値になります。実際、最大値になる値の場所を抜粋すると以下のようになります。
figure0.png

赤色のメキシカンハットがその最大値になる畳込み積の場所です。水色のメキシカンハット(畳込み関数の一番最初の位置)より2600右に移動してる事が分かりますね。分かりやすくする為に、右側に紫のメキシカンハットを作りました。因みに黒い部分は、メキシカンハットと重なった部分の輝度の幅(輝度のy = 0の両端の距離)
赤色のメキシカンハットを見ると、y > 0 の幅(メキシカンハットの正の部分)が重なる輝度関数のy > 0の幅とほぼ同じ事がわかります。水色のメキシカンハットは重なる輝度関数の幅と比べて太く、紫の場合は逆に背景の輝度と比べて細くなっています。ここでお分かり頂けましたでしょうか?そう、畳込みによりメキシカンハットの幅と幅間隔の同じ輝度の部分が強調されたのです。図にすると分かりやすいでしょう。
convo_movie.gif
上がメキシカンハットの移動を表し、下のグラフがメキシカンハットの移動距離における畳み込み関数の変化を表します。
ついでに言いますと、感のいい人はこのグラフ、どこかで見た事あるでしょう。そう、このグラフはwikipediahttps://ja.wikipedia.org/wiki/%E7%95%B3%E3%81%BF%E8%BE%BC%E3%81%BF ) の畳み込みの説明に出てるグラフと同じ方法を使って生成してます。

 メキシカンハットによる畳み込みの説明(輝度の幅が広い時)

今回の輝度関数を以下のように設定します。
figure.png

ヒートマップで表すと以下のような感じです。

Graph.png

このグラフとガウシアンハットを重ねてみます。

figure-line.png

ここで畳み込みの計算を思い出して下さい。畳み込み積はそれぞれの対応する配列の数値を掛け合わせてから、足し算をした結果です。足し算は足す順序を変える事ができます。そして、畳み込みも最後は足し算をするので、メキシカンハットの畳み込み積は
全体の畳み込み積 = マイナスの部分の畳み込み積 + プラスの部分の畳み込み積
と表す事ができます。
それでは、再度上の画像を見てみましょう。メキシカンハットのマイナスの部分は輝度もマイナスである為、マイナス部分の畳み込み積はプラスになります。同じくメキシカンハットのプラスの部分に対応する輝度もプラスである為、プラス足すプラスで元々値は相乗されます。
それでは、メキシカンハットを右に移動させてみましょう。
figure-line2.png
今度は輝度が常にプラスである為(輝度のグラフの幅が広い為、丁度すっぽりメキシカンハットに被さる)、メキシカンハットのマイナス部分の畳み込み積はマイナスでプラス部分の畳み込み積は依然とプラスです。よってプラスとマイナスの足し算なので互いに相殺しあい、畳み込み積は小さくなります。要するに、輝度の幅がガウシアンハットより広い場合はピッタリの場合より小さくなります。
###メキシカンハットによる畳み込みの説明(輝度の幅が狭い時)
それでは輝度が狭い場合を考えてみましょう。

gauss.png
緑が輝度グラフで、青がメキシカンハットです。今度は逆に輝度がすっぽりメキシカンハットの中に入っています。メキシカンハットの負の部分の畳込み積はプラスになります。しかし、この場合メキシカンハットの正の部分で、輝度は正と負の値を変化してます。よって畳み込み積もプラスマイナスで元々の畳み込み積より小さくなります。
上述の通り、ここでも畳込み積は小さくなります。
よって、メキシカンハットの畳み込みは、メキシカンハットの幅に合う「線」を強調する事が分かりました。
さて、今回は輝度の高い所が線になっている事を考えました。輝度が低い所を線にする(上のヒートマップで言う白い線の事)時も基本は同じです。ただ、黒い線の畳込み積は山みたいに正の方向へ露出するのに対し、白い線の場合は谷間(マイナス方向の絶対値が増幅)する事になります。つまり、メキシカンハットの畳み込み関数は輝度が谷間になってる所も強調できるのです。

 

CNNにの自分なりの簡単な説明(畳込みの基礎編) - Qiita (自分の投稿を引用)

 最後に

以上で、メキシカンハット関数により、特定の太さの線が強調される事が分かりました。白黒写真で言うと、メキシカンハットを調整する事により、(幅が細めのメキシカンハットの場合)輪郭が強調されたり、(幅が太めのメキシカンハットの場合)眉毛の線が強調されたりします。つまり、局部の特徴が顕著になるのです。勿論、畳込みは「線」の特徴だけを強調する訳ではありません。コーナー検出機に使われる関数を用いると、「角」と言う特徴が強調されます。また、hog記述子に使われる関数を使うと「丸み」が強調されます。そして、ニューラルネットワークはそれら局部の特徴を統合して学習し、それを元に物体を検出しているのです。