CNN - Convolutional Neural Net - 畳み込み層の実装
普通のニューラルネットの各層を全結合層とよぶ(全てのノードは次の層のノードにつながっている)
なぜ全結合では不満があるか
全結合層では、2次元的・3次元的構造を保持しない。これは1次元ベクトルとして入力する仕様のため。これでは2次元的構造(画像など)の重要な構造が失われてしまう
全結合の不満の解消
全結合層で不満だった2次元的構造の消失問題を構造の情報を取り出し、保存することにより解決する。その取り出し方が畳み込みと言われる手法である。
畳み込みの定義
定義 畳み込み(2次元の場合)
2次元正方行列(入力データ) A を2次元正方行列(フィルター) B (ただし A の行数 > B の行数)を用いてたたみこむとは、B を A の上に重ねて動かしていき、重なった A と B の要素の積の総和を求める演算を、全ての重ね方で行って新たな行列(出力データ) C を作ること
C = A ◉ B
とあらわす
サイズを一定に保つトリック
畳み込みを行うと必ずフィルターのサイズを引く形で圧縮されてしまう。次元の制約により、畳み込みにより次元を大きくすることはできないので、これは層がおおくなるほど不都合になってくる。そこで、padding と呼ばれるトリックが便利。これは畳み込みを行う入力データの周囲に0のみからなるデータを埋めてから畳み込みを行うこと。これにより次元を一定に保つことができる。
3次元構造化
nこのフィルターを通してたたみこむことで、畳み込み後は3次元構造となる。
高速化
何も考えず実装すると、for 文の中に for 文となるが、これでは遅くなるため、 im2col という、フィルターにとって都合のいいように入力データを加工する関数を導入し、大規模行列計算ライブラリーの恩恵を受けて計算する。
少しの変動に強い層の実装
少しのノイズが来ても、出力は不変であるような出力層があると便利。これはPooling レイヤー として実装できる。有名なのは max pooling で、n x n の範囲の最大値を取りながら走査していく。これは最大値以外が変化しても出力データは不変なため、非常にノイズに対してロバストである。
CNN - convolutional net の実装
CNNは以下の構成を取る
- Convolution
- ReLU
- Pooling
- Affine
- ReLU
- Affine
- Softmax
CNN が実現する抽象化
CNNは畳み込み層が進むにつれて、
- 単純なエッジや色の塊
- それらの組み合わせパターン
- 複雑な模様や対象
というように得られる特徴量が抽象化されていく
歴史的に重要な CNN
- LeNet 1989
- AlexNet 2012