JM має рацію щодо зберігання. BFGS вимагає приблизного гессіана, але ви можете ініціалізувати його за допомогою матриці ідентифікації, а потім просто обчислити оновлення рангових позицій до приблизної гессіани, поки ви маєте доступну інформацію про градієнт, бажано аналітично, а не через кінцеві відмінності. BFGS - це метод квазі-Ньютона, який буде сходитись за менше кроків, ніж CG, і має трохи меншу тенденцію до «застрягання» та потребує невеликих алгоритмічних перетворень, щоб досягти значного спуску для кожної ітерації.
На відміну від цього, CG вимагає матрично-векторних продуктів, які можуть бути корисними для вас, якщо ви можете обчислити похідні похідні (знову ж таки, аналітично або використовуючи кінцеві відмінності). Обчислення кінцевої різниці спрямованої похідної буде набагато дешевше, ніж розрахунок кінцевої різниці гессіана, тому якщо ви вирішите побудувати свій алгоритм, використовуючи кінцеві різниці, просто обчисліть похідну спрямованості безпосередньо. Однак це спостереження насправді не стосується BFGS, який обчислює приблизний гессієць, використовуючи внутрішні продукти градієнтної інформації.
Щодо коефіцієнтів конвергенції, якщо - кількість змінних рішень у вашій проблемі, то ітерацій CG приблизно дорівнює одному кроці методу Ньютона. BFGS - це квазі-ньютонівський метод, але слід спостерігати такий самий вид спостереження; Ви, ймовірно, отримаєте конвергенцію за меншою кількістю ітерацій з BFGS, якщо не буде декількох напрямків CG, в яких багато спуску, а потім після декількох ітерацій CG ви перезапустите її. CG-подібні методи дешевші, якщо матричні векторні продукти дешеві, а ваша проблема настільки велика, що зберігати гессіанців важко або неможливо. BFGS передбачає ще кілька векторних векторних продуктів для оновлення свого приблизного гессіанського, тому кожна ітерація BFGS буде дорожчою, але вам буде потрібно менше їх для досягнення локального мінімуму.nнн
Я б порівняв два алгоритми щодо невеликої тестової проблеми для вашої програми, якщо ви знаєте, що зберігання не буде проблемою. Не знаючи конкретних особливостей вашої проблеми, я здогадуюсь, що BFGS буде швидше, але ви дійсно повинні протестувати два алгоритми, щоб отримати краще уявлення про те, який буде працювати краще.
Нарешті, слово про автоматичну диференціацію: маючи певний досвід роботи з функцією автоматичного розмежування будинку (AD) для Fortran ( DAEPACK ), я можу вам сказати, що інструменти AD часто хитрі. Вони не обов'язково зможуть диференціювати код, який вони створюють самі. Існує два типи інструментів AD:
- інструменти AD-джерела до джерела
- оператор перевантажує інструменти AD
Засоби джерела до джерела - це по суті модифіковані компілятори, які беруть написаний вихідний код, аналізують його та автоматично генерують новий вихідний код, який обчислює градієнт функцій у вихідному коді. Інструменти AD, що перевантажують AD, вимагають використовувати перевантажені оператори AD у вихідному коді, щоб можна було обчислити похідні, що вимагатиме додаткових зусиль з вашого боку для обчислення аналітичних похідних з AD.