Haruskah saya mengambil elemen acak untuk keturunan gradien mini-batch?

9

Ketika menerapkan gradient descent mini-batch untuk jaringan saraf, apakah penting untuk mengambil elemen acak di setiap mini-batch? Atau apakah cukup dengan mengocok elemen di awal pelatihan satu kali?

(Saya juga tertarik pada sumber yang jelas mengatakan apa yang mereka lakukan.)

Martin Thoma
sumber

Jawaban:

7

Seharusnya cukup untuk mengocok elemen-elemen di awal pelatihan dan kemudian membacanya secara berurutan. Ini benar-benar mencapai tujuan yang sama dengan mengambil elemen acak setiap waktu, yaitu untuk memecah segala jenis struktur yang telah ditentukan yang mungkin ada dalam dataset asli Anda (misalnya semua positif di awal, gambar berurutan, dll).

Sementara itu akan bekerja untuk mengambil elemen acak setiap kali, operasi ini biasanya tidak optimal dari segi kinerja. Kumpulan data biasanya besar dan tidak disimpan dalam memori Anda dengan akses acak cepat, melainkan dalam HDD lambat Anda. Ini berarti membaca berurutan adalah satu-satunya pilihan yang Anda miliki untuk kinerja yang baik.

Caffe misalnya menggunakan LevelDB, yang tidak mendukung pencarian acak yang efisien. Lihat https://github.com/BVLC/caffe/issues/1087 , yang menegaskan bahwa dataset dilatih dengan gambar yang selalu dalam urutan yang sama.

Bentrokan
sumber
4
Saya ingin menambahkan ini mungkin bermanfaat untuk merombak data setelah setiap iterasi penuh dari dataset untuk menghasilkan min-batch baru pada iterasi lebih lanjut.
CatsLoveJazz