Ukuran batch tradeoff vs jumlah iterasi untuk melatih jaringan saraf

222

Saat melatih jaringan saraf, apa bedanya untuk mengatur:

  • ukuran batch ke dan jumlah iterasi ke bSebuahb
  • vs. ukuran batch ke dan jumlah iterasi ke dcd

di mana ?Sebuahb=cd

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?

Franck Dernoncourt
sumber
1
Lihatlah blog ini yang menjelaskan cara memilih ukuran batch yang tepat sambil membandingkan efek dari ukuran batch yang berbeda pada keakuratan dataset Cifar-10.
Teja Sreenivas

Jawaban:

208

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 :

Metode keturunan gradien stokastik dan variannya adalah algoritma pilihan untuk banyak tugas Deep Learning. Metode ini beroperasi dalam rezim batch kecil di mana sebagian kecil dari data pelatihan, biasanya 32-512 poin data, diambil sampelnya untuk menghitung perkiraan gradien. Telah diamati dalam prakteknya bahwa ketika menggunakan batch yang lebih besar ada penurunan yang signifikan dalam kualitas model, yang diukur dengan kemampuannya untuk menggeneralisasi.Ada beberapa upaya untuk menyelidiki penyebab jatuhnya generalisasi dalam rezim batch besar, namun jawaban yang tepat untuk fenomena ini, sampai sekarang tidak diketahui. Dalam makalah ini, kami menyajikan banyak bukti numerik yang mendukung pandangan bahwa metode batch besar cenderung menyatu dengan minimisasi tajam dari fungsi pelatihan dan pengujian - dan bahwa minimum minimal menyebabkan generalisasi yang lebih buruk. Sebaliknya, metode batch kecil secara konsisten menyatu dengan minimizer rata, dan eksperimen kami mendukung pandangan umum bahwa ini disebabkan oleh kebisingan bawaan dalam estimasi gradien. Kami juga membahas beberapa strategi empiris yang membantu metode batch besar menghilangkan kesenjangan generalisasi dan menyimpulkan dengan serangkaian ide penelitian masa depan dan pertanyaan terbuka.

[...]

2f(x)2f(x)

[...]

masukkan deskripsi gambar di sini

Juga, beberapa wawasan yang bagus dari Ian Goodfellow menjawab mengapa tidak menggunakan seluruh rangkaian pelatihan untuk menghitung gradien? di Quora:

Ukuran tingkat pembelajaran sebagian besar dibatasi oleh faktor-faktor seperti seberapa melengkungnya fungsi biaya. Anda dapat menganggap gradient descent sebagai membuat perkiraan linier untuk fungsi biaya, lalu bergerak menuruni bukit di sepanjang perkiraan biaya tersebut. Jika fungsi biaya sangat non-linear (sangat melengkung) maka perkiraannya tidak akan terlalu baik untuk jarak yang sangat jauh, sehingga hanya ukuran langkah kecil yang aman. Anda dapat membaca lebih lanjut tentang ini di Bab 4 dari buku teks pembelajaran dalam, pada perhitungan numerik: http://www.deeplearningbook.org/contents/numerical.html

Ketika Anda meletakkan contoh m dalam minibatch, Anda perlu melakukan perhitungan O (m) dan menggunakan memori O (m), tetapi Anda mengurangi jumlah ketidakpastian dalam gradien dengan faktor hanya O (sqrt (m)). Dengan kata lain, ada pengembalian marjinal yang semakin berkurang untuk menempatkan lebih banyak contoh di minibatch. Anda dapat membaca lebih lanjut tentang ini di Bab 8 buku pelajaran pembelajaran dalam, tentang algoritma pengoptimalan untuk pembelajaran mendalam: http://www.deeplearningbook.org/contents/optimization.html

Juga, jika Anda memikirkannya, bahkan menggunakan seluruh rangkaian pelatihan tidak benar-benar memberi Anda gradien yang sebenarnya. Gradien sebenarnya adalah gradien yang diharapkan dengan ekspektasi yang diambil atas semua contoh yang mungkin, tertimbang oleh distribusi penghasil data. Menggunakan seluruh rangkaian pelatihan hanya menggunakan ukuran minibatch yang sangat besar, di mana ukuran minibatch Anda dibatasi oleh jumlah yang Anda habiskan untuk pengumpulan data, daripada jumlah yang Anda habiskan untuk perhitungan.

Terkait: Penurunan gradien batch versus penurunan gradien stokastik

Franck Dernoncourt
sumber
Karena batch_size hanya membagi set data pelatihan ke dalam batch, apakah masuk akal untuk mengatur ulang dataset (non temporal) untuk memiliki varian yang seragam di semua batch? Melakukannya dapat mengurangi kebutuhan untuk optimasi ukuran bets, yang hanya baik untuk menemukan konvergensi yang lebih cepat. jika demikian, bagaimana hal itu dilakukan? Saya berpikir itu mungkin tidak memberikan minima yang lebih datar. Sangat menghargai panduan rinci.
user12348
@ user12348 Bagaimana Anda mengatur ulang dataset? Bagaimana Anda bisa memperkirakan bahwa dimensi data yang diberikan akan menghasilkan vektor fitur tertentu setelah pelatihan?
Cloud Cho
46

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.

David Parks
sumber
22

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
  • Kecepatan konvergensi suatu algoritma

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.

ivanbgd
sumber
14

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:

Merupakan praktik umum untuk mengurangi tingkat pembelajaran. Di sini kami menunjukkan satu biasanya dapat memperoleh kurva belajar yang sama di kedua pelatihan dan set tes dengan meningkatkan ukuran batch selama pelatihan. Prosedur ini berhasil untuk penurunan gradien stokastik (SGD), SGD dengan momentum, momentum Nesterov, dan Adam. Ini mencapai akurasi pengujian yang setara setelah jumlah pelatihan yang sama, tetapi dengan pembaruan parameter yang lebih sedikit, yang mengarah ke paralelisme yang lebih besar dan waktu pelatihan yang lebih singkat. Kami selanjutnya dapat mengurangi jumlah pembaruan parameter dengan meningkatkan tingkat pembelajaran ϵ dan menskalakan ukuran batch B∝ϵ. Akhirnya, seseorang dapat meningkatkan koefisien momentum m dan skala B∝1 / (1 − m), meskipun ini cenderung sedikit mengurangi akurasi pengujian. Yang terpenting, teknik kami memungkinkan kami untuk menyusun kembali jadwal pelatihan yang ada untuk pelatihan batch besar tanpa penyetelan parameter-hiper. Kami melatih ResNet-50 di ImageNet hingga akurasi validasi 76,1% dalam waktu kurang dari 30 menit.

David Parks
sumber
1
Kebutuhan memori yang lebih besar tampaknya merupakan trade-off yang buruk untuk sekadar menghindari penurunan nilai. IMHO juga memiliki jejak memori yang tumbuh selama pelatihan membuat algoritma yang lebih sedikit, tidak lebih, dapat diskalakan.
P-Gn
3

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.

Lars Ericson
sumber