先日のConvolution処理の記事「高速な Convolution 処理を目指してみた。Kn2Image方式」で の 比較対象として紹介した Im2Col 方式 について図解します。
#参考文献
- cuDNN: Efficient Primitives for Deep Learning(arXiv:1410.0759)
- Pete Warden's blog (2015/04/20) Why GEMM is at the heart of deep learning
Im2Col 方式
- Im2Col方式の特徴は、行列積演算1回でConvolution処理を行うために、Source Image の画素配置を(重複ありで)変形させるところにあります。
- 本記事では、変形させた画素配置を col展開 と呼称します。
- 以下、順を追って図解します。
画素配置変換 (Image → Col展開)
- 下図の8×6の画像 を 入力画像として説明していきます。
- 説明用に1画素のみ 色 を変えてあります。
- フィルタは 3×3 です。
- ⑤を注目画素とします。
- 左上の画素を始点とします。
- 注目画素 と 近傍(3×3)を、1列にシリアライズします。
- 範囲外の ①②③④⑦ は 0値 を格納します。
- 注目画素を右に移動させます。
- 同様に、注目画素 と 近傍(3×3)を、1列にシリアライズします。
- 同様に...
- 右端に達すると、
- 注目画素を 一行下の左端に 移します。
- 同様に...
- 同様に...
- 同様に...
- 同様に...
- 同様に...
- 同様に...
- Sorce Image の右下の終点まで行います。
補足
画素配置変換 (Col展開 → Image)
- 先ほどとは逆に、Col展開 から Image状 に戻す方法です。
- 逆伝播で dIn を算出する際に 使用します。
- 先ほどの Col展開 の図を用います。
- 左端を開始列とします。
- 注目列 を 3x3に戻します。
- 注目列を1つ左に移します。
- 注目列 の 3x3に戻します。
- Destination Image に 加算 します。
- 同様に、注目列を1つ左に移します。
- 注目列 の 3x3に戻します。
- Destination Image に 加算 します。
- 注目列が Col 展開の右端に達するまで繰り返します。
補足
- Image 状に戻し終わった際、画素$A$の値は $A_1$~$A_9$ の総和 となります。
MCMK × MiniBatch
チャンネル と MiniBatch の col 展開の配置を 下図に示します。
順伝播
- Bias 値を Out に BoradCast します。
- 下記の行列演算で、Convolution処理となります。
- 行列演算は BLAS の gemm関数がお勧めです。
逆伝播
- 画素の傾きdIn , Weightの傾きdW , Biasの傾き dB を順に図解します。
dIn
- $dIn = Weight^T × dOut$
- Col展開(dIn) は Image状に戻し、前層に伝達します。
dW
- $dW = In^T × dOut$
dB
- dB は Channel 毎の dOut の総和です。
補足
- cudnn の Convolution関数はアルゴリズムは選択可能になっており、その中の1つが この im2col 方式の様です。
ここまで読んで頂き、ありがとうございます。