機械学習と黒魔術

2次元から3次元への埋め込みをしていくブログ。

CNN - Convolutional Neural Net - 畳み込み層の実装

普通のニューラルネットの各層を全結合層とよぶ(全てのノードは次の層のノードにつながっている)

 

なぜ全結合では不満があるか

全結合層では、2次元的・3次元的構造を保持しない。これは1次元ベクトルとして入力する仕様のため。これでは2次元的構造(画像など)の重要な構造が失われてしまう

 

全結合の不満の解消

全結合層で不満だった2次元的構造の消失問題を構造の情報を取り出し、保存することにより解決する。その取り出し方が畳み込みと言われる手法である。

 

畳み込みの定義

定義 畳み込み(2次元の場合)

2次元正方行列(入力データ) A を2次元正方行列(フィルター) B (ただし A の行数 >  B の行数)を用いてたたみこむとは、BA の上に重ねて動かしていき、重なった AB の要素の積の総和を求める演算を、全ての重ね方で行って新たな行列(出力データ) C を作ること

C = A B

とあらわす

 

サイズを一定に保つトリック

畳み込みを行うと必ずフィルターのサイズを引く形で圧縮されてしまう。次元の制約により、畳み込みにより次元を大きくすることはできないので、これは層がおおくなるほど不都合になってくる。そこで、padding と呼ばれるトリックが便利。これは畳み込みを行う入力データの周囲に0のみからなるデータを埋めてから畳み込みを行うこと。これにより次元を一定に保つことができる。

 

3次元構造化

nこのフィルターを通してたたみこむことで、畳み込み後は3次元構造となる。

 

高速化

何も考えず実装すると、for 文の中に for 文となるが、これでは遅くなるため、 im2col という、フィルターにとって都合のいいように入力データを加工する関数を導入し、大規模行列計算ライブラリーの恩恵を受けて計算する。

 

少しの変動に強い層の実装

少しのノイズが来ても、出力は不変であるような出力層があると便利。これはPooling レイヤー として実装できる。有名なのは max pooling で、n x n の範囲の最大値を取りながら走査していく。これは最大値以外が変化しても出力データは不変なため、非常にノイズに対してロバストである。

 

CNN - convolutional net の実装

CNNは以下の構成を取る

  1. Convolution
  2. ReLU
  3. Pooling
  4. Affine
  5. ReLU
  6. Affine
  7. Softmax

 

CNN が実現する抽象化

CNNは畳み込み層が進むにつれて、

  1. 単純なエッジや色の塊
  2. それらの組み合わせパターン
  3. 複雑な模様や対象

というように得られる特徴量が抽象化されていく

 

歴史的に重要な CNN

  • LeNet 1989
  • AlexNet 2012