畳み込み層
📂機械学習畳み込み層
定義
Wをk×k行列としよう。Mn×n=Mn×n(R)をサイズがn×nの実数行列の集合としよう。畳み込み層convolutional layerCW:Mnn→M(n−k+1)×(n−k+1)は次のように定義される関数である。X∈Mn×nとY=CW(X)に対して、
Yij=w11w21⋮wk1w12w22⋮wk2⋯⋯⋱⋯w1kw2k⋮wkk⋅Xi,jXi+1,j⋮Xi+k−1,jXi,j+1Xi+1,j+1⋮Xi+k−1,j+1⋯⋯⋱⋯Xi,j+k−1Xi+1,j+k−1⋮Xi+k−1,j+k−1=q=1∑kr=1∑kWqrXi+q−1,j+r−1
XijはXのi行、j列の成分である。
説明
畳み込み層は、与えられたWに対して、Xを2次元離散畳み込みW∗Xに送る写像である。Wを呼ぶ言い方は様々で、カーネルkernel、フィルターfilter、ウィンドウwindowなどがある。上の定義では正方行列として定義したが、Wをk1×k2行列として、Mn×nをMn1×n2として一般化して考えても問題ない。畳み込み層で出力を計算するプロセスをアニメーションで見ると以下の通りである。

畳み込み層と活性化関数を合成した関数を畳み込みニューラルネットワークconvolutional neural network, CNNと呼ぶ。CNNは主にイメージに関連する作業で良い性能を示す。MLPの場合、値が層を通過するたびに全結合層に送られるため、データの次元が大きく層が深いとニューラルネットワークのパラメータが非常に多くなるという短所がある。一方で畳み込み層ではパラメータの数が入力データの大きさに関係なくカーネルのサイズにのみ依存するため、線形層と比較してパラメータの数を劇的に減らすことができるという長所がある。
歴史的には視神経が大脳でどのように作用するかを模倣して提案された。
ストライド
カーネルがW∈Rk×kで与えられた畳み込み層CWに対して、Y=CWが以下のように定義されるとき、順序対(s1、s2)をストライドstrideという。X∈Mn×nに対して、
Yij=q=1∑kr=1∑kWqrXs1(i−1)+q,s2(j−1)+r
このときiとjの範囲は、
i=1,2,…,⌊s1n−(k−1)⌋+1,j=1,2,…,⌊s2n−(k−1)⌋+1
⌊⋅⌋はフロア関数である。
畳み込みを直感的に説明すると、カーネルを1カ所ずつ移動させながらデータXと重なる部分に対して内積を行うということである。しかしこの時にカーネルが必ずしも1カ所ずつ動くという法律はない。つまりストライドとはカーネルが1回の動きで進行する距離を意味する。特に言及がなければ通常stride=(1,1)が基本であり、コードでも通常これがデフォルト値である。
カーネルのサイズがk1×k2、入力行列のサイズがn1×n2、ストライドが(s1,s2)ならば畳み込み層の出力行列のサイズは次のようになる。
(⌊s1n1−(k1−1)⌋+1)×(⌊s2n2−(k2−1)⌋+1)
パディング
順序対(p1,p2)に対して、次のような関数、または順序対自体をパディングpaddingという。
padding:Mn×n(R)X→Mn+2p1×m+2p2(R)↦Op1×p2On×p2Op1×p2Op1×mXOp1×mOp1×p2On×p2Op1×p2
上の形はブロック行列であり、Oは零行列である。簡単に言えば行列の上と下に値を追加して埋めることである。パディングを与える理由は畳み込み層の共域Mn−k+1×n−k+1の次元が定義域Mn×nの次元より小さいためである。この言葉はある画像を畳み込み層に繰り返して入力すると画像のサイズが徐々に小さくなることを意味する。パディングを与えるとこれを防ぐことができる。畳み込み層にパディングを与えるということは入力Xと畳み込みCWの間にパディングを合成するという意味である。
CW∘padding(X)
つまりあらかじめXを拡大しておくことで、CWを通過してサイズが小さくなっても元のサイズを維持できる。kが奇数の時、p=(k−1)/2でパディングを与えると入力行列の大きさが変わらない。
上ではパディングを行列の上下左右に0を追加することで定義したが、埋める値が必ずしも0である必要はない。実際にPyTorchには様々な手法のパディングが実装されている。特に0を埋めたパディングをゼロパディングzero paddingという。
カーネルの大きさがk1×k2、入力行列の大きさがn1×n2、ストライドが(s1,s2)、パディングが(p1,p2)ならば畳み込み層CW∘paddingの出力行列の大きさは次のようになる。
(⌊s1(n1+2p1)−(k1−1)⌋+1)×(⌊s2(n2−2p2)−(k2−1)⌋+1)
チャンネル
カーネルが行列ではなくテンソルであることもある。Wが大きさがk×k×cのテンソルである場合、cをWのチャネルchannelという。入力行列のサイズがn×nでカーネルのサイズがk×k×cの時、Y=CW(X)の大きさは(n−k+1)×(n−k+1)×cである。函数値は以下のように計算される。
Yijℓ=q=1∑kr=1∑kWqrℓXi+q−1,j+r−1
この時i, j, ℓの範囲は、ストライドが(s1,s2)の時、
i=1,2,…,⌊s1n−(k−1)⌋+1,j=1,2,…,⌊s2n−(k−1)⌋+1ℓ=1,…,c