※現在、ブログ記事を移行中のため一部表示が崩れる場合がございます。
順次修正対応にあたっておりますので何卒ご了承いただけますよう、お願い致します。

GPU:MNISTでミニバッチを大きくしてみた


2017年 04月 04日

せっかく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ある。
学習用データの数を変更してみようと思うが、どうやらコマンドパラメータからはできないらしい。
さて、どうしよう。