Как утверждает Павел, без дополнительной информации трудно давать советы без предположений.
С 10-20 переменными и дорогими оценками функций, тенденция состоит в том, чтобы рекомендовать алгоритмы оптимизации без производных. Я собираюсь категорически не согласиться с советом Пола: вам обычно нужен градиент машинной точности, если вы не используете какой-то особый метод (например, стохастический градиентный спуск в машинном обучении будет использовать форму цели, чтобы прийти к разумному градиентные оценки).
Каждый квазиньютоновский шаг будет иметь вид:
ЧАС~( хК) гК= - ∇ f( хК) ,
где - некоторая аппроксимация матрицы Гессе, d k - направление поиска, x k - значение переменных решения на текущей итерации, f - ваша целевая функция, а ∇ f - градиент вашей цели, а переменные решения обновляются как x k + 1 = x k + α k d k , где α kЧАС~dКИксКе∇ фИкск + 1= хК+ αКdКαКразмер шага, определенный некоторым образом (например, поиск строки). Вы можете избежать аппроксимации гессиана определенными способами, и ваши итерации будут сходиться, хотя, если вы используете что-то вроде приближения гессиана с конечными разностями с помощью точных градиентов, вы можете столкнуться с проблемами из-за плохой обусловленности. Обычно гессиан аппроксимируется с использованием градиента (например, методы типа BFGS с обновлениями ранга 1 до гессиана).
Приближение гессиана и градиента с помощью конечных разностей является плохой идеей по ряду причин:
- у вас будет ошибка в градиенте, поэтому применяемый вами квазиньютоновский метод сродни поиску корня шумной функции
- если оценка функций стоит дорого, и вы пытаетесь оценить градиент по отношению к переменным, это будет стоить вам N оценок функции за итерациюNN
- если у вас есть ошибка в градиенте, у вас будет больше ошибок в вашем гессиане, что является большой проблемой с точки зрения обусловленности линейной системы
- ... и это будет стоить вам функции оценки за одну итерациюN2
Таким образом, чтобы получить одну итерацию квазиньютона, вы выполняете что-то вроде 420 оценок функций за 30 минут на оценку, что означает, что вы либо будете ждать некоторое время для каждой итерации, либо нужен большой кластер только для оценки функций. Фактические линейные решения будут состоять из 20 на 20 матриц (самое большее!), Поэтому нет смысла распараллеливать их. Если вы можете получить информацию о градиенте, например, путем решения сопряженной задачи, то это может оказаться более целесообразным, и в этом случае, возможно, стоит взглянуть на такую книгу, как Nocedal & Wright.
Если вы собираетесь выполнять много оценок функций параллельно, вам следует вместо этого взглянуть на подходы суррогатного моделирования или на генерацию методов поиска, прежде чем рассматривать квазиньютоновские подходы. Классические обзорные статьи - это статья Риоса и Сахинидиса о методах без производных , которая была опубликована в 2012 году и дает действительно хорошее, широкое сравнение; сравнительная статья More и Wild от 2009 г .; учебник 2009 года «Введение в оптимизацию без деривативов» Конна, Шейнберга и Висенте; и обзорная статья о генерации методов поиска по множествам Колды, Льюиса и Торцона из 2003 года.
Как указано выше, программный пакет DAKOTA будет реализовывать некоторые из этих методов, как и NLOPT , который реализует DIRECT, и некоторые из суррогатных методов моделирования Powell. Вы также можете взглянуть на MCS ; он написан на MATLAB, но, возможно, вы можете перенести реализацию MATLAB на язык по вашему выбору. DAKOTA, по сути, представляет собой набор сценариев, которые вы можете использовать для запуска дорогостоящего моделирования и сбора данных для алгоритмов оптимизации, а NLOPT имеет интерфейсы на большом количестве языков, поэтому выбор языка программирования не должен быть большой проблемой при использовании любого программного пакета; Тем не менее, DAKOTA требует некоторого времени для изучения, и у нее есть огромное количество документации, которую нужно проанализировать.