Я оптимизирую функцию из 10-20 переменных. Плохая новость заключается в том, что оценка каждой функции обходится дорого, примерно 30 минут последовательного вычисления. Хорошей новостью является то, что в моем распоряжении кластер с несколькими десятками вычислительных узлов.
Таким образом, вопрос: существуют ли алгоритмы оптимизации, которые позволили бы мне эффективно использовать всю эту вычислительную мощность?
На одной стороне спектра был бы исчерпывающий поиск: разделите все пространство поиска на точную сетку и вычислите функцию в каждой точке сетки независимо. Это, безусловно, очень параллельное вычисление, но алгоритм ужасно неэффективен.
На другой стороне спектра будут квазиньютоновские алгоритмы: интеллектуально обновлять следующую оценку параметров на основе предшествующей истории. Это эффективный алгоритм, но я не знаю, как сделать его параллельным: концепция «оценки параметров на основе предшествующей истории» звучит как последовательное вычисление.
Квадратичные алгоритмы, кажется, находятся где-то посередине: можно построить начальную «суррогатную модель», рассчитав кучу значений параллельно, но я не знаю, являются ли остальные итерации параллелизуемыми.
Любые предложения о том, какие методы оптимизации без градиента будут хорошо работать на кластере? Кроме того, есть ли в настоящее время какие-либо параллельные реализации алгоритмов оптимизации?
Ответы:
Как утверждает Павел, без дополнительной информации трудно давать советы без предположений.
С 10-20 переменными и дорогими оценками функций, тенденция состоит в том, чтобы рекомендовать алгоритмы оптимизации без производных. Я собираюсь категорически не согласиться с советом Пола: вам обычно нужен градиент машинной точности, если вы не используете какой-то особый метод (например, стохастический градиентный спуск в машинном обучении будет использовать форму цели, чтобы прийти к разумному градиентные оценки).
Каждый квазиньютоновский шаг будет иметь вид:
где - некоторая аппроксимация матрицы Гессе, d k - направление поиска, x k - значение переменных решения на текущей итерации, f - ваша целевая функция, а ∇ f - градиент вашей цели, а переменные решения обновляются как x k + 1 = x k + α k d k , где α kЧАС~ dК ИксК е ∇ ф Икск + 1= хК+ αКdК αК размер шага, определенный некоторым образом (например, поиск строки). Вы можете избежать аппроксимации гессиана определенными способами, и ваши итерации будут сходиться, хотя, если вы используете что-то вроде приближения гессиана с конечными разностями с помощью точных градиентов, вы можете столкнуться с проблемами из-за плохой обусловленности. Обычно гессиан аппроксимируется с использованием градиента (например, методы типа BFGS с обновлениями ранга 1 до гессиана).
Приближение гессиана и градиента с помощью конечных разностей является плохой идеей по ряду причин:
Таким образом, чтобы получить одну итерацию квазиньютона, вы выполняете что-то вроде 420 оценок функций за 30 минут на оценку, что означает, что вы либо будете ждать некоторое время для каждой итерации, либо нужен большой кластер только для оценки функций. Фактические линейные решения будут состоять из 20 на 20 матриц (самое большее!), Поэтому нет смысла распараллеливать их. Если вы можете получить информацию о градиенте, например, путем решения сопряженной задачи, то это может оказаться более целесообразным, и в этом случае, возможно, стоит взглянуть на такую книгу, как Nocedal & Wright.
Если вы собираетесь выполнять много оценок функций параллельно, вам следует вместо этого взглянуть на подходы суррогатного моделирования или на генерацию методов поиска, прежде чем рассматривать квазиньютоновские подходы. Классические обзорные статьи - это статья Риоса и Сахинидиса о методах без производных , которая была опубликована в 2012 году и дает действительно хорошее, широкое сравнение; сравнительная статья More и Wild от 2009 г .; учебник 2009 года «Введение в оптимизацию без деривативов» Конна, Шейнберга и Висенте; и обзорная статья о генерации методов поиска по множествам Колды, Льюиса и Торцона из 2003 года.
Как указано выше, программный пакет DAKOTA будет реализовывать некоторые из этих методов, как и NLOPT , который реализует DIRECT, и некоторые из суррогатных методов моделирования Powell. Вы также можете взглянуть на MCS ; он написан на MATLAB, но, возможно, вы можете перенести реализацию MATLAB на язык по вашему выбору. DAKOTA, по сути, представляет собой набор сценариев, которые вы можете использовать для запуска дорогостоящего моделирования и сбора данных для алгоритмов оптимизации, а NLOPT имеет интерфейсы на большом количестве языков, поэтому выбор языка программирования не должен быть большой проблемой при использовании любого программного пакета; Тем не менее, DAKOTA требует некоторого времени для изучения, и у нее есть огромное количество документации, которую нужно проанализировать.
источник
Возможно, вы ищете алгоритмы оптимизации на основе суррогата. Эти алгоритмы используют суррогатные модели для замены реальных вычислительно дорогих моделей в процессе оптимизации и пытаются найти подходящее решение, используя как можно меньше оценок вычислительно дорогих моделей.
Я думаю, что для решения вашей проблемы можно использовать метод выборки по методу . Этот алгоритм использует суррогатную модель RBF для аппроксимации дорогостоящей целевой функции и может обрабатывать нелинейные ограничения. Что еще более важно, он выбирает несколько кандидатов для выполнения дорогостоящих оценок функций, чтобы вы могли распределить этих кандидатов для параллельных вычислений, чтобы еще больше ускорить процесс поиска. Код с открытым исходным кодом и написан на MATLAB.
Ссылка
Wang L., Shan S. & Wang GG (2004). Метод выборки с отслеживанием мод для глобальной оптимизации дорогостоящих функций черного ящика. Техническая оптимизация, 36 (4), 419-438.
источник
Я не уверен, что параллельный алгоритм действительно то, что вы ищете. Это ваши функциональные оценки, которые очень дороги. Вы хотите распараллелить саму функцию, а не алгоритм оптимизации.
Если вы не можете этого сделать, значит, между исчерпывающим поиском и алгоритмом Ньютона есть середина, это методы Монте-Карло. На множестве разных ядер / узлов вы можете запустить один и тот же алгоритм, который склонен падать на локальные оптимумы (скажем, квазиньютоновские алгоритмы), но все со случайными начальными условиями. Лучшее предположение для истинного оптимума - минимум минимумов. Это тривиально для распараллеливания и может использоваться для расширения любого метода. Хотя это и не совсем эффективно, но если у вас есть достаточно вычислительной мощности, это может определенно выиграть битву между производительностью программирования и производительностью алгоритма (если у вас много вычислительной мощности, это может закончиться до того, как вы закончите делать более изящный алгоритм).
источник
Выбор алгоритма оптимизации (и, следовательно, его распараллеливание) сильно зависит от свойств целевой функции и ограничений. Не зная больше о проблеме, трудно дать какой-либо значимый совет.
Но из ваших соображений о методах Ньютона я делаю вывод, что ваша целевая функция дифференцируема. Если возможно, ваша проблема получит большую выгоду от распараллеливания оценки функции. Если это невозможно, то вы также можете рассмотреть неточный метод Ньютона, который заменяет точные градиенты / гессианы на приближения конечных разностей. Затем вы можете использовать все эти процессоры в вашем распоряжении для вычисления каждого ненулевого элемента якобиана, как предлагает @stali.
Для получения дополнительной информации прочитайте «Числовая оптимизация» компании Nocedal & Wright, глава 7 . Есть много пакетов программного обеспечения для оптимизации, которые реализуют это параллельно. Среди наиболее распространенных бесплатных программ - пакет программного обеспечения DAKOTA (Sandia National Labs) .
источник
Вот решение вашей проблемы.
Описание математического метода приведено в данной статье .
источник