深層学習 ≒ DNNをSGDでデータに対して最適化する この手順を好きなだけ繰り返す 1. データをシャッフルしてミニバッチに分割する 2. 分割したミニバッチごとに、モデルに対してまとめて a. 前向き計算をして推論結果を出す b. 推論結果と正解データのズレ(距離)を計算 c. ズレをもとに後ろ向き計算(backpropをする) d. 後ろ向き計算で得られた勾配の平均を計算 e. 勾配をモデルのパラメータに反映
並列化して速くなる、は自明か? • GPUあたりのバッチサイズはそんな に変わらない • GPU数を32倍にすると、全体のバッ チサイズも32倍 • (2017年までは)バッチサイズをあま り大きくすると汎化性能にペナルティ があることが分かっていた • 頑張って512とか Keskar et al., “On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima”, arXiv:1609.04836 [cs.LG]
並列化するテクニックが上手くいく場合がある Linear Scaling Rule: • バッチサイズを k 倍にしたいときは は学習率も k 倍すればよい バッチサイズが大きくなるとSharp minimaに陥ってぬけにくくなるので、そ の分だけ学習率を大きくすればよい ※他にもさまざまなテクニックがある Goyal et al., “Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour”, arXiv:1706.02677 [cs.CV]