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.