ほろ酔い開発日誌

有意義な技術的Tipsを共有出来たら嬉しいです。Ruby、Railsが好きです。Web開発全般(Rails多め、フロント、サーバー、インフラ)、データ分析、機械学習あたりの記事が中心になる予定です。

Deep Learningにおけるバッチサイズと学習率をどう決めるか

f:id:seishin55:20190509181242j:plain

Deep Learningにおいてパラメータを決めるのは面倒くさいです。バッチサイズと学習率もその内の2つです。何かモデルを実装するときは既存研究の論文のバッチサイズと学習率と同じものを使うのが楽ですが、データが変わるだけでも調整が必要になったり、モデル構造を変更して調整が必要になったりと自分で考えないといけない場面が避けれるわけではなく、ある程度の指針が必要です。バッチサイズと学習率は関係性が強いようなので、両者についてまとめておきます。

バッチサイズの学習に与える影響

以下のICLR2017の論文によると、バッチサイズを大きくすると汎化性能が落ちたということが述べられています。この論文では実験的にそれを確かめています。原因としては、バッチサイズが上がると学習がsharp minimumに収束してしまうからと考察されています。バッチサイズが小さい場合に分散が大きくなることが正則化のようにプラスの影響を与えているのでしょう。

arxiv.org

参考:

stats.stackexchange.com

バッチサイズと学習率の関係性

では、バッチサイズをとにかく小さくする必要があるのかというとそういうわけでもないようです。以下のように学習率に対して最適なバッチサイズがあることが示されています。しかも、その関係性は線形になっているのも面白いところです。

f:id:seishin55:20190509175116p:plain

つまり、単純にバッチサイズを小さくするのではなく、その学習率の中で適度なバッチサイズにするということが大切だということになります。グラフから見るに特定の学習率での精度はバッチサイズに対してすぐに最大値をむかえ、その後単調減少していきます。バッチサイズが大きくなると精度が落ちるのはこの単調減少の部分に当てはまっているのでしょう。

www.slideshare.net

論文:

https://arxiv.org/pdf/1710.06451.pdf

どのようにバッチサイズと学習率を決めるか

結局、適度なバッチサイズと学習率を考えるという感じになってしまうので、まずは調整が既に行われている既存の論文を参照するのがやっぱり楽だなという気がします。ただし、バッチサイズの数を大きくしても、学習率を線形に大きくすれば精度は落ちないということになるので、学習効率も考えて、バッチサイズをできるだけ大きくとり、それに合わせた学習率を設定することが、学習効率まで考えると適切だと思いました。もし、論文実装のバッチサイズを上げるときは学習率もその分大きくする必要があります。

おまけ

  • 画像系のモデルを扱ってきた経験的には、そこそこ大きなモデルを扱うときはメモリの関係でどうせバッチサイズ8、16(、32)とかにせざるを得ないので あんまりバッチサイズのバリエーションはうまれないですね。

  • 物体認識のモデルでバッチサイズ4でやったものを8に変えて回したら精度下がりました。単純なクラス分類だけではなく関係しそうな気がします。

  • 紹介した論文はDeep Learning全てのモデルに当てはまることを保証しているわけではなさそうなのでご注意を。