JM прав насчет хранения. BFGS требует приблизительного гессиана, но вы можете инициализировать его с помощью матрицы тождеств, а затем просто вычислять обновления ранга два для приблизительного гессиана, пока у вас есть доступная информация о градиенте, предпочтительно аналитически, а не через конечные различия. BFGS - это квазиньютоновский метод, который будет сходиться за меньшее количество шагов, чем CG, и имеет немного меньшую тенденцию «застрять» и требует небольших алгоритмических настроек, чтобы добиться значительного снижения для каждой итерации.
Напротив, CG требует матрично-векторных продуктов, которые могут быть вам полезны, если вы можете рассчитать производные по направлению (опять же, аналитически или с использованием конечных разностей). Расчет конечной разности производной по направлению будет намного дешевле, чем расчет конечной разности гессиана, поэтому, если вы решите построить свой алгоритм с использованием конечных разностей, просто рассчитайте производную по прямой. Это наблюдение, однако, на самом деле не относится к BFGS, который будет вычислять приблизительные гессианы, используя внутренние произведения информации о градиенте.
NN
Я бы сравнил два алгоритма для небольшой тестовой задачи для вашего приложения, если вы знаете, что с хранилищем проблем не будет. Не зная специфики вашей проблемы, я предполагаю, что BFGS будет быстрее, но вы должны действительно протестировать два алгоритма, чтобы получить лучшее представление о том, какой из них будет работать лучше.
Наконец, несколько слов об автоматической дифференциации: имея некоторый опыт работы с внутренним средством автоматической дифференцировки (AD) для Fortran ( DAEPACK ), я могу сказать, что инструменты AD часто бывают привередливыми. Они могут не обязательно различать код, который они генерируют сами. Существует два типа инструментов AD:
- инструменты AD от источника к источнику
- оператор перегрузки AD инструментов
Инструменты «источник-источник» - это существенно модифицированные компиляторы, которые берут написанный вами исходный код, анализируют его и автоматически генерируют новый исходный код, который вычисляет градиент функций в вашем исходном коде. Перегрузка операторов инструментами AD требует, чтобы вы использовали перегруженные операторы AD в исходном коде, чтобы можно было рассчитать производные, что потребовало бы от вас дополнительных усилий для расчета аналитических производных с AD.