Apakah batch_size di Keras memiliki efek pada kualitas hasil?

38

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_sizedigunakan 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_sizeakan menurunkan kualitas prediksi saya.

Terima kasih.

hipoglucido
sumber
Pertanyaan ini tidak spesifik untuk keras. Saya pikir konsesus umum adalah bahwa ukuran sampel yang lebih kecil menyatu lebih lambat tetapi cenderung tidak terjebak dalam minima lokal
Alex
Saya telah melihat kasus di mana ukuran bets yang terlalu besar dapat mencegah konvergensi bahkan dengan jumlah pelatihan yang sama.
Curtis White

Jawaban:

43

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. .]]]]

Jan van der Vegt
sumber
Saya tidak mampu membayar 32 tetapi saya mampu 16. Namun, saya perhatikan bahwa ini terlalu lambat. Apakah Anda pikir saya harus mencoba beberapa nilai antara 16-32 atau tetap dengan 16?
hipoglucido
Saya akan mencoba dan mengatur waktu beberapa nilai. Setiap zaman harus sekitar waktu yang sama sehingga tidak akan terlalu lama. Coba 17 dulu untuk melihat apakah lebih cepat atau lebih lambat karena saya tertarik pada ini, mengingat bahwa kekuatan 2 ini tergantung pada GPU dan / atau backend dari Keras. Tapi saya pikir hanya mengisinya sampai penuh kemungkinan yang terbaik
Jan van der Vegt
9
Apakah Anda yakin bahwa ukuran kumpulan tidak mempengaruhi kualitas pembelajaran? Saya ingat membaca beberapa blog / makalah (?) Di mana mereka mengatakan bahwa batch yang lebih kecil menghasilkan gradien yang lebih berisik daripada batch yang lebih besar, tetapi noise dapat berguna untuk keluar dari minimas lokal. Tidak yakin apakah / bagaimana ini berlaku untuk LSTM.
stmax
Tidak sepenuhnya yakin, belum memiliki pengalaman yang cukup tapi itu yang saya baca. Saya dapat melihat gradien yang kurang stabil sehingga saya mungkin tidak aktif.
Jan van der Vegt
2
Satu setengah tahun kemudian dan lebih banyak pengetahuan sekarang dan saya setuju. Saya akan mengubah jawaban saya
Jan van der Vegt
11

Saya merasa jawaban yang diterima mungkin salah. Ada varian dalam Gradient Descent Algorithms .

  1. 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.

  2. 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).

  3. 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.

Jil Jung Juk
sumber
3) biasanya disebut minibatch
Alex
@Alex: menambahkan perubahan.
Jil Jung Juk
1
Saya setuju tidak ada aturan tentang parameter ukuran batch. Tetapi pernyataan ini - "Semakin kecil Mini-Batch, semakin baik kinerja model Anda" - bertentangan dengan aturan umum. Anda biasanya ingin memaksimalkan ukuran kumpulan
MonsieurBeilto
4

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

epochs 15   , batch size 16   , layer type Dense: final loss 0.56, seconds 1.46
epochs 15   , batch size 160  , layer type Dense: final loss 1.27, seconds 0.30
epochs 150  , batch size 160  , layer type Dense: final loss 0.55, seconds 1.74

Terkait

Menggunakan ukuran batch yang terlalu besar dapat memiliki efek negatif pada keakuratan jaringan Anda selama pelatihan karena mengurangi stokastik keturunan gradien.

Sunting: sebagian besar waktu, peningkatan batch_sizediinginkan untuk mempercepat perhitungan, tetapi ada cara lain yang lebih sederhana untuk melakukan ini, seperti menggunakan tipe data dari jejak yang lebih kecil melalui dtypeargumen, apakah dalam keras atau tensorflow , misalnya float32alih-alihfloat64

shadi
sumber
Dengan batch yang lebih besar (dan karenanya lebih sedikit per zaman) Anda akan memiliki lebih sedikit pembaruan gradien per zaman. "zaman" hanyalah jargon ML untuk "satu melewati data Anda selama pelatihan". Jika Anda mencoba mempercepat pelatihan, ukur waktu dinding dan abaikan zaman.
Andrew Wagner