Saat melatih jaringan saraf, apa bedanya untuk mengatur:
- ukuran batch ke dan jumlah iterasi ke b
- vs. ukuran batch ke dan jumlah iterasi ke d
di mana ?
Dengan kata lain, dengan asumsi bahwa kita melatih jaringan saraf dengan jumlah contoh pelatihan yang sama, bagaimana cara mengatur ukuran batch yang optimal dan jumlah iterasi? (di mana ukuran batch * jumlah iterasi = jumlah contoh pelatihan yang ditunjukkan ke jaringan saraf, dengan contoh pelatihan yang sama berpotensi ditampilkan beberapa kali)
Saya sadar bahwa semakin tinggi ukuran batch, semakin banyak ruang memori yang dibutuhkan, dan sering kali membuat komputasi lebih cepat. Tetapi dalam hal kinerja jaringan yang terlatih, apa bedanya?
neural-networks
train
Franck Dernoncourt
sumber
sumber
Jawaban:
Dari Nitish Shirish Keskar, Dheevatsa Mudigere, Jorge Nocedal, Mikhail Smelyanskiy, Ping Tak Peter Tang. Pelatihan Batch Besar untuk Pembelajaran Mendalam: Kesenjangan Generalisasi dan Sharp Minima. https://arxiv.org/abs/1609.04836 :
Juga, beberapa wawasan yang bagus dari Ian Goodfellow menjawab mengapa tidak menggunakan seluruh rangkaian pelatihan untuk menghitung gradien? di Quora:
Terkait: Penurunan gradien batch versus penurunan gradien stokastik
sumber
Saya berasumsi Anda sedang berbicara tentang mengurangi ukuran batch dalam algoritma gradien keturunan stochastic gradient batch mini dan membandingkannya dengan ukuran batch yang lebih besar yang membutuhkan iterasi yang lebih sedikit.
Andrew Ng. memberikan diskusi yang baik tentang hal ini dan beberapa visual di kelas coursera online-nya di ML dan jaringan saraf. Jadi sisa dari posting ini sebagian besar adalah regurgitasi ajarannya dari kelas itu.
Mari kita ambil dua ekstrem, di satu sisi setiap langkah gradient descent menggunakan seluruh dataset. Anda menghitung gradien untuk setiap sampel. Dalam hal ini Anda tahu persis yang terbaik langsung menuju minimum lokal. Anda tidak membuang waktu untuk pergi ke arah yang salah. Jadi dalam hal jumlah langkah gradient descent, Anda akan sampai di sana dalam waktu paling sedikit.
Tentu saja menghitung gradien di seluruh dataset mahal. Jadi sekarang kita pergi ke ekstrim lain. Ukuran batch hanya 1 sampel. Dalam hal ini, gradien sampel tersebut dapat membawa Anda sepenuhnya ke arah yang salah. Tapi hei, biaya komputasi satu gradien cukup sepele. Ketika Anda mengambil langkah-langkah sehubungan dengan hanya satu sampel Anda "berkeliaran" sedikit, tetapi rata-rata Anda menuju ke minimum lokal yang sama masuk akalnya seperti dalam keturunan gradien batch penuh.
Ini mungkin saat untuk menunjukkan bahwa saya telah melihat beberapa literatur yang menunjukkan bahwa mungkin ini memantul sekitar 1-sampel keturunan gradien stochastic mungkin dapat membantu Anda bangkit dari minimum lokal yang mode batch penuh tidak akan menghindari, tapi itu masih bisa diperdebatkan. Beberapa jawaban baik lainnya di sini menjawab pertanyaan ini lebih langsung daripada yang saya miliki.
Dalam hal kekuatan komputasi, sementara proses GD stokastik sampel tunggal mengambil banyak iterasi lebih banyak, Anda akhirnya sampai di sana dengan biaya lebih murah daripada mode batch penuh, "biasanya." Ini adalah bagaimana Andrew Ng mengatakannya.
Sekarang mari kita temukan jalan tengah yang Anda tanyakan. Kita mungkin menyadari bahwa perpustakaan BLAS modern membuat komputasi vektor matematika cukup efisien, sehingga menghitung 10 atau 100 sampel sekaligus, dengan anggapan Anda telah membuat vektor kode Anda dengan benar, hampir tidak akan lebih berfungsi daripada menghitung 1 sampel (Anda mendapatkan efisiensi panggilan memori serta trik komputasi yang dibangun ke dalam perpustakaan matematika yang paling efisien). Dan rata-rata lebih dari 10, 100, 1000 sampel akan menghasilkan gradien yang lebih masuk akal dari gradien mode batch penuh. Jadi langkah-langkah kami sekarang lebih akurat, artinya kita perlu lebih sedikit dari mereka untuk bertemu, dan dengan biaya yang hanya sedikit lebih tinggi daripada GD sampel tunggal.
Mengoptimalkan ukuran tepat dari mini-batch yang harus Anda gunakan umumnya diserahkan pada coba-coba. Jalankan beberapa tes pada sampel dataset dengan angka mulai dari katakan puluhan hingga beberapa ribu dan lihat konvergen mana yang tercepat, lalu lakukan itu. Ukuran batch dalam rentang tersebut tampaknya cukup umum di seluruh literatur. Dan jika data Anda benar-benar IID, maka teorema batas pusat pada variasi proses acak juga akan menunjukkan bahwa rentang tersebut merupakan perkiraan wajar dari gradien penuh.
Memutuskan kapan tepatnya menghentikan iterasi biasanya dilakukan dengan memonitor kesalahan generalisasi Anda terhadap set validasi yang tidak terlatih dan memilih titik di mana kesalahan validasi berada pada titik terendah. Pelatihan untuk terlalu banyak iterasi pada akhirnya akan menyebabkan overfitting, di mana titik kesalahan Anda pada set validasi Anda akan mulai naik. Ketika Anda melihat ini terjadi kembali dan berhenti pada titik optimal.
sumber
TL; DR: Ukuran mini-batch yang terlalu besar biasanya menyebabkan akurasi yang lebih rendah !
Bagi yang berminat, inilah penjelasannya.
Ada dua pengertian kecepatan:
Kecepatan komputasi hanyalah kecepatan dalam melakukan perhitungan numerik dalam perangkat keras. Seperti yang Anda katakan, biasanya lebih tinggi dengan ukuran mini-batch yang lebih besar. Itu karena perpustakaan aljabar linier menggunakan vektorisasi untuk operasi vektor dan matriks untuk mempercepatnya, dengan mengorbankan penggunaan lebih banyak memori. Keuntungan bisa signifikan hingga titik tertentu. Dari pengalaman saya, ada satu titik setelah itu hanya ada sedikit keuntungan dalam kecepatan, jika ada. Intinya tergantung pada kumpulan data, perangkat keras, dan perpustakaan yang digunakan untuk perhitungan numerik (di bawah tenda).
Tapi, jangan lupa bahwa ada juga gagasan lain tentang kecepatan, yang memberitahu kita seberapa cepat algoritma kita bertemu.
Pertama, apa artinya bagi algoritma kami untuk bertemu? Nah, terserah pada kita untuk menentukan dan memutuskan kapan kita puas dengan akurasi, atau kesalahan, yang kita dapatkan, dihitung pada set validasi. Kita dapat mendefinisikannya terlebih dahulu dan menunggu algoritma sampai pada titik itu, atau kita dapat memantau proses pelatihan dan memutuskan untuk menghentikannya ketika kesalahan validasi mulai meningkat secara signifikan (model mulai menyesuaikan dengan set data). Kami benar-benar tidak harus menghentikannya segera, saat pertama kesalahan mulai meningkat, jika kami bekerja dengan batch mini, karena kami menggunakan Stochastic Gradient Descent, SGD. Dalam kasus Gradient Descent (batch penuh), setelah masing-masing zaman, algoritme akan menetap dalam minimum, baik itu lokal atau global. SGD tidak pernah benar-benar puas dalam minimum. Itu terus berosilasi di sekitarnya. Itu bisa berlangsung tanpa batas,
Sekarang, setelah semua teori itu, ada "tangkapan" yang perlu kita perhatikan. Saat menggunakan ukuran batch yang lebih kecil, perhitungan kesalahan memiliki lebih banyak noise daripada ketika kami menggunakan ukuran batch yang lebih besar. Orang akan berkata, yah, itu buruk, bukan? Masalahnya, noise itu dapat membantu algoritma melompat keluar dari minimum lokal yang buruk dan memiliki lebih banyak peluang untuk menemukan baik minimum lokal yang lebih baik, atau semoga minimum global.
Dengan demikian, jika kita dapat menemukan solusi yang lebih baik lebih cepat dengan menggunakan ukuran batch yang lebih kecil daripada yang lebih besar, hanya dengan bantuan suara "yang tidak diinginkan", kita dapat menyesuaikan antara total waktu yang dibutuhkan untuk algoritma kami untuk menemukan yang memuaskan solusi dan akurasi yang lebih tinggi.
Yang ingin saya katakan adalah, untuk akurasi yang diberikan (atau kesalahan), ukuran batch yang lebih kecil dapat menyebabkan waktu pelatihan total yang lebih pendek, tidak lagi, seperti yang diyakini banyak orang.
Atau, jika kita memutuskan untuk mempertahankan waktu pelatihan yang sama seperti sebelumnya, kita mungkin mendapatkan akurasi yang sedikit lebih tinggi dengan ukuran batch yang lebih kecil, dan kemungkinan besar kita akan melakukannya, terutama jika kita telah memilih tingkat pembelajaran kita dengan tepat.
Jika Anda punya waktu, periksa makalah ini: Evaluasi sistematis kemajuan CNN di ImageNet Terutama, periksa "3,7. Ukuran batch dan tingkat pembelajaran", dan Gambar 8. Anda akan melihat bahwa ukuran mini-batch besar menyebabkan akurasi yang lebih buruk , bahkan jika tuning tingkat belajar ke heuristik.
Secara umum, ukuran kumpulan 32 adalah titik awal yang baik, dan Anda juga harus mencoba dengan 64, 128, dan 256. Nilai-nilai lain (lebih rendah atau lebih tinggi) mungkin baik untuk beberapa set data, tetapi kisaran yang diberikan umumnya yang terbaik untuk mulai bereksperimen dengan. Meskipun, di bawah 32, itu mungkin terlalu lambat karena kecepatan komputasi secara signifikan lebih rendah, karena tidak mengeksploitasi vektorisasi sepenuhnya. Jika Anda mendapatkan kesalahan "kehabisan memori", Anda harus mencoba mengurangi ukuran mini-batch.
Jadi, ini bukan hanya tentang menggunakan ukuran mini-batch terbesar yang sesuai dengan memori.
Untuk menyimpulkan, dan menjawab pertanyaan Anda, ukuran mini-batch yang lebih kecil (tidak terlalu kecil) biasanya mengarah tidak hanya ke sejumlah kecil iterasi dari algoritma pelatihan, dari ukuran batch yang besar, tetapi juga ke akurasi keseluruhan yang lebih tinggi, yaitu, jaringan saraf yang berkinerja lebih baik, dalam jumlah waktu pelatihan yang sama, atau kurang.
Jangan lupa bahwa kebisingan yang lebih tinggi dapat membantunya melompat keluar dari minimum lokal yang buruk, daripada membiarkannya terjebak di dalamnya.
sumber
Saya menambahkan jawaban lain untuk pertanyaan ini untuk referensi makalah konferensi ICLR (2018) baru dari Google yang hampir secara langsung membahas pertanyaan ini.
Judul: Jangan Membusuk Tingkat Pembelajaran, Tingkatkan Ukuran Batch
https://arxiv.org/abs/1711.00489
Abstrak dari makalah di atas disalin di sini:
sumber
Saya menunjukkan beberapa pengalaman empiris di sini . Saya melakukan percobaan dengan ukuran batch 4 dan ukuran batch 4096. Ukuran 4096 melakukan backpropagations 1024x lebih sedikit. Jadi intuisi saya adalah bahwa batch yang lebih besar melakukan lebih sedikit dan langkah-langkah pencarian kasar untuk solusi optimal, dan dengan konstruksi akan lebih kecil kemungkinannya untuk berkumpul pada solusi optimal.
sumber