最近の流行りに乗って、DeepLearningをかじってますが、知人(同様に初心者)から、CNNはなんでうまく行くのか分からないと言われて、自分なりの解釈を説明したところ、1分で概要が分かったと言われたので、気をよくしてQiitaにも投稿してみることにしました(個人的な解釈ですので、間違っていたらお手柔らかにご指摘ください)。
まず、Filter, 特徴量とは何か
まず、この記事のとおり、DeepLearningが有名になる前から、画像認識は研究されており、そこでは、Filterというものを使って特徴量を認識していました。
- 例えば、リンク先の通り、微分もFilterで表せます.-1, 0, 1というFilterを使えば、
1 \times y(x+1) + (-1) \times y(x-1)
ってなりますので。
- Filterを使って変換した結果は特徴量と呼ばれています。
- DeepLearning以前の画像認識では、どのようなFilter使って特徴量を出せばうまく画像が認識できるかが色々考えられていました。
CNN層=画像にFilterをかけるということ
次に、CNN層の定義とFilterの定義を少し見ればわかるとおり、CNN層=画像にFilterをかけているっていうことになります。
- 上記のDeepLearning以前の画像認識の仕組みを真似したってことですね。
- ただし、ここでは、人間がFilterを考えるんじゃなくって、データに合わせてFilterを自動的に作るようにしたと解釈できると思います。
- ということで、CNNは、たまたま考えついたというよりは、誰かが、もともとあった画像認識の仕組みをdeep learningでやらせようと思って自然に思いついたものなんじゃないかなと思います。
Pooling層について
CNNでは、Pooling層を用いて画像のサイズをどんどん小さくして行ってると思いますが、この解釈は以下の通りです。
- これも画像処理では有名な話っぽいですが、普通に画像を間引いてサイズを小さくするとノイズが入ってしまったりしますが、Filterを適用しながら画像のサイズを小さくすると、画像の情報を減らさないで画像を縮小できます。詳細はGaussian Filterとかで検索してお調べいただければ出てくると思います。
- なので、CNNでは、畳み込みをしながら画像のサイズをどんどん小さくしていってます。
- もともとの画像のサイズに近い層は、細部を識別するのに使っていて、サイズを小さくしたほうの層は粗いパターンの識別をするのに使っているということだと思ってます。(細かいところは見れなくなるので)
最後に
既存の仕組みで、もともとは人間が試行錯誤で考えていたFilterの作成をデータに合わせて自動的に行わせるようにしたというのは、まさに人工知能っぽいな〜と思いました。以上、殴り書きで失礼しました。