GTC 2015 - Deep Learning用のCUDAライブラリ「cuDNN」
FFTは大規模な処理では効率が高いが、これもメモリを多く必要とし、フィルタをずらす部分の処理が難しい。直接、畳み込みを計算する方法は、メモリのオーバヘッドは無いが、各種のケースに対して最適化するのが難しいというように一長一短がある。
2D ConvolutionはImageにFilterを重ね、対応するピクセルの値を掛けて、総和をとる。この例ではフィルタは3×3であるが、実際には10×10とかもっと大きいサイズが使われる。イメージの中に枠で示された部分にフィルタがある場合は、次の図の右側のように枠内のピクセルを行ベクトルに並べ替え、フィルタを列ベクトルに並べ替えて内積を計算すれば良い。
そして、フィルタを当てる領域を右に1ピクセルずらせて同じ操作を行う。
これを繰り返すと、イメージ側の行ベクトルが増えて行き、行列×ベクトルの計算になる。実際のDNNの処理では、1つの画像にいくつものフィルタが適用され、さらにミニバッチの数だけの異なる画像を一括して処理する。
そのため、行列×行列の計算となるのでGEMMが使え、より高い演算性能が得られる。なお、ここでは紙面の都合でフィルタは2×2で描かれている。