Saya akan melatih jaringan LSTM besar dengan 2-3 juta artikel dan saya berjuang dengan Kesalahan Memori (saya menggunakan AWS EC2 g2x2large).
Saya menemukan bahwa salah satu solusinya adalah dengan mengurangi batch_size
. Namun, saya tidak yakin apakah parameter ini hanya terkait dengan masalah efisiensi memori atau apakah akan mempengaruhi hasil saya. Sebagai soal fakta, saya juga memperhatikan bahwa batch_size
digunakan dalam contoh biasanya sebagai kekuatan dua, yang saya juga tidak mengerti.
Saya tidak keberatan jika jaringan saya membutuhkan waktu lebih lama untuk dilatih, tetapi saya ingin tahu apakah mengurangi batch_size
akan menurunkan kualitas prediksi saya.
Terima kasih.
deep-learning
keras
hipoglucido
sumber
sumber
Jawaban:
Setelah satu setengah tahun, saya kembali ke jawaban saya karena jawaban saya sebelumnya salah.
Ukuran batch mempengaruhi pembelajaran secara signifikan. Apa yang terjadi ketika Anda menempatkan batch melalui jaringan Anda adalah bahwa Anda rata-rata gradien. Konsepnya adalah bahwa jika ukuran bets Anda cukup besar, ini akan memberikan perkiraan yang cukup stabil tentang bagaimana gradien dari dataset lengkap. Dengan mengambil sampel dari dataset Anda, Anda memperkirakan gradien sambil mengurangi biaya komputasi secara signifikan. Semakin rendah Anda pergi, semakin rendah perkiraan Anda akan, namun dalam beberapa kasus gradien yang bising ini benar-benar dapat membantu melepaskan diri dari minimum lokal. Ketika terlalu rendah, bobot jaringan Anda hanya bisa melompat-lompat jika data Anda berisik dan mungkin tidak dapat belajar atau konvergen sangat lambat, sehingga berdampak negatif terhadap total waktu komputasi.
Keuntungan lain dari batching adalah untuk komputasi GPU, GPU sangat baik dalam memparalelkan perhitungan yang terjadi dalam jaringan saraf jika bagian dari komputasi adalah sama (misalnya, perkalian matriks berulang atas matriks bobot yang sama dengan jaringan Anda). Ini berarti bahwa ukuran batch 16 akan memakan waktu kurang dari dua kali jumlah ukuran batch 8.
Jika Anda membutuhkan ukuran batch yang lebih besar tetapi itu tidak sesuai dengan GPU Anda, Anda bisa memberi makan batch kecil, menyimpan perkiraan gradien dan memberi makan satu atau lebih batch, dan kemudian melakukan pembaruan berat. Dengan cara ini Anda mendapatkan gradien yang lebih stabil karena Anda meningkatkan ukuran batch virtual Anda.
SALAH, JAWABAN LAMA: [[[Tidak, ukuran rata-rata hanya mempengaruhi kecepatan belajar Anda, bukan kualitas belajar. Batch_size juga tidak perlu memiliki kekuatan 2, meskipun saya mengerti bahwa paket-paket tertentu hanya membolehkan kekuatan 2. Anda harus mencoba untuk mendapatkan batch_size Anda semaksimal mungkin yang masih sesuai dengan memori GPU Anda untuk mendapatkan kecepatan maksimum yang dimungkinkan. .]]]]
sumber
Saya merasa jawaban yang diterima mungkin salah. Ada varian dalam Gradient Descent Algorithms .
Vanilla Gradient Descent : Di sini Gradient sedang dihitung pada semua titik data pada satu tembakan dan rata-rata diambil. Oleh karena itu kami memiliki versi gradien yang lebih halus membutuhkan waktu lebih lama untuk dipelajari.
Stochastic Gradient Descent : Di sini satu titik data pada satu waktu maka gradiennya agresif (gradien berisik) maka akan ada banyak osilasi (kami menggunakan parameter Momentum - misalnya Nesterov untuk mengontrol ini). Jadi ada kemungkinan osilasi Anda dapat membuat algoritma tidak mencapai minimum lokal. (Berbeda).
Mini-Batch Gradient Descent : Yang mengambil keistimewaan dari kedua yang sebelumnya rata-rata gradien dari batch kecil. Karenanya tidak terlalu agresif seperti SGD dan memungkinkan Pembelajaran Online yang tidak diizinkan oleh Vanilla GD.
Semakin kecil Mini-Batch, semakin baik kinerja model Anda (tidak selalu) dan tentu saja ini berkaitan dengan zaman Anda yang terlalu cepat untuk dipelajari. Jika Anda berlatih pada dataset besar Anda ingin konvergensi lebih cepat dengan kinerja yang baik maka kami memilih Batch-GD.
SGD memiliki parameter pembelajaran tetap, maka kami memulai Pengoptimal Adaptif lainnya seperti Adam, AdaDelta, RMS Prop, dll yang mengubah parameter pembelajaran berdasarkan riwayat Gradien.
sumber
Anehnya, saya menemukan bahwa ukuran batch yang lebih besar dengan keras memerlukan lebih banyak zaman untuk bertemu.
Sebagai contoh, output dari script ini didasarkan pada keras' tes integrasi adalah
Terkait
BatchNormalization
, yang mempengaruhi hasil.Sunting: sebagian besar waktu, peningkatan
batch_size
diinginkan untuk mempercepat perhitungan, tetapi ada cara lain yang lebih sederhana untuk melakukan ini, seperti menggunakan tipe data dari jejak yang lebih kecil melaluidtype
argumen, apakah dalam keras atau tensorflow , misalnyafloat32
alih-alihfloat64
sumber