Saya telah menerapkan cukup beragam pemecah non-linear pada GPU, termasuk LBFGS, Barzilai Borwein gradient descent dan gradien konjugat non-linear.
Untuk ini, gradien konjugat non-linier dari Dai & Yuan adalah yang paling efisien. Secara umum, versi lain dari gradien konjugasi nonlinear mungkin lebih efisien (seperti CG-DESCENT), tetapi juga bisa lebih sulit untuk diterapkan.
LBFGS pada umumnya merupakan pilihan yang sangat solid, dan kecuali Anda benar-benar kekurangan memori, mungkin ini adalah tempat terbaik untuk memulai.
Baik gradien konjugasi dan BFGS membutuhkan pencarian baris, yang merupakan masalah fp32. Daripada menggunakan kondisi Wolfe standar untuk pencarian baris, saya sarankan menggunakan perkiraan kondisi Wolfe yang disarankan di sini . Makalah ini sedikit terlibat, tetapi yang penting adalah persamaan 4.1. Pada dasarnya mereka secara eksplisit memperkenalkan presisi yang dapat Anda gunakan untuk menghitung fungsi Anda.
Pertimbangan untuk GPU:
Anda memiliki banyak masalah kecil, yang sedikit berbeda dari kasus penggunaan saya untuk satu masalah besar. Pertimbangkan menjalankan 1 masalah per blok GPU (atau warp, lebih tepatnya) jika Anda dapat memparalelkan evaluasi fungsi dan gradien untuk menggunakan semua utas dalam sebuah blok. Dengan begitu itu bukan masalah jika masalah yang berbeda membutuhkan jumlah iterasi yang berbeda.
Jika ini bukan pilihan, saya akan pergi dengan pemecah LBFGS. Jika fungsi Anda berperilaku baik, Anda mungkin lolos hanya dengan menggunakan ukuran langkah 1 (menghindari pencarian baris) dan hanya menjalankan semua masalah untuk sejumlah iterasi yang tetap.