VisualStudio + Pythonでディープラーニング
畳み込みニューラルネットワーク(CNN)って何?
(2020. 1. 1)
ニューラルネットワークの花形の一つというと「画像認識」です。人の顔を認識したり、動植物の種判定、CTスキャンの画像から病巣部を見つけ出す等々適用範囲無限大です。そういう画像認識で広く使われている手法の一つが「畳み込みニューラルネットワーク(Comvolutional Neural Networks:CNN)」です。でも最初字面を見た時、真っ先にこう思ったんですよ…「『畳み込み』って何?」って(^-^;。その辺りも含め、畳み込みニューラルネットワークについてあれこれ見ていく事にしましょう。
@ 「畳み込み」って何?
次のような画像があるとしましょう:
この画像を加工して新しい画像を作る時に、プログラムでは1つ1つのピクセルの値を取ってきて、何らかの変換式を通します。例えば「RGBのB成分の値を半分にする」という変換をするなら、上の画像はこんな風に見た目が変わっていきます:
このように元の画像の各ピクセルを取ってきて、それに何らかの変換を掛けて新しい画像を作る事を畳み込みと言います。なーんだ、ゲームプログラマ(シェーダプログラマ)が日常的に行っていたこういう画像加工って畳み込みそのものだったんですね。
使うピクセルは別に複数だって構いません。むしろ複数の方が畳み込みっぽいと言えるかもしれません。例えば注目しているピクセルとその周囲1マス、合計9マスの色の平均値を取ると、画像がぼやけます。いわゆる「ぼかしフィルター」というやつです:
この画像、手作業なんだぜ、ふふ…(涙)
これも立派な畳み込みです。このぼかし演算を数式で表現してみます。上のような平均は「すべてのピクセルに重みを掛けて全部足す」という事なので、こんな数式になります:
C(x,y)は座標(x,y)の色を表しています。(x',y')が注目している座標(上の星マーク)です。x,yは-1,0,1とそれぞれ値を取るので、Σの中のC(x'-x,y'-y)が上図の枠でくくった星マークの周囲の色を指す事が分かると思います。wxyは黒枠それぞれの位置に設定される重みで、単純な算術平均なら1/9で固定です。後はそれを全部足せば平均となります。
最初の色変えの例も黒枠の範囲が1ピクセルになっただけで、上の式で表現可能です(重みwがRGBそれぞれ(1,1,0.5)と別々に設定される事になる)。黒枠も別に正方形に限定される必要も無くて、円形でも飛び飛びでも構いません。要は「ある注目点の色を元の画像の情報から特定のルールの下で決定」すれば、それは全部畳み込みという事になるんです。
ちなみに、Wikipediaの畳み込みに掲載されている離散的な畳み込みの一般式はこんな感じでした:
記号は異なりますが、f(n)が重みでg(m-n)が座標m-nの色で、mが注目している星の所…って見ていくと、上の式と一緒なのがわかりますよね。
A 畳み込みの黒枠は局所的な特徴抽出フィルター
上の黒枠の処理を画像全体に適用すると畳み込み後の画像が作れる事が分かりました。この黒枠の処理の振る舞いを決めているのは黒枠内の各ピクセルに設定される重みwの値です:
上の例だと「周囲1ピクセルを含めた平均を取る」と目的が分かっているので各wを1/9と均等割り振りしていますが、この配分は別に何でも構いません。例えば次のように配分するとどうでしょうか?
真ん中の縦方向にのみ重みが分配されています。これで先の画像を畳み込んでみると:
このように縦方向に色が並んでいる所が濃く抽出されてきました。もう一つやってみましょう。今度は横方向です:
元画像で横に色が並んでいる所がより濃く抽出されてきました。このように黒枠内の重みの配列によって画像の特定の特徴が浮き彫りになる事が良く分かります。そう、この黒枠は「特徴抽出フィルター」なんです。この働きが畳み込みニューラルネットワークで劇的に効いてきます。
この黒枠を以後「特徴抽出ニューロン」と呼ぶことにしておきます。
B 特徴抽出ニューロンが複数あると意味を成してくる!
特徴抽出ニューロンは単体だと限定的な特徴しか抽出できません。でもそれが複数協調すると意味を成してくるようになります。例えば次の4つのニューロンがあったとします:
それぞれの特徴抽出ニューロンで先の画像を畳み込むとこんな画像が出来ます:
個々の特徴抽出ニューロンが畳み込んだ絵を重ね合わせてみると…:
元の絵に近い「A」が現れました。つまり、各特徴抽出ニューロンの反応が強く出ている所が上のような組み合わせになると、それは「A」である可能性が高いと言える訳です。個々の特徴の強い所が結合すると意味がわかる。これが畳み込みニューラルネットワークでの肝になります。
C 特徴抽出ニューロンを推定するのが畳み込みニューラルネットワーク
ここまでのお話は、元の絵を「こちらが用意した特徴抽出ニューロン」で畳み込むと「A」っぽく見えるかも?という物でした。これを模式図にするとこういう事です:
もちろんこれはそれっぽく見えるように特徴抽出ニューロンの重みを調整しているからです。元画像と適正な特徴ニューロンがあれば答えが出る…という事は逆に言えば、元画像とその答えとなる情報を与えれば、特徴抽出ニューロンの重みを学習できるはず。この発想が畳み込みニューラルネットワークです:
この重みの推定は1枚の「A」の画像では汎用性は生まれません。沢山で様々な形の「A」画像を用意して、都度答えを与えればそれらAに共通する特徴を捉える特徴抽出ニューロンの重みが最適化されていくという訳です。もちろんそれが上に挙げた4つの特徴抽出ニューロンの重み通りになる訳ではありません。むしろもっと良い最適化が行われます。しかもこの仕組みの素晴らしい所は、同じ特徴抽出ニューロンの組み合わせで「B」や「C」なども判定出来るようになるという点です。各ニューロンの反応の大きさや反応箇所の組み合わせパターンが文字によって異なるからです。画像から特徴を抽出してパターンの組み合わせで画像を判断する。畳み込みニューラルネットワークが何となく見えてきました(^-^)
次の章では実際に簡単な畳み込みニューラルネットワークの実験を行ってみます。