畳み込みと特徴マップのプレイグラウンド

各カーネルの選択でどの視覚パターンが残るかを見てみよう

インタラクティブシミュレーションを読み込んでいます...

パディングなしでは深い層が画像を消し去る 🖖

パディングなし、ストライド1の3×3カーネルでは、各辺から1ピクセルずつ失われる。このツールの28×28の入力なら、出力は26×26になる。一見問題なさそうだが、層を重ねると影響は大きい。10層で8×8まで縮み、14層を超えると何も残らない。「same」パディングがあるのはこのためだ。周囲に1ピクセル分のパディングを加えれば、出力を入力と同じ大きさに保てるので、ネットワークの深さに制約がなくなる。一方、ストライドは引き算ではなく割り算として効き、その影響は積み重なる。ストライド2でぼかすと、28×28は1層だけで14×14になる。したがって、このツールの二つの設定は見た目だけのものではない。画像が消失するまで何層重ねられるかを左右する、アーキテクチャ上の重要な選択である。

スライドする小さな窓 🖖

畳み込みは、カーネルと呼ばれる小さな数値の格子を画像上でずらしていきます。各位置で重なった値を掛け合わせて足し、1つの出力ピクセルにまとめます。その結果が特徴マップで、カーネルのパターンが現れた場所ほど明るくなります。ここでエッジ検出カーネルを試してみましょう。平坦な領域は暗くなり境界が光ります。カーネルは明るさそのものではなく、変化に反応するからです。

実は畳み込みではない 🖖

ほぼすべてのCNNが「畳み込み」と呼ぶ演算は、実際には相互相関です。本来の数学的な畳み込みは、カーネルを上下・左右に反転させてからずらしますが、ディープラーニングのライブラリはこの反転を省きます。どのみちネットワークが重みを学習するので、反転したカーネルは単に逆向きに学習され同じ結果になります。だからこの誤称が定着しました。ぼかしのような対称なカーネルでは、両者は区別がつきません。

よくある誤解

より深い特徴マップが常に「良い」とは限りません。高いストライドや厳しいカーネルは、後の層が必要とする情報を除去してしまうことがあります。

全プロセスの詳細解説

  1. 28×28の入力マップと3×3 sobel-xカーネルに対する出力マップのサイズ 6 ステップ

    レイヤー:28×28の入力マップ、3×3のsobel-xカーネル、ストライド1、パディングsame 出力マップのサイズと、1パスの積和演算コストを求めよ。さらに、単一の出力ピクセルが画像全体のすべてのピクセルに依存するようになるまでに、このようなレイヤーを何層積み重ねる必要があるかを求めよ。

    1. パディングによってサイズが固定されるため、まずこれを確定する。sameはマップの周囲に0の1ピクセルの枠線を配置する。これにより、3×3のウィンドウが端からはみ出すことなく、角のピクセルを中心として配置されるのにちょうど十分となる。カーネルが必要とする枠線の幅は、中心を除いたカーネルサイズの半分である。

    2. ウィンドウを1行に沿ってスライドさせる。その左端は0から始まり、右端がパディングされた行の末尾に達するまでストライド分進む。したがって、出力ピクセルのカウントは植木算のカウントとなる。すなわち、進んだ回数に開始位置の1を加えたものである。ストライド1では、枠線によってカーネルが取り除く2列が正確に補われる。これがsameという名称の由来である。

    3. 784個の出力ピクセルのそれぞれは、9個の入力値の加重和である。sobel-xの重みを加算すると相殺されて0になるため、9個の入力がすべて等しいウィンドウは、その領域がどれほど明るくても正確に0を返す。画像が平坦な部分はマップが暗くなり、ウィンドウの左列と右列が異なる場合にのみ反応する。

    4. 計算コストは以下の通りである。出力ピクセルあたり9回の積和演算であり、ウィンドウ位置ごとに1つの出力ピクセルとなる。パネルにはその数値が表示される。

    5. 興味深いのは深さ(層数)である。1つのレイヤーを経ると、出力ピクセルは横方向に3個の入力ピクセルを参照する。2層目を追加すると、それら3個の各ピクセル自体が3のウィンドウであったことになるが、隣接するウィンドウは2だけ重複するため、スパンは9ではなく5に達する。さらに3×3、ストライド1のレイヤーを重ねるごとに、スパンは正確に2ずつ広がる。

    6. 全28列をカバーするようにスパンを設定し、必要な深さを求める。13層では27に達し、1列不足する。14層目が、出力ピクセルが画像全体の影響を受け得る最初のレイヤーとなる。

    解答

    出力は28×28、レイヤーあたり7056回の積和演算、そして1つのピクセルが画像全体を参照するまでに14層。 次に、その受容野のコストを計算する。積み重ねられた14層は、出力ピクセルあたり14 × 9 = 126回の積和演算を費やす。同じ範囲に到達する単一レイヤーには29×29のカーネルが必要となり、出力ピクセルあたり841回となる。これは、まったく同じ受容野に対して6.7倍の計算量である。深さは幅よりもはるかに安価に受容野を広げる。これが、ビジョンネットワークが大型カーネルの短いスタックではなく、3×3カーネルの長いスタックで構成される理由である。

参考文献 (1)
  • Insight block 3 — the operation called convolution is cross-correlation: I. Goodfellow, Y. Bengio and A. Courville, Deep Learning, ch. 9. MIT Press, 2016. ISBN 978-0-262-03561-3 — "many machine learning libraries implement cross-correlation but call it convolution".

例題

  • 数字にsobel-x - Sobel-xの係数の和は0なので、一様な領域は黒くなり、垂直方向の変化だけが残る。sameパディング、ストライド1なら、出力は28x28のまま。
  • 図形のエッジ - エッジ検出カーネルも係数の和は0。中央の8と周囲8個の-1が打ち消し合うため、一様な領域は消え、境界だけが残る。出力は28x28のまま。
  • ぼかし + ストライド2 - 割り算によって縮小する唯一のプリセット。ストライド2では28x28が14x14となり、画素数は4分の1になる。ぼかしカーネルの係数の和は1なので、細部が失われても明るさは保たれる。
  • シャープ化 valid - 引き算によって縮小する唯一のプリセット。validパディングでは28x28が26x26となり、各辺から1ピクセルずつ失われる。鮮鋭化カーネルの係数の和は1なので、一様な領域の値は保たれ、エッジが強調される。