🔢
畳み込みニューラルネットワーク
基本的なニューラルネットワークを 全結合 (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) の構造
- Affine レイヤ
- 活性化関数
- CNNの構造
- 畳み込み層 (Convolution Layer)
- 活性化関数
- プーリング層 (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個という具合に挿入する。 - 効果:広い範囲からパッチを取りつつ計算量は抑える。
- フィルタの各要素の間に
※ここでの「畳み込み」は機械学習における実務的な方法であり、数学的に純粋な「畳み込み」からアレンジされている。数学的な畳み込みについては以下を参照。
プーリング層
畳み込みに似た処理だが、もっとシンプル。
- 入力データ(=活性化関数の出力データ)からパッチをとる。
- このときのサイズを「ウィンドウ」という。
- パッチに対して計算を行う。
- 平均値を取る:average pooling
- 最大値を取る:max poling
- ストライドはウィンドウと同じにするのが一般的。
- 学習可能データはない。
プーリング層の役割はダウンサンプリング(計算量の削減、微小な変化に対するロバスト化)。
Discussion