Deep Learningについて真面目に勉強し始めると、最初に必ず登場する存在があります。そう、畳み込み層です。可愛いですね。これ無しでDeep Learningを語るのはほぼ不可能なくらい、画期的で重要なアルゴリズムです。畳み込み層はDeep Learningの基本なだけあって、色々なサイトで詳しく解説されています。どのサイトも非常に分かりやすいです。しかもその実装も各種フレームワークを使えば1行で書けてしまうので、畳み込み層は誰でも容易に使いこなすことが出来るツールとなっています。
さてそんな畳み込み層ですが、ここで一つ疑問が湧きました。それは、私たちは畳み込み層を本当にちゃんと理解しているのかということです。分かった気にはなっていないでしょうか。畳み込み層ちゃんのことを本当に知っていますでしょうか。
というわけで、これから全部で4問の問題を出します。全部答えられればあなたのその自信は本物です!
尚、以下の問題は畳み込み層について(ある程度)理解している方向けとなっています。畳み込み層が何なのか分からない場合は、他サイト様が詳しく解説されていますので、そちらをご確認ください。
では早速問題です!
問題
- 縦×横=25x25の画像に、サイズ=(5, 5)のフィルターを1つかける事を考えます。ストライド=(2, 2)でパディングはしない時、出力画像の縦横は何×何になるでしょう。
- (縦, 横, チャンネル)=(25, 25, 16)である中間層に、フィルターサイズ=(3, 3)、フィルター数=32の畳み込み層を用いるとき、使われるパラメータの数はいくつでしょう。ただしストライド=(1, 1)で、画像サイズは変わらないようゼロパディングするものとします。
- CNNモデルでは、古いモデルを除いて1×1の畳み込み層が頻繁に登場します。直感的には1×1では何もフィルターがかからない様に感じますが、なぜこんなに使われるのでしょうか。
- 畳み込み層のフィルターサイズは基本的に奇数です。(4, 4)や(6, 6)なフィルターサイズが使われることはありません。なぜでしょうか。
以下、答えと解説になります。考えている途中に答えが見えてしまうと悲しいので少し余白を取ります。
答えと解説
↓
↓
↓
1. 11×11
解説:
下図のように、25×25の画像に対して(5, 5)のフィルターが2個ずつズレながら新しい画像を作っていきます。フィルタの右端の座標を考えると、5,7,9,…と2個ずつ増えながらズレていきます。これが終点の25まで続くので答えは11です。
2. 4640個
解説:
畳み込み層におけるフィルターは、前の層のそれぞれチャンネルと、後の層のそれぞれのチャンネルを結ぶ数だけ作られます。言葉だと難しいのですが、図で説明すると以下の通りです。
図のように、ある前の層のチャンネルに対して、後の層のチャンネル数(32個)だけフィルターが作成されます。前の層は16チャンネルあるので、必要なパラメータの数は
(前層のチャンネル数)×(フィルターサイズ)×(後の層のチャンネル数)
=16×(3×3)×32
=4608
です。
…え、答えと違うって?まあそう急がないでください。
最後に、後の層のそれぞれのチャンネルに別個のバイアスを足します。今回後の層は32チャンネルですので、答えは
4608+32=4640個
となります。
3. 実装が簡単(3×3を1×1にするだけ)で計算量も少ない(3×3の畳み込み層の1/9)のに、
① 次元削減(=モデルの高速化、軽量化)
② 出力にrelu等を与えることで非線形性UP
ができるから。
解説:
例えば、(縦, 横, チャンネル)=(100, 100, 32)の層を、3×3の畳み込み層を用いて(100,100,64)にすることを考えます。
この時、上図のようにストレートに畳み込み層を実装すると、必要な変数は32×3×3×64+64=18496個です。では次に、この2つの層の間に1×1の畳み込み層を挟んでみましょう。この時、1×1畳み込み層の出力チャンネルは32より小さくなるようにします。今回は32の半分の16とします。
すると、必要な変数は
・最初の畳み込み層:32×1×1×16+16=528
・次の畳み込み層:16×3×3×64+64=9280
・計:9808
となり、層の数は増えているにもかかわらず、元の構造からパラメータの数を半分近くまで落とすことに成功しました。このように、1×1の畳み込み層を挟むことでモデル全体のサイズを小さくできるため、計算能力が低い環境や、低電力の環境でもモデルを動かすことが可能となります。
4. 偶数だと中心ピクセルがなくなるから。
解説:
フィルターはあるピクセルについて、周辺ピクセルとの関係性を調べるために用いられます。フィルターサイズが奇数の時は中心が定まるため、中心ピクセルと周辺ピクセルを分けられますが、フィルターサイズが偶数だと中心ピクセルが定まらなくなってしまいます。なのでフィルターサイズはいつも奇数なのです。
フィルターサイズが偶数であっても、フィルターはアルゴリズム通り実装すれば動くためモデルを学習させることは可能です。kerasで kernel_size=(4,4)
にしても問題なく動きますし、MNISTを使った学習は進みます。しかし、この場合基準となるピクセルがないため、理論上はピクセルとピクセルの間に中心があるつもりでフィルターをかけていることになります。例えばフィルターサイズ=(6, 6)なら中心のピクセルは(3.5, 3.5)です。しかしピクセルが表現できる最小単位は1であるため、小数点以下は近くにあるピクセルに吸収されてしまいます。そのためフィルターによるエッジ強調などが上手く働かず、エイリアシングが発生して学習に支障をきたす可能性があります。実際に偶数フィルターを使って失敗するかを本気で実験したことはありませんが、私は奇数を推奨しておきます。
まとめ
愛しの畳み込み層について計4問考えてみましたが、いかがだったでしょうか。意外と難しかったのではないでしょうか。解説サイトを見ただけでは2番や4番は答えられないんじゃないかと思います。
このページで、畳み込み層への理解が少しでも深まりましたら幸いです。