pointwise convolution(1x1の畳み込み)で何をやっているか、概念を簡単に理解する

概要

googlenetやmobilenet等、最近のCNNモデルでは、当たり前の様にpointwise convolution(1x1の畳み込み)を使って次元数を調整する・・・等の説明がなされるけれど、1x1で畳み込んでも結局意味ないじゃん?と最初理解に苦しんだので、自分なりにまとめておく。
「1x1の畳み込み」という言葉だけ聞くと、何の意味もないフィルタの様に思えてしまうけれど、実際は1x1xLbeforeという、各層にまたがる細ながーいフィルタを適応している。以下の図の様な細長いフォルタを使って、入力層から重要そうな部分を選別して取り出し、一つの層にまとめている。この処理を出力層分(HxWxLafter回)繰り返すことによって、層数を簡単に任意の値にできるという点が最大のメリット。

以下に、パラメータ、入出力サイズ、メリットについても自分なりの理解をまとめる。
#自分なりの理解なので、間違っている部分があれば是非ご指摘ください。

[pointwise convolution(1x1の畳み込み)の概念図]
f:id:t_nkb:20171224195604j:plain:w300
1x1の畳み込みを出力一層で適応した場合はこうなる。これが基本の適応系。

f:id:t_nkb:20171224180629j:plain:w300
上記畳み込みフィルタを必要な出力層(Lafter)分だけ適応して、重ねることで任意の総数の出力を得ることができる。
この図では、層数を増やす形で畳み込みフィルタを適応している。
(レシートの裏にメモしたものをスキャンしたので汚い笑)

pointwise convolutionのパラメータ数、計算量

・出力層一層に対するパラメータ数は1x1xLbefore
・よって、Lafter層の出力を得るために必要なパラメータは1x1xLbeforexLafterとなる
・畳み込みに必要な計算量はHxWxLbeforexLafter3x3の畳み込み等に比べると計算量は1/9だが、一般的なフレームワークでは関数呼び出しにかかる時間が加味されるため、ここまで高速にはならない模様

pointwise convolutionの出力

・H,Wのサイズは畳み込み前、後で基本的に同じ(stride=1の場合に限るが、通常はstride=1で適応することが多い)
・出力の総数はパラメータ数を変えることで、任意のサイズを指定することができる(ここが重要!!!)

pointwise convolutionのメリット

最大のメリットは層数を簡単に任意の値に変更できる点。他にも副次的に色々とメリットがある。

・1x1の畳み込みはCPUでも高速で動作する(CPUとGPUの速度差が比較的小さい)
・畳み込みのフィルタサイズを1x1にするだけで実装できるため他の次元削減・拡張手法に比べて圧倒的に実装が楽
・出力の層数を簡単に増減できる
・出力にrelu等を与えることによって、非線形性を増すことができる