空飛ぶロボットのつくりかた

ロボットをつくるために必要な技術をまとめます。ロボットの未来についても考えたりします。

機械学習のお勉強(CNN)

全結合層の欠点

  • 畳み込み層と比較してパラメータ数が膨大になる

  • コンテキストの活用が難しい

  • 位置ずれに弱い

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

全結合層の問題点はデータの形状が無視されてしまうこと。例えば、画像28×28ピクセルの形状を784個のデータとして入力する。

これは、画像の空間的な相関関係を無視しているため、形状に関する情報を生かすことができない。

一方、畳み込み層は形状を維持する。CNNでは入出力データを特徴マップという。

層が深くなるにつれて、抽出される情報はより抽象化(犬や車など高度な情報へと変化)されていくといわれている。

畳み込み演算、フィルター(カーネル)演算

フィルターのウインドをスライドさせながら、それぞれで積和演算を行う。

このフィルターパラメータがこれまでの重みに対応する。バイアスも同様に存在する。

パディング

入力データの周囲に固定データ(0など)を埋めること。これによって出力サイズを調整することができる。

これによって空間の圧縮により、畳み込みができなくなってしますことを防ぐ。

入力データの大きさに対して考慮すべきことがへる

ストライド

フィルターのウインドをスライドさせる間隔。

出力サイズ

大事!

畳み込み層の出力から全結合層への入力を計算するときに必要

全結合層への入力 = 畳み込み層のフィルター数 * h_o * w_o

# h_o, w_o : outout
# h_i, w_i : input
# h_p, w_p : padding
# h_k, w_k : filter size
# s_y, s_x : stride

h_o = (h_i + 2 * h_p - h_k) / s_y + 1
w_o = (w_i + 2 * w_p - w_k) / s_x + 1

大事!

Convolutional Neural Networkを実装する - Qiita

Deep Learning覚え書き(convolutionとpoolingの出力サイズ) - 覚え書きブログ

【保存版】chainerのconvolutionとdeconvolution周りを理解する - Monthly Hacker's Blog

GitHub - vdumoulin/conv_arithmetic: A technical report on convolution arithmetic in the context of deep learning

プーリング層

縦、横方向の空間(サイズ)を小さくする演算。

  • 情報量を落とさずに特徴マップの空間を小さくする

  • 微小な位置ずれに対して頑強にする

  • Maxプーリング:対象領域から最大値をとる演算

  • Averageプーリング:対象領域の平均をとる演算

画像認識の分野では主にMaxプーリングが用いられる。

  1. 入力データを展開する
  2. 行ごとに最大値を求める
  3. 適切な出力サイズに整形する

What is max pooling in convolutional neural...(2017) - Quora

ROIプーリング

バックワードの計算でそれぞれのBOXに対して、勾配を加算する

切り取った部分のみに勾配を加算することで、切り取った部分に関係するパラメータのみに対してロスを反映できる

chainer/roi_pooling_2d.py at master · chainer/chainer · GitHub

[1504.08083] Fast R-CNN

三次元データの畳み込み演算

入力データのチェンネル数とフィルター数は同じにすること。

フィルター自体を複数用意すると多チャンネルの特徴マップを出力することができる。

よってフィルターの重みデータは4次元のデータ(チャンネル数4、サイズ5×5、フィルター数20)としてあらわすことができる。

バッチ処理

各層を流れるデータは四次元データとなる。

チャンネル数、サイズに加え、バッチ数が付け加えられる。

層の深さに関して

簡単な文字認識などでは層は深くないほうが高精度

大規模画像認識のコンペなどでは層が深いものは上位

そして、層を深くするとパラメータを減らすことができる

しかし、層を深くしすぎると性能が劣ることもあった

ResNet

層を深くすることができる手法で、スキップ構造を導入している。

これによって層を深くすることに比例して性能を向上させることができる。

転移学習

学習済みの重みをベースに学習を行う。

課題

如何に畳み込み層の計算を速く行うか。

つまり、いかに速く効率的に積和演算を行うか。