ここ数ヶ月いろいろ資料を読んでいるのだが、どうにも腑に落ちない、というか、しっくりこないのが「Network in Network(NIN)」。
正直、何をしているのかよくわからない。
説明が分かりづらい。
ということで、理解できたところまでもまとめてみました。
勘違いしているところがあれば、指摘していただけるとありがたいです。
良くわからないこと
その内、この部分がNIN(の一要素と思われる)。
ここでの処理(畳み込み)が「Multilayer Perceptron Convolution(Mlpconv)」と呼ばれるらしい。
ちなみに最後の方は「Global Average Pooling(GAP)」で、こちらにまとめを書いてみたので、興味があれば参照してみてください。
で、このMlpconvで何をしているのかが分からない。
これは何なのか?→①
この辺りを解決していきたいと思います。
ヒントとなる資料
解決のヒントとなる図がこちら。
1x1の畳み込みフィルター「Cascaded Cross Channel Parametric Pooling(CCCP)」がポイントになりそうです。
解決編
では疑問点を解決していきましょう。
①最初の畳み込みフィルター
これは何なのかということですが、左側の入力データから一部を抜き出したわけではなく、どうやら畳み込みフィルターを表しているようです。
サイズも11x11だったり7x7だったり、ストライドも2だったり1だったり、パディングもしたりしなかったりと様々のようです。
②実は厚みのある面
で、通常は畳み込みを行った出力結果を厚みのある面で表現するのですが、なぜかNINの図では1次元の配列で表すようです。(このせいで分かりづらくなっている)
ストライドや出力チャンネル数の指定によって異なりますが、NINではだいたい、サイズが小さくなり厚み(チャンネル数)も増えているようです。
③1x1の畳み込み
この全結合に見えるものは、実は1x1の畳み込みを行っているようです。
1x1ですのでサイズは変わらないのですが、出力チャンネル数は減らすこともあるようです。
(この「チャンネル数が減った」ということが表せていないのは問題)
この処理がCCCPなのですが、ようはチャンネル間の同じ位置の画素をPoolingしているということのようです。
④厚みのある面
実はここで何か処理をしているわけではなく、1次元配列のように表現していたものを、ちゃんと厚みのある面に表現しなおしただけ(!)でした。
よ~く見ると、微妙にサイズが小さくなっています。(気づかないって ^^;)
でも厚みは変わっていないという...
結論
NINは、普通の1回の畳み込みの代わりに以下の処理を行い、それを繰り返すということのようです。
1)通常の畳み込み(サイズ小、チャンネル増)
2)1x1の畳み込み ※複数回実施する場合もあり
これにより、たとえばVGGnetのような、
1)畳み込み
2)畳み込み
3)Max Pooling
の繰り返しと比べると、レイヤー数が減ることにより、処理が速くなりそうです。
(重みパラメータ数も少し減りますね)
論文(pdf)を見ると精度も悪くなさそうです。