JM depolama konusunda haklıdır. BFGS, yaklaşık bir Hessian gerektirir, ancak kimlik matrisi ile başlatabilir ve daha sonra, sadece dereceli güncellemelerden ziyade gradyan bilgisine sahip olduğunuz sürece, sadece yaklaşık Hessian için ikinci derece güncellemeleri hesaplayabilirsiniz. BFGS, yarı-Newton bir yöntemdir ve CG'den daha az adımda bir araya gelecektir ve "sıkışıp kalma" eğilimine biraz daha az eğilimlidir ve her yineleme için önemli bir iniş elde etmek için hafif algoritmik tweaks gerektirir.
Bunun aksine, CG, yön türevlerini (tekrar, analitik ya da sonlu farkları kullanarak) hesaplayabiliyorsanız, sizin için yararlı olabilecek matris-vektör ürünlerini gerektirir. Bir yönlü türevin sonlu bir fark hesaplaması, bir Hessian'ın sonlu bir fark hesaplamasından çok daha ucuz olacaktır, bu nedenle algoritmanızı sonlu farklar kullanarak oluşturmayı seçerseniz, sadece doğrudan yönlü türevi hesaplayın. Ancak bu gözlem, gradyan bilgisinin iç ürünlerini kullanarak yaklaşık Hessianları hesaplayacak olan BFGS için geçerli değildir.
Yakınsama oranları açısından, eğer probleminizdeki karar değişkenlerinin sayısı ise, CG iterasyonları yaklaşık olarak Newton metodunun bir adımına eşittir. BFGS bir yarı Newton yöntemidir, ancak aynı tür gözlem yapmalıdır; Çok fazla inişin olduğu birkaç CG yönü olmadıkça BFGS ile daha az yinelemede yakınsama elde edersiniz ve ardından birkaç CG yinelemesinden sonra yeniden başlatırsınız. CG-benzeri yöntemler, eğer matris-vektör ürünleri ucuzsa ve probleminiz o kadar büyükse, Hessian'ı depolamak zor veya imkansızsa daha ucuzdur. BFGS, yaklaşık Hessian'ını güncellemek için daha fazla vektör-vektör ürünü içerir, bu nedenle her BFGS yinelemesi daha pahalı olacaktır, ancak bunların yerel bir asgariye ulaşması için daha azını gerektirir.nnn
Depolamanın bir sorun olmayacağını biliyorsanız, uygulamanız için küçük bir test problemindeki iki algoritmayı karşılaştırırım. Probleminizin özel özelliklerini bilmeden, benim tahminimce BFGS'nin daha hızlı olacağı, ancak hangisinin daha iyi çalışacağına dair daha iyi bir fikir edinmek için iki algoritmayı gerçekten test etmeniz gerekir.
Son olarak, otomatik farklılaşma hakkında bir kelime: Fortran ( DAEPACK ) için bir kurum içi otomatik farklılaşma (AD) tesisi ile ilgili biraz tecrübe sahibi olduğumda, size AD araçlarının genellikle titiz olduğunu söyleyebilirim. Kendileri oluşturdukları kodu ayırt etmek zorunda olmayabilirler. İki tür AD aracı vardır:
- kaynaktan kaynaktan AD araçları
- operatör AD araçları aşırı yükleme
Kaynaktan kaynaktan araçlar, yazdığınız kaynak kodunu alan, ayrıştıran ve otomatik olarak kaynak kodunuzdaki işlevlerin derecesini hesaplayan yeni kaynak kodunu üreten, derlenmiş komutlardır. Operatör aşırı yükleme AD araçları, kaynak kodunuzda aşırı yüklenmiş AD operatörlerini kullanmanızı gerektirir; böylelikle türevlerin hesaplanabilmesi için, AD ile analitik türevleri hesaplamak için ek bir çaba göstermeniz gerekir.