今日は7章「畳込みニューラルネットワーク」を読んだ.
- ニューラルネットワークとの違い
- ニューラルネットワークは全結合. つまり全部の重みが平等に扱われる. 実際に画像も1次元データにしてから学習した
- しかしそれは「形」の情報を破棄してるに等しい. 形とは例えば画像では, 近いピクセルは近い色のことが多いとか
- Affineレイヤ(全結合の内積プラスバイアス)の変わりにReLUをConvolutionレイヤとPoolingレイヤで挟む
- 出力に近い層ではやっぱりAffineが使われる. 出力としてはsoftmaxが使われることが多い
- Convolution
- 画像でいえばフィルタ
- パディング = 外枠を埋めて出力を大きくする
- ストライド = フィルタを当てる間隔を大きくして出力を小さくする
- 入力とフィルタのチャンネル数(RGBとか)は揃える必要がある(一般化するとストライドやパディングの次元以外は揃える必要があるということだとおれは解釈した)
- バッチ化に拡張可能
- Pooling
- MaxプーリングやAverageプーリングがある
- Maxプーリング = フィルタ内の最大値をとる
- プーリングでは通常, ウィンドウの大きさ = ストライド (つまりオーバーラップしない)
- 効果: 微小な位置変化に対してロバストになる (1ピクセルくらいずれていてもウィンドウの中に収まるから)
- 実装方法
- 畳み込みを愚直に実装するとforループとなる. しかしこれは性能が悪い
- 行列をim2colという関数によって変換してしまい, 畳み込み = 内積計算に帰着させる
- im2colは畳み込みのオーバーラップの分だけ行列が大きくなる. 従ってメモリは食うが, numpyやGPUは行列計算は死ぬほど速い
- Convolution: 内積に帰着しているため, 計算式はAffineと同じ. 逆伝播も同等に実装出来る
- Pooling: Maxプーリングの場合, ReLU = max(x, 0)と同じ. 逆伝播も同様に実装出来る
- im2colで入力を1つの行列に帰着させてしまうことによって, AffineとReLUと同じにしているところがうまい
- CNNは何を見ているのか
- 画像でいうと1層目はエッジやまとまりとかプリミティブについて認識している
- 2層目以降でより上位の認識(ものとか)が出来るようになっていく
- CNNの実例
- AlexNet: ディープラーニングの火付け役
この前TwitterでCNNがグラフについても適用出来るようになったぞ!グラフも畳み込めるぞ!というのを見てなんとなくしか分からなかったけど重要なのは,
- CNNが形状を保存した上での学習であること
- それはその形状に対して畳み込みが定義出来れば実現出来ること
- その形状がこの本では3次元であり, Twitterで見たものではたまたまグラフだったということ
で, 対象にどういう形状を見出すかということが一つのポイントになってくるのではないかと思っている.