はじめに
以前先人様の忠告により vim を矢印キーで利用していたせいで命を狙われた経験をしたので,失態は犯すまいと思っていたのだが,今度は仲間だと思っていた CNN に命を狙われてしまうことになったのでこれを遺言として書き記しておく.
私が背負ってしまった罪とは,CNN の畳み込み層とは画像内で行列ライクな窓を掛け算しながらただラスタスキャンっぽく動かすと画像の特徴が得られる便利屋だと思っていたというものである.5 年以上も CNN を使っておきながら,完全に特性を忘れてしまっていたのである.
あなたが今これを読んでいるということは,私と同じ罪を犯していたということであろうか.今すぐ CNN から離れて今一度 CNN の特性を学ばなければあなたは 3dConvolution によって執拗に畳み込まれて人間かどうかを判定するだけのバイナリ情報として一生を終える ことになってしまう.
CNN の畳み込み層で忘れてはいけない特徴
もちろん,CNN の畳み込み層では窓と局所領域との積を基に特徴を取り出していたのだが,私は彼らの真の姿を失念していたのである.
- 受容野
- パラメータ共有
これらの特性なしで CNN を語ることはできない.
1. 受容野について
もしも CNN のことを
CNN とは画像内で行列ライクな窓を掛け算しながらラスタスキャンっぽく動かすと特徴が得られる便利屋
だと本当に考えたとしよう.この時に必要なパラメータ数はいくつになるだろうか?一つの層を遷移する度に必要なパラメータ数を検討しよう.
\mbox{(パラメータ数)} = W × H × C × \mbox{(次層のノード数)}
ということになる.例えば $640×480$ の画像を入力したとして,次のノード 1 つあたり $307200$ のパラメータが必要になる.こんなことをしていては,使っている PC のメモリのヒートシンクが溶け出してしまい,PC のマザーボードにガウシアンフィルタが掛かってしまう.
そのため,CNN で畳み込みを行うときは各遷移先のニューロン (ノード) の受容野の大きさを制限するのである.遷移先に全ての情報を入れるわけでは決してない.
そのため,例えば $640×480$ の画像を入力したとしても,受容野の大きさを $3×3$ にしていれば,ノード1つあたりたった $9$ のパラメータで済むのである.これには肖像権周りで抗議を起こしている Lenna さんもサンプル画像の時のような笑顔を取り戻してくれるに違いない.
2. パラメータ共有について
さらに罪が深いのはパラメータ共有に関しても失念してしまっていたことである.
この役割は簡単に言えば ある目的に使われたフィルタは,場所に拠らず再利用できる可能性がある というものである.パラメータを共有しないということは,小学校で使った "お道具箱" を授業のたびに買い換えているようなものである.そんなことをしている間にあなたの使っている CPU のグリスが溶け出してマザーボードにソーベルフィルタが掛かってしまう.そのまま利用したお道具箱を次の授業でも引き続き使えばいいのである.
つまり, 同じ畳み込み層においては受容野を適用する場所それぞれに対して重みを更新するのではなく,共通のものを使えばいいということである.丸を検出するために用いられるフィルタがあったとして,それは画像内の他の位置の丸を検出するのにも有用な可能性が高いのだ.
使っているものの特性を忘れると牙を剥く
便利な PyTorch や Tensorflow といったパッケージばかりを利用していると,どうしてもその内部がどうなっているか感謝を忘れてしまうものである.
この記事を読んだ人は今回のカルマを通じて学び得た教訓を活かし,周囲の人に感謝を伝えるようにしよう.そして,あなたが畳み込まれてしまうその日までに一緒に画像データとして写真を生成しておきましょう.
感謝
2022.05.04
参考文献:Vim を矢印キーで操作してしまったせいでこの世を去った先人様の記事