読者です 読者をやめる 読者になる 読者になる

TadaoYamaokaの日記

山岡忠夫 Home で公開しているプログラムの開発ネタを中心に書いていきます。

DCNNによるマンガキャラクターの顔パーツ検出(追試3)

前回に続き、学習のハイパーパラメータの影響を考察する。

今回は、ミニバッチサイズを変更した場合の影響について調べた。

ニューラルネットワークの学習は、通常ミニバッチ単位で更新を行う。
ミニバッチのサイズは、大きくすると勾配のばらつきが安定するため、学習係数を大きくすることができる。
また、GPUはメモリの許す限り1度に多くの行列を処理した方が効率がよい。(CPUの場合はこの限りではない。)

ただし、ミニバッチサイズをN倍にしても学習係数はN倍まで大きくはできない。

ここでは、適切なミニバッチサイズはどれくらいか調べてみた。

前回まではミニバッチサイズを16として、学習アルゴリズムにRMSpropを使用し、lossが発散しないできるだけ大きな学習率としてlr=0.0001で学習を行った。

学習係数を固定

まず、学習係数を固定して、ミニバッチサイズのみ変化させた結果、以下の通りとなった。

f:id:TadaoYamaoka:20170209223157p:plain

ミニバッチサイズを変更した分、1エポックのイテレーション数を増減させて、1エポックあたりのサンプル数が変わらないようにしている。

エポック単位では学習の速度は、ミニバッチサイズが小さいほうが速く収束している。
ミニバッチサイズが4では、test lossのばらつきが大きくなっており、直前のデータの影響を大きく受けている。

ミニバッチサイズを変えるとエポックあたりの処理時間も変わる。横軸の単位を実時間に変えた場合は、以下のようになる。

f:id:TadaoYamaoka:20170209223714p:plain

実時間あたりでは、エポックあたりよりミニバッチサイズごとの学習速度の差が小さくなっている。
それでも、ミニバッチサイズが小さい方が速く収束している。

学習係数を調整

次に、学習係数を調整を行った場合のミニバッチサイズによる学習速度について比較した。
ミニバッチサイズが4と8の場合は省略して、ミニバッチサイズを32にした場合と、64にした場合について比較する。
ミニバッチサイズを32にした場合、学習係数をlr=0.0002にしても学習できた。
ミニバッチサイズを64にした場合、学習係数はlr=0.00025までしか上げられなかった。それ以上にするとlossの減りが逆に遅くなる。

エポックあたりのlossは以下の通りとなった。

f:id:TadaoYamaoka:20170209234910p:plain


ミニバッチサイズ16と32の差は学習係数を固定した場合より差が小さくなっている。
ミニバッチサイズ64は16、32と比べてだいぶ学習速度が遅い。


実時間あたりのlossを比較した結果は以下の通りとなる。

f:id:TadaoYamaoka:20170209235355p:plain

ミニバッチサイズ16と32ほぼ同じ結果であるが、train lossはミニバッチサイズが16の方が収束が速く、test lossはわずかにミニバッチサイズが32の方が安定しているように見える。
ミニバッチサイズ64は、train、testともに16、32より学習速度が遅い。

まとめ

以上の結果から、ミニバッチサイズは小さすぎると直前のデータ影響を受けやすくlossが安定しなくなる。
ミニバッチサイズを大きくすると学習係数を大きくできるが、実時間あたりの学習速度は必ずしも速くなるわけではない。

今回の結果からは、ミニバッチサイズは小さ過ぎないサイズ(8以上)であればよく、大きくするメリットはあまりなく、大きくしすぎる(64以上)と学習速度が遅くなるということが言える。
前回まで使用していたミニバッチサイズの16は、他の論文を参考にしたものであったが、それが適切なサイズであることが確かめられた。