周波数領域から畳み込みの最適カーネルサイズを考える

#はじめに
研究で畳み込みニューラルネットワーク（CNN: convolutional neural networks）を使うとき，適切な構造を決定する際に検証セット上の精度を指標としたマニュアルサーチをふつうすると思います．しかし，モデルやデータの解釈のために，選ばれたハイパーパラメータの意味を理解しておく必要があるとも感じます．今回は畳み込み演算のカーネル（フィルタ）サイズの解釈に関する簡単な実験内容をまとめました．



#畳み込みの意味を考える
畳み込み演算は次式で定義されます． 
$\begin{equation}\label{eq:conv}
f*g(t)=\Sigma_{n=0}^{N-1}f(n)g(t-n)
\end{equation}$
畳み込み演算は，畳み込み定理の観点から，離散フーリエ変換（DFT）と深い関わりを持ちます．畳み込み定理とは，周期関数の畳み込みをDFTしたものは，それぞれのDFTの積になる，というものです．
$\begin{equation}
\label{eq:DFTconv}
DFT(f*g)=DFT(f)\cdot DFT(f)=F\cdot G
\end{equation}$
つまり，時間（空間）領域における畳み込みは，周波数領域における積と考えられます．$g$を入力データ，$f$を畳み込みフィルタと見立てた場合，$F\cdot G＝[f_1g_1, …, f_Ng_N]$ですから， $g$を$f$で畳み込んで得られる出力データの周波数特性は，設計された$f$に制御された$g$であるといえます．つまり畳み込みフィルタは入力データから特定周波数成分を強めた時間（空間）信号を出力します．



#（実験1）疑似的な時系列データ上での畳み込み演算
例えば，1000[Hz]でサンプルされた2[sec]長の時系列信号を入力データとして想定します．
<img src="https://www.fastpic.jp/images.php?file=9839174953.png" width=70%> 
左が時間領域における波形であるのに対し，右がそれをDFTすることで得られる周波数領域における波形，すなわち左が含む周波数成分（1, 2, 3, 10, 20, 30, 100, 200, 300[Hz]）を表しています．

入力信号の2 [Hz]の成分のみを含む時系列信号を畳み込み演算で得たいとします．ここでは適当にフィルタサイズを1000，すなわち1[sec]相当に設定してフィルタを作ります．$F\cdot G＝[f_1g_1, …, f_Ng_N]$より，2[Hz]の成分のみを含む$f_S=$1000[Hz]の1[sec]の時系列データを畳み込みます（下図）．
<img src="https://www.fastpic.jp/images.php?file=2316641543.png" width=70%>

畳み込んで得られるのが下の左図で，それをDFTして含有周波数成分を調べた結果が右です．
<img src="https://www.fastpic.jp/images.php?file=3736018146.png" width=70%>
時間領域の2[sec]中に2周期分あって，周波数領域の2[Hz]成分が立っていて，だいたいあってるとわかります．


今度はフィルタサイズを小さくしてみます．
<img src="https://www.fastpic.jp/images.php?file=5860814696.png" >
正確さに欠けてきました．畳み込む時系列（フィルタ）長が小さいほど，所望の周波数成分（この場合[2Hz]）を十分に収めるのが大変です．所望の周波数成分$f_{fc}$の時系列信号をピンポイントに抽出したい場合，フィルタサイズは大きいほど良いことが分かります．そして，$f_{fc}$が小さいほどフィルタサイズも大きい方が良いことも分かります．逆に$f_{fc}$が大きい場合はフィルタサイズは比較的小さく設定してもよく，計算の効率から考えてもその方が適切と考えられます．実際に200[Hz]を取り出してみます．
<img src="https://www.fastpic.jp/images.php?file=2481831194.png">
$f_{fc}$2, 200[Hz]時に適したフィルタサイズは当然200[Hz]の時の方が小さく，だいたい2周期分以上くらいはあった方がいい感じです．


下のコードで実験できます．
<script src="https://gist.github.com/myanagimoto/3aaac3745a0835fea969b7948d09fa18.js"></script>


#（実験2）画像データ上での畳み込み演算
<img src="https://www.fastpic.jp/images.php?file=6730701955.png" width=40%>
今度は上の画像データを使っていくつかのサイズのフィルタを畳み込んでみます．フィルタサイズを変化させて，空間領域から抽出されるエッジの強さを見ます．
<img src="https://www.fastpic.jp/images.php?file=6157047245.png">
フィルタサイズが小さいほどエッジが鋭いことが観察できます．直感的に考えても，大域的な畳み込みであるほどエッジの鋭さは失われるとわかります．エッジの鋭さの特徴は比較的高い周波数帯にあるため，ハイパスフィルタによって抽出されます． 


今度は入力画像を8ピクセルごとにダウンサンプルした画像ss（画像サイズは元の1/8）と，このダウンサンプルしたデータの1ピクセルを8x8ピクセルにタイルして元の画像サイズと等しくした画像sssを用意します．
<img src="https://www.fastpic.jp/images.php?file=4923112193.png" width=80%>
これら2枚に同様のフィルタを畳み込むと，以下のようになります．
<img src="https://www.fastpic.jp/images.php?file=3610571158.png">
画像のスケール（画像サイズや解像度）が異なれば，同じフィルタを使っても結果は異なります．


下のコードで実験できます．
<script src="https://gist.github.com/myanagimoto/a3610d686ccfa1582e6dc6559afa9c9f.js"></script>

実験1, 2両コードとも[こちら](https://github.com/myanagimoto/conv-1Dand2D)からも得られます．

#おわりに
畳み込みの最適カーネルサイズについて，データが含む特徴が周波数領域のどこにあるかと関係があります．周波数領域における低周波帯に特徴を抽出したい場合は大きめのカーネルが，時空間領域におけるエッジなどの高周波帯の特徴を抽出したい場合は小さめのカーネルが有効だと考えられ，目的に見合ったサイズを下回っても上回っても望ましい出力を得ることはできません．また，画像データにはサンプリングレートという考えは無く，各データのスケールがバラバラです．実問題中の時系列データにおいても，特定の周波数成分に必ず特徴が表れるのはまれであると考えられます．そのため，構造最適化の手順において事前にカーネルサイズを一つに固定するのは難しいと思われます．しかし一方で，[GoogLeNetのInceptionモジュール](https://arxiv.org/abs/1409.4842)は，並列に配置された異なるサイズのカーネルから成り立っていて（下図），このような帯域カバーがマルチスケール処理に成功したと考えられます．
<img src="https://www.fastpic.jp/images.php?file=0188069686.png" width=80%>