BFGS vs. Metode Gradient Konjugasi

25

Pertimbangan apa yang harus saya buat ketika memilih antara BFGS dan konjugasi gradien untuk optimasi? Fungsi yang saya coba cocokkan dengan variabel-variabel ini adalah fungsi eksponensial; Namun, fungsi obyektif yang sebenarnya melibatkan integrasi, antara lain, dan sangat mahal jika itu membantu sama sekali.

drjrm3
sumber
3
Yah, BFGS tentu lebih mahal dalam hal penyimpanan daripada CG. Yang satu membutuhkan pemeliharaan perkiraan Goni, sementara yang lain hanya membutuhkan beberapa vektor dari Anda. Di sisi lain, keduanya memerlukan perhitungan gradien, tetapi saya diberitahu bahwa dengan BFGS, Anda bisa lolos dengan menggunakan perkiraan perbedaan hingga daripada harus menulis rutin untuk gradien (tetapi versi menggunakan perbedaan hingga konvergen sedikit. lebih lambat dari yang menggunakan gradien sebenarnya, tentu saja). Jika Anda memiliki fasilitas diferensiasi otomatis, maka satu-satunya kekhawatiran Anda adalah penyimpanan.
JM
harus sesuai hanya ~ 7 (pasti kurang dari 10) variabel berarti bahwa pendekatan hessian hanya (paling banyak) matriks 10x10 yang benar? dalam hal mana, apakah yang satu lebih cepat dari yang lain?
drjrm3
Saya tidak berpikir akan ada banyak perbedaan dalam kecepatan; jika ada, saya pikir bagian dari perhitungan Anda yang mungkin akan mengambil waktu paling banyak adalah kuadratur yang harus Anda lakukan untuk evaluasi fungsi. Anda benar-benar harus melakukan beberapa percobaan sendiri, jika jumlah parameter sekecil yang Anda klaim.
JM

Jawaban:

13

JM benar tentang penyimpanan. BFGS membutuhkan perkiraan Goni, tetapi Anda dapat menginisialisasi dengan matriks identitas dan kemudian hanya menghitung pembaruan peringkat-dua ke Goni perkiraan saat Anda pergi, selama Anda memiliki informasi gradien yang tersedia, lebih disukai secara analitis daripada melalui perbedaan hingga. BFGS adalah metode kuasi-Newton, dan akan menyatu dalam langkah-langkah yang lebih sedikit daripada CG, dan memiliki sedikit kecenderungan untuk "terjebak" dan membutuhkan sedikit penyesuaian algoritmik untuk mencapai penurunan yang signifikan untuk setiap iterasi.

Sebaliknya, CG membutuhkan produk-produk matriks-vektor, yang mungkin berguna bagi Anda jika Anda dapat menghitung turunan terarah (sekali lagi, secara analitis, atau menggunakan perbedaan hingga). Perhitungan beda hingga dari turunan terarah akan jauh lebih murah daripada perhitungan beda hingga dari Hessian, jadi jika Anda memilih untuk membangun algoritma Anda menggunakan perbedaan hingga, cukup hitung turunan terarah langsung. Pengamatan ini, bagaimanapun, tidak benar-benar berlaku untuk BFGS, yang akan menghitung perkiraan Goni menggunakan produk dalam informasi gradien.

Dalam hal tingkat konvergensi, jika adalah jumlah variabel keputusan dalam masalah Anda, maka iterasi CG kira-kira sama dengan satu langkah metode Newton. BFGS adalah metode kuasi-Newton, tetapi jenis pengamatan yang sama harus berlaku; Anda cenderung mendapatkan konvergensi dalam iterasi yang lebih sedikit dengan BFGS kecuali ada beberapa arah CG di mana ada banyak keturunan, dan kemudian setelah beberapa iterasi CG, Anda me-restart itu. Metode seperti CG lebih murah jika produk vektor-matriks murah dan masalah Anda begitu besar sehingga menyimpan Hessian itu sulit atau tidak mungkin. BFGS melibatkan lebih banyak produk vektor-vektor untuk memperbarui perkiraan Goniya, sehingga setiap iterasi BFGS akan lebih mahal, tetapi Anda akan membutuhkan lebih sedikit dari itu untuk mencapai minimum lokal.nnn

Saya akan membandingkan kedua algoritma pada masalah pengujian kecil untuk aplikasi Anda jika Anda tahu bahwa penyimpanan tidak akan menjadi masalah. Tanpa mengetahui secara spesifik masalah Anda, tebakan saya adalah BFGS akan lebih cepat, tetapi Anda harus benar-benar menguji dua algoritma untuk mendapatkan ide yang lebih baik yang akan bekerja lebih baik.

