🔢

畳み込みニューラルネットワーク

に公開

基本的なニューラルネットワークを 全結合 (fully-connected) と呼び、これに対して 畳み込みニューラルネットワーク (convolutional neural network; CNN) というものがある。

前提知識

モチベーション

  • 全結合では、入力データは単一のベクトル=1次元となる。そのため、例えば2次元データを2次元のまま扱うことができず、その分の情報が失われてしまう。
    • 例: (x=3, y=3)(x=3, y=4) の2点は「隣り合っている」はずだが、1次元化すると(例えばx軸の最大値が10として)(23)(33)のようになり、その情報が失われる。逆に(x=10, y=1)(x=1, y=2) は「遠い」が、1次元化すると (10)(11) となり、連続的に見える。
  • 多次元入力を維持するための仕組みがCNN。

ネットワーク構造

  • 全結合 (fully-connected) の構造
    1. Affine レイヤ
    2. 活性化関数
  • CNNの構造
    1. 畳み込み層 (Convolution Layer)
    2. 活性化関数
    3. プーリング層 (Pooling Layer) ... 省略されることもある

CNNにおいても、出力に近い層では全結合同様の構造 (Affine → 活性化) が用いられる。

CNNにおいて、以下の用語がある。

  • 入出力データ:特徴マップ (feature map)
  • 畳み込み層の
    • 入力データ:入力特徴マップ (input feature map)
    • 出力データ:出力特徴マップ (output feature map)

畳み込み層

畳み込み層で行う処理を 畳み込み演算 と呼ぶ。

  • 入力データがある。
    • 例: [[a, b, c], [d, e, f], [g, h, i]]
  • フィルタ(カーネルとも呼ばれる)を用意する。
    • 長さは任意でよいが、次元は入力データと合わせる必要がある。言い換えると、入力データより小さい次元のフィルタを用いる場合、 入力データのどの次元を畳み込みの対象とするか 決める。対象外とした次元は別途処理する。
      • 例:画像 [X軸, Y軸, [R,G,B]] のぼかし処理では、RGB情報は畳み込み処理せず、RGBの各チャンネルごとに[X軸, Y軸]の2次元で畳み込み処理を行う。
    • 例: [[w, x], [y, z]]
    • フィルタは全結合における 重み に対応する。つまり学習可能データ。
  • 入力データとフィルタの対応する要素ごとに 積和 を求める。
    • 例: [[aw + bx + dy + ez, bw + cx + ey + fz], [dw + ex + gy + hz, ew + fx + hy + iz]]
    • 入力データのうち、フィルタと対応する部分を「パッチ」という。
  • 必要に応じて バイアス を加える。バイアスは全ての要素に一律で加える。
    • 畳み込み演算結果が[[a, b], [c, d]]の場合、[[a+B ,b+B], [c+B, d+B]]
    • バイアスも学習可能データ。

上の内容を基本とし、実際はさらに以下の要素が加わる。なお原則ハイパーパラメータとなる。

  • パディング (padding)
    • 基本的に、入力データの各次元ごとに、頭と末尾に 0 を挿入する。padding=1 なら 1個ずつ、padding=2 なら 2個ずつ。
    • 非対称に入れる実装もある。
    • 効果:入力データの隅々まで拾えるようになる。
  • ストライド (stride)
    • 入力データからパッチを取るとき、stride=1なら1つずつ、stride=2なら2つずつスライドさせていく。
    • 効果:パッチを取る範囲のスキップ。つまり「解像度の下がった」データになる。
  • 膨張または拡張 (dilation)
    • フィルタの各要素の間に0を挿入する。dilation=1なら0個(=挿入しない)、dilation=2なら1個、dilation=3なら2個という具合に挿入する。
    • 効果:広い範囲からパッチを取りつつ計算量は抑える。

※ここでの「畳み込み」は機械学習における実務的な方法であり、数学的に純粋な「畳み込み」からアレンジされている。数学的な畳み込みについては以下を参照。

https://www.youtube.com/watch?v=CHx6uHnWErY

プーリング層

畳み込みに似た処理だが、もっとシンプル。

  • 入力データ(=活性化関数の出力データ)からパッチをとる。
    • このときのサイズを「ウィンドウ」という。
  • パッチに対して計算を行う。
    • 平均値を取る:average pooling
    • 最大値を取る:max poling
  • ストライドはウィンドウと同じにするのが一般的。
  • 学習可能データはない。

プーリング層の役割はダウンサンプリング(計算量の削減、微小な変化に対するロバスト化)。

Discussion