N個のサンプルを持つデータセットを使用して、確率的勾配降下回帰アルゴリズムをトレーニングしたいとします。データセットのサイズは固定なので、データをT回再利用します。各反復または「エポック」で、トレーニングセット全体をランダムに並べ替えた後、各トレーニングサンプルを1回だけ使用します。
私の実装はPythonとNumpyに基づいています。したがって、ベクトル演算を使用すると、計算時間を大幅に短縮できます。バッチ勾配降下法のベクトル化された実装を考え出すことは非常に簡単です。ただし、確率的勾配降下法の場合、各エポックですべてのサンプルを反復する外部ループを回避する方法を理解できません。
誰かが確率的勾配降下法のベクトル化された実装を知っていますか?
編集:データセットのサイズが固定されている場合、オンライン勾配降下法を使用する理由を尋ねられました。
[1]から、オンライン勾配降下法は、バッチ勾配降下法よりも経験的コストの最小値まで収束が遅いことがわかります。ただし、一般化のパフォーマンスを測定する予想コストの最小値に速く収束します。これらの理論上の結果が私の特定の問題に及ぼす影響を、相互検証によってテストしたいと思います。ベクトル化された実装がない場合、私のオンライン勾配降下コードはバッチ勾配降下コードよりもはるかに遅くなります。これにより、相互検証プロセスが完了するまでの時間が大幅に増加します。
編集:私は、ffriendからの要求に応じて、オンライン勾配降下法の実装の疑似コードをここに含めます。回帰問題を解決しています。
Method: on-line gradient descent (regression)
Input: X (nxp matrix; each line contains a training sample, represented as a length-p vector), Y (length-n vector; output of the training samples)
Output: A (length-p+1 vector of coefficients)
Initialize coefficients (assign value 0 to all coefficients)
Calculate outputs F
prev_error = inf
error = sum((F-Y)^2)/n
it = 0
while abs(error - prev_error)>ERROR_THRESHOLD and it<=MAX_ITERATIONS:
Randomly shuffle training samples
for each training sample i:
Compute error for training sample i
Update coefficients based on the error above
prev_error = error
Calculate outputs F
error = sum((F-Y)^2)/n
it = it + 1
[1]「大規模オンライン学習」、L。ボトム、Y。ル・カン、NIPS 2003。