Akhirnya, sepatah kata tentang diferensiasi otomatis: memiliki pengalaman dengan fasilitas diferensiasi otomatis (AD) internal untuk Fortran ( DAEPACK ), saya dapat memberi tahu Anda bahwa alat AD sering rewel. Mereka mungkin tidak selalu dapat membedakan kode yang mereka hasilkan sendiri. Ada dua jenis alat AD:

  • alat AD sumber-ke-sumber
  • alat AD operator yang berlebihan

Alat sumber-ke-sumber pada dasarnya adalah kompiler yang dimodifikasi yang mengambil kode sumber yang telah Anda tulis, menguraikannya, dan secara otomatis menghasilkan kode sumber baru yang menghitung gradien fungsi dalam kode sumber Anda. Alat AD overloading operator mengharuskan Anda menggunakan operator AD yang kelebihan beban dalam kode sumber Anda sehingga turunannya dapat dihitung, yang akan membutuhkan upaya tambahan dari pihak Anda untuk menghitung turunan analitik dengan AD.

Geoff Oxberry
sumber
22

Biaya terkait BFGS mungkin lebih sesuai dengan CG jika Anda menggunakan varian memori terbatas daripada BFGS penyimpanan penuh. Ini menghitung pembaruan BFGS untuk pembaruan terakhir secara efisien dengan serangkaian pembaruan peringkat-satu tanpa perlu menyimpan lebih dari solusi dan gradien terakhir .mmm

Dalam pengalaman saya, BFGS dengan banyak pembaruan menyimpan informasi terlalu jauh dari solusi saat ini untuk benar-benar berguna dalam mendekati Jacobian yang tidak ketinggalan, dan Anda benar-benar dapat kehilangan konvergensi jika Anda menyimpan terlalu banyak. Ada varian "tanpa memori" dari BFGS yang sangat mirip dengan gradien konjugasi nonlinear (lihat pembaruan akhir yang dijelaskan untuk salah satu dari ini) hanya untuk alasan ini. Oleh karena itu, jika Anda bersedia untuk melakukan L-BFGS daripada BFGS, masalah memori hilang dan metode terkait . Bukti anekdotal menunjuk untuk memulai kembali menjadi masalah yang rumit, karena kadang-kadang tidak perlu dan kadang-kadang sangat diperlukan.

Pilihan Anda di antara keduanya juga sangat bergantung pada masalah yang Anda minati. Jika Anda memiliki sumber daya, Anda dapat mencoba keduanya untuk masalah Anda dan memutuskan mana yang lebih baik. Sebagai contoh, saya pribadi tidak melakukan optimasi dengan algoritma ini, tetapi sebaliknya peduli dengan solusi sistem persamaan nonlinier. Untuk ini saya telah menemukan bahwa NCG bekerja lebih baik dan lebih mudah untuk melakukan prakondisi nonlinier. BFGS lebih kuat.

Terus terang, metode favorit saya untuk hal-hal semacam ini adalah N-GMRES . Hal ini terutama berlaku jika evaluasi gradien Anda sangat mahal, seperti dalam pengalaman saya itu memberi Anda paling bang untuk uang Anda dengan memecahkan masalah minimisasi kecil di yang terakhir iterates untuk membangun baru, menurunkan-sisa solusi.m

Peter Brune
sumber
Saya benar-benar lupa tentang L-BFGS. +1 untuk itu.
JM
15

Dalam dimensi rendah, metode BFGS yang diterapkan dengan baik umumnya lebih cepat dan lebih kuat daripada CG, terutama jika fungsinya tidak jauh dari kuadratik.

BFGS maupun CG tidak membutuhkan asumsi tentang kecemburuan; hanya respek Hessian awal (untuk BFGS) resp. prekondisi (untuk CG) harus pasti positif. Tetapi ini selalu dapat dipilih untuk menjadi matriks identitas, dalam dimensi rendah tanpa banyak kerugian. Lihat juga /scicomp//a/3213/1117

Dengan tidak adanya gradien terprogram, itu adalah usaha besar untuk menggunakan gradien numerik, terutama ketika nilai fungsi mahal. Sebaliknya, seseorang harus menggunakan algoritma derivatif-bebas. Lihat http://archimedes.cheme.cmu.edu/?q=dfocomp untuk survei terbaru.

Arnold Neumaier
sumber
Tautan memberi saya "404 Tidak Ditemukan", bisakah Anda memperbaikinya?
Stiefel
@Stiefel: Saya memperbaikinya. Tautan baru menunjuk ke versi yang jauh lebih baik.
Arnold Neumaier