Keturunan Gradien Standar akan menghitung gradien untuk seluruh dataset pelatihan.
for i in range(nb_epochs):
params_grad = evaluate_gradient(loss_function, data, params)
params = params - learning_rate * params_grad
Untuk jumlah zaman yang ditentukan sebelumnya, pertama-tama kita menghitung vektor gradien weights_grad dari fungsi kerugian untuk seluruh dataset menggunakan parameter vektor parameter kami.
Stochastic Gradient Descent secara kontras melakukan pembaruan parameter untuk setiap contoh pelatihan x (i) dan label y (i).
for i in range(nb_epochs):
np.random.shuffle(data)
for example in data:
params_grad = evaluate_gradient(loss_function, example, params)
params = params - learning_rate * params_grad
SGD dikatakan jauh lebih cepat. Namun, saya tidak mengerti bagaimana bisa jauh lebih cepat jika kita masih memiliki perulangan di semua titik data. Apakah perhitungan gradien dalam GD jauh lebih lambat daripada perhitungan GD untuk setiap titik data secara terpisah?
Kode berasal dari sini .
Jawaban:
Jawaban singkat:
Jawaban panjang:
Notasi saya mengikuti kursus pembelajaran mesin Andrew NG Coursera. Jika Anda tidak terbiasa dengan itu, Anda dapat meninjau seri ceramah di sini .
Mari kita asumsikan regresi pada kuadrat kerugian, fungsi biayanya
dan gradiennya adalah
untuk gradient decent (GD), kami memperbarui parameter dengan
Untuk gradien stokastik yang layak kita hilangkan jumlah dan1 / m konstan, tetapi dapatkan gradien untuk titik data saat ini x( i ), y( i ) , di mana muncul penghematan waktu.
Inilah mengapa kami menghemat waktu:
Misalkan kita memiliki 1 miliar titik data.
Dalam GD, untuk memperbarui parameter sekali, kita perlu memiliki gradien (tepat). Ini membutuhkan jumlah 1 miliar data poin ini untuk melakukan 1 pembaruan.
Dalam SGD, kita dapat menganggapnya sebagai mencoba untuk mendapatkan gradien yang diperkirakan alih-alih gradien yang tepat . Perkiraannya datang dari satu titik data (atau beberapa titik data yang disebut kumpulan mini). Karenanya, dalam SGD, kami dapat memperbarui parameter dengan sangat cepat. Selain itu, jika kita "mengulangi" semua data (disebut satu zaman), sebenarnya kita memiliki 1 miliar pembaruan.
Kuncinya adalah, dalam SGD Anda tidak perlu memiliki 1 miliar iterations / update, tetapi iterations / update, katakanlah 1 juta, dan Anda akan memiliki model "cukup baik" untuk digunakan.
Saya menulis kode untuk mendemonstrasikan ide tersebut. Pertama-tama kita memecahkan sistem linear dengan persamaan normal, kemudian menyelesaikannya dengan SGD. Kemudian kami membandingkan hasilnya dalam hal nilai parameter dan nilai fungsi tujuan akhir. Untuk memvisualisasikannya nanti, kita akan memiliki 2 parameter untuk disesuaikan.
Hasil:
Catatan, meskipun parameternya tidak terlalu dekat, nilai kerugiannya adalah124.1343 dan 123.0355 yang sangat dekat.
Berikut ini adalah nilai fungsi biaya atas iterasi, kita dapat melihatnya secara efektif dapat mengurangi kerugian, yang menggambarkan ide: kita dapat menggunakan subset data untuk memperkirakan gradien dan mendapatkan hasil "cukup baik".
Sekarang mari kita periksa upaya komputasi antara dua pendekatan. Dalam percobaan, kami punya1000 titik data, menggunakan SD, mengevaluasi gradien sekali perlu menjumlahkannya data. TETAPI dalam SGD, 300 iterasi (perhatikan, tidak 1000 iterasi.) Ini adalah penghematan komputasi.
sq_loss_gr_approx
fungsinya hanya menjumlahkan 1 titik data, dan secara keseluruhan kita lihat, algoritma kurang dari satusumber