もう一度まじめにConvolutionレイヤ(畳み込み層)の基礎を確認する

なんかわかったようでわかっていない気がするConvolutionレイヤについて勉強し直そうと思い立ったので、ここにまとめながら復習する.

Convolutionレイヤについてのみ、その基礎のポイントだけ扱っています.
長すぎると読む気がなくなるものなので…

どういう性質/特徴があるの?

よく言われているConvolution層(およびそれを使ったネットワーク)の性質や特徴って

  • 位置不変性を持つ

特徴となる箇所がいつも画像の同じ位置になくても捉えることができます.
処理をするに従って位置を絞っていくためです.

  • 画像処理に向いており頻繁に使用される

画像分類や画像生成など様々な場面でされます.Convolution層は画像から特徴を抽出するのに適しているためです.

  • パラメータが全結合層より少ない

全結合層は「入力ニューロン数」x「出力ニューロン数」の重みを持つ必要があります.Convolution層の場合は、あらかじめ決めたフィルタサイズF(大体3~11)と入力チャンネル数L_inと出力チャンネル数L_outを使って、F x F x L_in x L_outが必要となるだけです.

  • 全部Convolution層にすると入力する画像サイズは可変でもOK

前述の通り、全結合層は学習するときに「入力ニューロン数x出力ニューロン数」が学習する重みの数と決まっていたので一度重みを学習するとそのあと重みの数を変更できず他サイズの画像を扱えませんでした.
Convolution層では、入力画像の大きさに関係なくフィルタサイズを決め、どのパラメータも入力画像の大きさに依存しません.
ネットワーク全てがConvolution層の場合(Fully Convolutional Network)、入力画像の大きさに関係なくどのような画像でも処理ができるようになります.一つでも全結合像が入っていると

結局どういう計算をしているの?

とりあえず一番小さい計算処理は以下です.

「決まったサイズのフィルタ(3×3や7×7)を使って、特定領域の値と対応する重みを掛け合わせて全てを足し合わせる」

この処理を画像全体を舐めるように移動しながら、繰り返し入力画像に対して行なっていきます.
以下のようにオレンジ領域に注目して、それに対応する重みを掛け合わせます.
今回なら 0x0.1+80×0.2+10×0.5+30×0.6+10×0.1+20×1.2+40×0.2+50×0.8+20×0.4
を行います.

上記のような処理を移動しながら処理をすると以下のように出力がされていきます.
赤、青、緑、黄色はそれぞれの注目領域です.赤枠領域を処理して赤色のマスに出力、それが終われば緑枠領域を処理して緑色のマスに出力.以下繰り返し.

上記の計算はまだConvolution層の計算の一部.
Convolution層の計算を全体でみると入力が増えて、また出力も増えます.
上記では、1つの入力から一つの出力をしていますが、
全体では、複数の入力からそれぞれ上記の計算を行なってその合計値をそれぞれの出力値に記入していきます.

出力レイヤごとに計算をしているので、まずそれごとに考えると考えやすいと思います.

「Convolution層全てのパラメータ」 = 「出力レイヤごとに必要なパラメータ数」x 出力レイヤ数

ある出力レイヤを作るぞってなったときにそれを計算するのに、
入力レイヤ全て使うので、

出力レイヤごとに必要なパラメータ数」 = 「一つの入力レイヤで必要なパラメータ」x 入力レイヤ数

となります.
そして、一つの入力レイヤではある大きさのフィルタを元に処理をすることになりますが、これはその入力レイヤで処理する間は共通です.そのため大きさが3×3であれば9個のパラメータを持つだけでその入力レイヤでの全てのConvolution計算が可能です.

一つの入力レイヤで必要なパラメータ」 = 「フィルタサイズ」 x 「フィルタサイズ」

何がパラメータ?

上記の計算を踏まえて実際に設定するときには何がパラメータとしてあるのかというと、主に以下の3つかと思います.(重みのパラメータはのぞいて、学習で変動しないあらかじめ設計時に決めるパラメータについてです)

  • フィルタサイズ(3×3, 5×5, 7×7,11×11等)

Convolutionのフィルタ処理をするサイズを決めます.

  • ストライド(どのくらいずらしながら処理して行くか)
  • ゼロパディング(出力したものをどれだけ周りを0埋めして広げるか)

Convolutionの処理の動き方を決めるパラメータを決めます.

誤差逆伝播はどうしてるの?

Convolutionの式から全結合層(Fully Connected Layer)と同様に求めることができます.通常の誤差逆伝播と同様にチェーン・ルールに則って求めます.
結果から言えば、順伝播時と同じように掛け合わせて足し合わせることで求めることができます.

簡単に誤差逆伝播をどう求めるかについて追ってみます.
誤差逆伝播の前に勾配降下法の確認です.
勾配法では必ず小さくするとよくなる誤差関数Eを信じてその勾配を元にどの程度パラメータを更新するかを決めていました.
以下の式のようにEをパラメータで微分してその値でパラメータをどの程度更新するか決めています.

チェーン・ルール (連鎖律)の確認です.
偏微分を行う上で重要な数学的な性質になります.
これを駆使して、誤差や更新量を計算します.

そのため誤差逆伝播法では二つの値を計算します.
・層の出力誤差 (後ろの層のパラメータの更新量計算のため)
・パラメータの更新量

Convolutionの順伝播の式をまず考えてそのあとに誤差逆伝播のときの式を導きます.
ここでConvolutionの入力は3×3の1層でXとし、Convoltuionのフィルタのサイズを2×2のWとして出力は2×2の一層でZとします.これらを順伝播のときには以下の計算をしています.


Convolutionの計算はとてもわかりやすく以下の式で関係が求まります.

それでは早速誤差逆伝播のときの式を考えます.
まず後ろの層から逆伝播で渡ってくるのは以下です.

この値を元に、以下のパラメータ更新のための値を計算します.

上記の値が計算できれば先ほどの勾配降下法が使えるようになるんでした.
それでは上の式を求めます.
チェーンルールによってEはzの関数でwが関係あるものだけを書き下すと

と書くことができます.順伝播の式を偏微分することで以下の関係式が得られるので(例えば∂z11/∂w11の場合)

これを他のにも適用すると

となります.ここで右辺にできている値は、x系は全て順伝播のときに使っている値で∂E/∂zは先ほど書いたように後続する層からもらえる値なので、全て計算することができます.
この上記の値が計算できれば、先ほど書いた更新式でConvoltuionのパラメータが更新できます.

そしたら次に前の層に渡してあげる誤差を計算しなくてはなりません.
しかしこれも先ほどのチェーンルールとやることは一緒です.
以下では多すぎるのでx11,x12,x21,x22しか書いていませんがx13,x23,x33,x31,x32,x33も同様に計算します

これも元々の関係式を使って書き換えると(また一部のみです)

のような計算になります.

実はこれは、得られた出力の誤差の値に順伝播のConvolutionを180度回転してかけているにすぎません.この処理を行なってこのConvoltuion層に入力されたxの9つの誤差を計算します.
つまり誤差逆伝播における処理は、順伝播も参考に書くと以下のようなフィルタになっています.

これによって∂E/∂xが求まりした.
これの値は次の層にとっての∂E/∂zになります.

Convolutionの逆の層って?

Convolution層の逆として、Unpooling層Deconvolution層などがある.
これはGANなどにおけるDecoderに当たるような部分で頻繁に使用される.

個人的な感触としてはDeconvolution層がよく使われている気がします.

About the author

コメントを残す