こんにちは。
今回は、機械学習をやってるならば必ず出会う
- mini-batch
- epoch
- iteration
- SGD
あたりを中心に説明していこうと思います。
まずはズバッと定義をリストアップします。
- mini-batchとはデータのサブセットのこと
- epochとは全データを使い切った回数のこと
- iterationとは学習させる回数のこと
- SGDとは確率的最急降下法のこと
これではおそらくまだわかりずらい、簡単なところから潰していこう。みなさん最急降下法は知っていますよね?おそらくこの記事を読んでいるということは何も気にせずtest_train_splitくらいだけして勾配法を使っているんだと思います。これはつまり、
各iterationにおいて全データを使って学習させている
ということになります。このように全データを使って毎度学習を行うことを
と言います。僕も基本これです。しかし、計算コストなどを考えるとこれは好ましくないなあ、というのは自明かと思います。よって、素朴なアイデアとして、一部のデータのみを使って学習させようという発想が生まれます、この考えに基づいて行う勾配法を
- Mini-batch Gradient Descent
と言います。つまり、データの部分集合をミニバッチと言います。このミニバッチの大きさを
とします、
の時、有名な
- Stochastic Gradient Descent
と言います。で、みんな持つであろう疑問はメリットデメリットとバッチサイズですよね。計算量のメリットはもう話しました。ではデメリットについて触れましょう。例えば、各ミニバッチで分布が全く異なると良くないのは明らかでしょう。他にはこれはサイズの問題ですがミニバッチのサイズが小さすぎるとこれは統計量として十分なのか?という問題が発生するかもしれません。ちなみに、ミニバッチにおける更新式は例えば次のようにします。
はミニバッチサイズです。
では、お待ちかね?のミニバッチサイズです。よく使われるサイズは次の通り
32, 64, 128, 256, 512
気づきましたでしょうか?2のべき乗ですね、どうして2のべき乗かはわかりませんが計算上都合がいいのでしょうおそらく。で、これらの候補からどうやってベストなミニバッチを決定するか、という問いに対する答えは、、ないです。試行錯誤するしかありません。
では、最後に
- Normal GD
- SGD
- Mini-batch GD
の振る舞いを見てみる前に、予想しましょう。
ベーシックなGDは全データつまりバッチを使って勾配を計算し重みを更新します。SGDはmini-batch=1を用いて更新します。Mini-batch GDはある程度のデータを束を用いて更新します。よってここから予想されることは勾配の向きの不安定さです。つまり、全データを用いてない限り勾配の方向が適切な方向から逸れたりする可能性は明らかでしょう。ではこれを念頭に置いて、
上でも述べましたが、mini-batchのサイズは僕たちが試行錯誤の上で決めますが、基準としては2のべき乗です。
最近、ParrotSecurityをraspberry piを買って入れようか悩んでいます、でわ。
READMORE