深層学習:畳み込みニューラルネットワークCNN Depthwize separable Convolution, Pointwize Convolution

畳み込みニューラルネットワーク(以下CNN)は、タスクに必要な特徴量を引き出すことに優れていることから、特徴量抽出エンジンとみなされる。入力層の直後にある層で、低レベルで抽出した入力生データが持つ特徴量を、その後の多層パーセプトロンの全結合層などの層で使い学習し、目的関数やクラスラベルが予測される。
 CNNと多層ニューラルネットワークを重ねたディープCNNは、低レベルで収集した特徴量を重ねることで、高度な特徴量を生成すること可能になる。
 CNNは、複数の畳み込み層と、学習可能なパラメータを持たないプーリング層に続き、最後に全結合の多層ニューラルネットワークが少なくとも一つ繋ぎ合わさた構成を持つ。

一次元ベクトル畳み込み

入力を一次元ベクトル$${{\bm x}}$$、同じく一次元の畳み込みフィルタを$${{\bm w}}$$とし、畳み込みの出力は$${{\bm y}={\bm x}\ast{\bm w}}$$と表記することにする。
これを成分で書けば、$${y_i=\displaystyle{\sum^{\infty}_{k=-\infty}x_{i-k}w_k}}$$となり、有限のサイズ$${n}$$を超えた$${{\bm x}}$$の範囲外まで足し上げが及んでいる。よって、$${{\bm x}}$$の範囲外の$${x_j: j\lt 0, j\ge n}$$をゼロにする。この作業をパッディングと呼ぶ。
パッディングのサイズを$${p}$$とすれば、パッディングされた入力シグナルは、$${{\bm x}^p: x^p_j , -p \le j \lt n+p}$$、またフィルタのサイズを$${m, m\lt n}$$とすれば、畳み込みの出力は、
$${y_i =\displaystyle{\sum^{m-1}_{k=0} x^p_{i+m-k-1}w_k=x^p_{i}w_{m-1}+ x^p_{i+1}w_{m-2} +\cdots + x^p_{i+m-1}w_0}}$$
となる。入力シグナルとフィルタのインデックスが逆になっているから、フィルタ$${{\bm w}}$$を反転させて、$${{\bm w}^r=(w_{m-1}, \cdots, w_0)}$$を用いて、
$${x^p[i:i+m] {\bm w}^r= x^p_iw_{m-1}+x^p_{i+1}w_{m-2} + \cdots x^p_{i+m-1}w_0}$$から、畳み込みの出力は、
$${{\bm y}={\bm x}\ast{\bm w}={\bm x}^p{\bm w}^r}$$で得られる。
 パッディングを使うことにより、入力シグナルの各要素が均一に畳み込み出力シグナルの計算に現れる。例えば、パッディングサイズをゼロにすると、入力の最初と最後の要素は、真ん中の要素よりも畳み込み出力に入る頻度が少ない。また、フルモードと呼ばれるパッディングサイズ$${p=m-1}$$は出力次元数が増えるため、滅多に使われない。出力と入力サイズを同じになるようなパッディングをSame Modeと呼び、パッディングを行わない($${p=0}$$)をValid Modeと呼ぶ。
 入力ベクトルに対し、フィルタを動かしていく距離をスライドサイズと呼び、
$${y_i=x[i\times s:i\times s + m]{\bm w}^r}$$。
 よって、畳み込み出力のサイズ$${o}$$は、
$${o=\displaystyle{\left \lfloor{\frac{n+2p-m}{s}}\right \rfloor + 1 }}$$
で与えられる。

2次元畳み込み

