せっかくGPUが使えるようになったので、その効果ができるだけ出るようにしてみたいものだ。
ということで、とりあえずミニバッチの数をデフォルトの100から1000に増やしてみた。
Chainer$ python train_mnist.py -g 0 -b 1000
GPU: 0
# unit: 1000
# Minibatch-size: 1000
# epoch: 20
epoch main/loss validation/main/loss main/accuracy validation/main/accuracy elapsed_time
1 0.398479 0.165815 0.8895 0.9507 0.972913
2 0.130305 0.103915 0.9622 0.9661 1.82951
3 0.0807383 0.0763431 0.976533 0.9764 2.68751
・・・・・・・・・・・・・・・ 中 略 ・・・・・・・・・・・・・・・
18 0.000367914 0.0654017 1 0.9838 15.6677
19 0.000316801 0.0666274 1 0.984 16.5294
20 0.000283742 0.0675182 1 0.9839 17.3905
Chainer$
実行時間は、17.39秒であり、b=100のとき(49秒)と比べて約2.8倍高速になった。
まとめて処理する単位を増やすと、全体の計算量は変わらないはずなのだが、かなり効率的になるようだ。
学習データ自体を使ったテスト(main/accuracy)は正解率100%になっているが、テストデータでは98.4%程度であり、デフォルトの場合との違いはほとんどない。
バッチサイズの変更で、GPUのメモリ使用量は、こんな感じで増加していった。
-b 100 (デフォルト)
| 0 16937 C python 209MiB |
-b 1000
| 0 16917 C python 317MiB |
-b 2000
| 0 16998 C python 339MiB |
-b 5000
| 0 17031 C python 493MiB |
-b 10000
| 0 17343 C python 639MiB |
ミニバッチのサイズを大きくするとより高速になっていくと言いたいところだが、それは100を1000にした時には効果的だったのだが、10000にしても、速度はほとんど上昇しない。
Chainer$ python train_mnist.py -g 0 -b 10000
GPU: 0
# unit: 1000
# Minibatch-size: 10000
# epoch: 20
epoch main/loss validation/main/loss main/accuracy validation/main/accuracy elapsed_time
1 1.37287 0.512147 0.660883 0.8614 0.905861
2 0.437023 0.361621 0.87135 0.901 1.69545
3 0.335709 0.294568 0.905283 0.9191 2.50435
・・・・・・・・・・・・・・・ 中 略 ・・・・・・・・・・・・・・・
18 0.0516563 0.0811957 0.986567 0.9746 14.6888
19 0.0475925 0.0765162 0.987367 0.9759 15.4938
20 0.0428052 0.074131 0.988917 0.9778 16.29
Chainer$
それよりも、accuracyが少し落ちてきたのがわかる。
ミニバッチ毎に学習が分けて行われるので、どうやら適度なサイズで行わないと、accuracyが落ちるようだ。
速度と精度のバランスを考えてミニバッチのサイズは決定しないといけないらしい。
ところで、MNISTデータセットは、学習用データが60000、テストデータが10000ある。
学習用データの数を変更してみようと思うが、どうやらコマンドパラメータからはできないらしい。
さて、どうしよう。