External Memory

プログラミング周辺知識の備忘録メイン

Batch Normalizationを試す

ResNetで出てきたBatch Normalization(BN)は学習速度が速くなるなら
すぐにでも導入したほうが効率が良いと考え検証した。

Batch Normalization

ResNetとBatch Normalization - External Memory


検証で使ったネットワークはconv2層(+max pooling2)+FC(FullyConnected)2層のtensorflow CIFAR10のサンプルコードで使用されているネットワーク構造と
比較的深い構造であるNetwork in Network(mlplayer3層)である。

BN層はReLU層の手前に挿入した。
NINにおいてtrainlossとtestlossの差からdropoutを省かなくても正則化効果が確認できそうだったでドロップアウトは省いていない。
以下の出力は単にBN層を追加したときのepochに対するtest lossと分類精度の比較である。最適化にはGradientDescentを用いて学習率は初期値0.1で60 epochごとに0.1倍に変化させている。

conv 2layers + FC 2layers
  epoch         loss     accuracy
------------------------------------
      0       2.3474       0.1070
     10       0.7504       0.7391
     20       0.7180       0.7628
     30       0.6642       0.7864
     40       0.6451       0.7856
     50       0.6584       0.7890
     60       0.6521       0.7969
     70       0.5603       0.8276
     80       0.5433       0.8359
     90       0.5476       0.8347
    100       0.5445       0.8358

    150       0.5440       0.8401

conv 2layers + FC 2layers + Batch Normalization
  epoch         loss     accuracy
------------------------------------
      0       2.3213       0.1122
     10       0.7047       0.7542
     20       0.5899       0.7941
     30       0.7298       0.7578
     40       0.6009       0.8004
     50       0.6568       0.7884
     60       0.5172       0.8296
     70       0.4458       0.8534
     80       0.4408       0.8535
     90       0.4431       0.8570
    100       0.4497       0.8518

Network in Network 
  epoch         loss     accuracy
------------------------------------
      0       2.3043       0.1000
     10       0.9792       0.6479
     20       0.7110       0.7556
     30       0.6209       0.7894
     40       0.5326       0.8256
     50       0.4895       0.8409
     60       0.4733       0.8502
     70       0.4140       0.8757
     80       0.4179       0.8762
     90       0.4243       0.8774
    100       0.4330       0.8774
    110       0.4405       0.8754
    120       0.4286       0.8776
    130       0.4343       0.8784
    140       0.4365       0.8795
    150       0.4366       0.8799

Network in Network + Batch Normalization
  epoch         loss     accuracy
------------------------------------
      0       2.3026       0.1077
     10       0.9656       0.7016
     20       0.5713       0.8111
     30       0.6258       0.8084
     40       0.5318       0.8319
     50       0.4388       0.8609
     60       0.4467       0.8564
     70       0.3472       0.8939
     80       0.3520       0.8949
     90       0.3512       0.8943
    100       0.3667       0.8931
    110       0.3506       0.8975
    120       0.3534       0.8952
    130       0.3545       0.8958
    140       0.3569       0.8955
    150       0.3548       0.8969

全体的に精度が良くなっていることが分かった。
accuracyの飽和するタイミングを見ると若干学習速度が速くなっていそうである。

正則化に関して、conv 2layers + FC 2layersの方は明らかにtrainlossとtestlossの差が小さくなったのでその効果が確認できた。
NINに関してはlossの差が小さくなならなかったが、lossが全体的に小さくなった。


Batch Normalizationを使用するにあたって、batch sizeの影響が大きくなると考えsizeを変えて比較した。
また、大きな学習率に対しても発散や消失などが抑えられるとの記載があるのでその検証を行った。

batch size

batch sizeの比較に関してはconv 2layers + FC 2layersを用いてbatch sizeを50から200に変更した。batch size200の結果は以下である。

conv 2layers + FC 2layers + batchsize 200
  epoch         loss     accuracy
------------------------------------
      0       2.2855       0.1444
     10       0.7906       0.7233
     20       0.6868       0.7701
     30       0.6466       0.7865
     40       0.5614       0.8101
     50       0.5492       0.8177
     60       0.6552       0.7886
     70       0.4672       0.8422
     80       0.4665       0.8438
     90       0.4794       0.8429
    100       0.4779       0.8421

少し精度が下がったが、epoch 60までのaccuracyのブレが若干大きいのでこのデータだけでは何とも言い難い。
正則化効果もそれほど差は無さそうなのでbatchの分布の偏りが50と200ではstepを重ねれば無視できるレベルなのだろうか。
BN適用においてbatch sizeは出来るだけ高い精度が欲しいときに最後に行うような微調整パラメータとなるかと思う。

学習率設定

大きな学習率の検証に関しては、学習率に対する発散やactivate消失の恐れが大きいNINで行った。
学習率初期値を1.0とし、20epochごとに0.1倍にした(学習時間が非常に長いため50epochまで)。

Network in Network + init lr1.0
  epoch         loss     accuracy
------------------------------------
      0       2.3032       0.1049
      5       0.8824       0.7008
     10       0.6091       0.8026
     15       0.5920       0.8108
     20       0.4943       0.8360
     25       0.3673       0.8798
     30       0.3637       0.8775
     35       0.3586       0.8842
     40       0.3634       0.8834
     45       0.3418       0.8875
     50       0.3395       0.8894

高い学習率においても、学習が停滞することがなく順調に進んだ。
精度はBN適用init lr 0.1の時と比べてわずかに落ちているが、調整すればBN適用時の精度を維持したままstep数に対して学習速度を速めることも出来そうである。
BNなしのbase NINに対して精度だけで比較するとかなりの学習速度アップである。
とはいえ、step数7%程度でほぼ同じ精度を達成しようとすると困難が伴うと思うが。


NINのような比較的深いネットワークになるとBNを挿入するとstepごとの学習時間が長くなるので、実時間に対する学習速度を考えるならばその効果は減ってしまう。
しかし単に精度も向上するのでBNを導入する価値はあると思う。