2次元畳み込みは一次元畳み込みの拡張で示され、入力を$${{\bm X}: n_1 \times n_2}$$行列、フィルタを$${{\bm W}: m_1 \times m_2}$$行列として、出力は$${{\bm Y}={\bm X}\ast{\bm W}}$$と表され、
$${Y_{ij}=\displaystyle{\sum^{\infty}_{k_2=-\infty}\sum^{\infty}_{k_1=-\infty}X_{i-k_1, j-k_2}w_{k_1, k_2}}}$$である。
一次元畳み込みと同様に、フィルタの列を行をそれぞれ逆に並べ替えると
$${{\bm W}^r=W[::-1, ::-1]}$$、ここで、$${{\bm W}^r \neq {\bm W}^T}$$であることに注意が必要である。
$${\displaystyle{{\bm W}=\begin{pmatrix}w_{0,0} & w_{0,1} & \cdots & w_{0,m_2-1}\\w_{1,0} & w_{1,1} & \cdots & w_{1,m_2-1} \\ \vdots & \vdots & \ddots &\vdots \\ w_{m_1-1,0} & w_{m_1-1,1} & \cdots & w_{m_1-1, m_2-1} \\\end{pmatrix}}}$$とすれば、
$${\displaystyle{{\bm W}^r=\begin{pmatrix}w_{m_1-1,m_2-1} & w_{m_1-1,m_2-2} & \cdots & w_{m_1-1,0}\\w_{m_1-2,m_2-1} & w_{m_1-2,m_2-2} & \cdots & w_{m_1-2,0} \\ \vdots & \vdots & \ddots &\vdots \\ w_{0,m_2-1} & w_{0,m_2-2} & \cdots & w_{0, 0} \\\end{pmatrix}}}$$
である。
$${y_{i,j}=X^p[i\times s_1:i\times s_1 + m_1, j\times s_2:j\times s_2 + m_2].flatten() \cdot {\bm W}^p.flatten()}$$
で与えられる。ここで、$${\cdot}$$は二つのベクトルの内積である。
ただし、実際にはこの方式の実装は計算効率が悪いため行われていない。

プーリング

プーリングは作用する領域はオーバラップなく行われる。領域サイズを$${(n_1, n_2)}$$とし、この領域内で、最大値を取る最大値プーリング、または領域内の平均値を取る平均値プーリングがある。
最大値プーリングは、近傍の局所的な微小な変化を抑制することができ、ノイズの影響を最小限にして特徴量を抽出できる利点がある。またプーリングを行うことにより、入力シグナルの次元が小さくなるため、計算効率が向上し、過学習の予防となる。

複数の入力チャンネル

入力チャンネルを$${C_{in}}$$と表せば、画像の入力がRGBのカラー画像の時は、$${C_{in}=3}$$であり、グレースケールであれば明暗しかないから$${C_{in}=1}$$である。畳み込みフィルタは各チャンネルに適用され、入力が$${{\bm X}:n_1\times n_2 \times C_{in}}$$で、フィルタが$${{\bm W}: m_1 \times m_2 \times C_{in}}$$、入力バイアスが$${{\bm b}: C_{in}}$$とすると、畳み込み出力は$${{\bm Z}^{(conv)}=\displaystyle{\sum^{C_{in}}_{c=1} {\bm X}[:,:,c]\ast {\bm W}[:,:,c]}}$$であり、全出力は$${{\bm Z}={\bm Z}^{(conv)}+{\bm b}}$$、次の層への入力は活性化関数を経て、$${{\bm A}=\phi({\bm Z)}}$$で与えられ、特徴量マップとなる。
 この複数の特徴量マップを扱うフィルターは、$${m_1 \times m_2 \times C_{in}\timesC_{out}}$$のサイズの行列で与えられ、入力は$${{\bm X}: n_1\times n_2 \times C_{in}}$$であるから、出力ユニットへのバイアスを$${{\bm b}}$$とすれば、
$${{\bm Z}^{(conv)[:,:,k]}=\displaystyle{\sum^{C_{in}}_{c=1}{\bm W}[:,:,k] \ast {\bm X}[:,:,c]}}$$
$${{\bm A}[:,:,k]=\phi({\bm Z}^{(conv)}[:,:,k]+b_k)}$$

訓練可能なパラメータ数

プーリング層には訓練可能なパラメータは存在しないので、畳み込みフィルタのパラメータ数が$${m_1 \times m_2 \times C_{in}\timesC_{out}}$$、これにバイアスの$${C_{out}}$$の、$${m_1 \times m_2 \times C_{in}\timesC_{out}+C_{out}}$$となる。
Deptiwize separable Convolutionでは、チャンネル方向の畳み込みを別にして、まずチャンネルごとにフィルタをかけて畳み込みを行い積み重ね、これにチャンネル方向の次元の畳み込みを行う。これによって、パラメータ数は、チャンネル毎のフィルタのパラメータ$${C_{in}\times m_1 \times m_2}$$と、入力チャンネル数の畳み込み$${C_{in}}$$に出力数をかけて、$${C_{in}\timesC_{out}}$$で、$${C_{in}\times m_1 \times m_2 + C_{in}\timesC_{out}}$$となる。
Pointwize Covolutionは、出力チャンネルを増やした時の負荷が少ない利点のある畳み込み法で、フィルタサイズの$${m_1}$$と$${m_2}$$を共に1とする。これによって、パラメータ数を$${C_{in}\times C_{out}}$$に削減する。
パラメータの削減は、計算効率の向上、ひいては消費電力の削減のほかに、過学習を防ぐ意味合いもあり重要なファクターである。


この記事が気に入ったらサポートをしてみませんか?