Параллельный запуск байесовской оптимизации может сэкономить время. Параллельная работа требует Parallel Computing Toolbox™. bayesopt
выполняет параллельные целевые вычисления функции одновременно с параллельными рабочими.
Чтобы оптимизировать параллельно:
bayesopt
- Установите UseParallel
Пара "имя-значение" с true
. Для примера,
results = bayesopt(fun,vars,'UseParallel',true);
Функции подгонки - Установите UseParallel
поле HyperparameterOptimizationOptions
структура, к true
. Для примера,
Mdl = fitcsvm(X,Y,'OptimizeHyperparameters','auto',... 'HyperparameterOptimizationOptions',struct('UseParallel',true))
Параллельный алгоритм оптимизации Байеса похож на последовательный алгоритм, который описан в Байесовском алгоритме оптимизации. Ниже перечислены различия:
bayesopt
присваивает точки для вычисления параллельным рабочим, обычно по одной точке за раз. bayesopt
вычисляет на клиенте, чтобы определить, какую точку назначить.
После bayesopt
оценивает начальные случайные точки, он выбирает точки для вычисления путем подгонки модели Гауссова процесса (GP). Чтобы соответствовать модели GP, в то время как некоторые работники все еще оценивают точки, bayesopt
вводит значение в каждую точку, которая все еще находится на рабочем месте. Условное значение является средним значением значения модели GP в точках, которые она оценивает, или некоторым другим значением, заданным bayesopt
'ParallelMethod'
Пара "имя-значение". Для параллельной оптимизации функций аппроксимации, bayesopt
использует значение по умолчанию ParallelMethod
вмененное значение.
После bayesopt
присваивает точку для вычисления, и перед вычислением новой точки для назначения проверяет, находится ли слишком много работников в простое. Порог для активных работников определяется MinWorkerUtilization
Пара "имя-значение". Если слишком много работников простаивают, то bayesopt
присваивает случайные точки, выбранные равномерно в границах, всем работникам, работающим в режиме ожидания. Этот шаг заставляет работников быть активными быстрее, но работники имеют случайные точки, а не подобранные точки. Если количество бездействующих работников не превышает порог, то bayesopt
выбирает точку для оценки как обычно, путем подбора модели GP и максимизации функции сбора.
Примечание
Из-за непродуктивности параллельной синхронизации параллельная байесовская оптимизация не обязательно приводит к воспроизводимым результатам.
Функции подгонки не имеют специальных настроек для лучшей параллельной эффективности. Напротив, несколько bayesopt
настройки могут помочь ускорить оптимизацию.
Установка GPActiveSetSize
опция меньшего значения, чем значение по умолчанию (300
) может ускорить решение. Стоимость является потенциальной неточностью в точках, которые bayesopt
выбирает для оценки, потому что модель GP целевой функции может быть менее точной, чем с большим значением. Установка большего значения опции может привести к более точной модели GP, но требует большего времени, чтобы создать модель.
Установка ParallelMethod
опция для 'max-observed'
может возглавить bayesopt
более широко искать глобальный оптимум. Этот выбор может привести к лучшему решению за меньшее время. Однако значение по умолчанию 'clipped-model-prediction'
часто является лучшим.
Установка MinWorkerUtilization
опция большого значения может привести к более высокому параллельному использованию. Однако эта настройка вызывает более полную оценку случайных точек, что может привести к менее точным решениям. Большое значение, в этом контексте, зависит от того, сколько у вас работников. Значение по умолчанию является floor(0.8*N)
, где N
количество параллельных рабочих. Установка более низкого значения опции может дать меньшее параллельное использование, но с преимуществом более высоких качественных точек.
Можно поместить целевую функцию на параллельных рабочих одним из трех способов. Некоторые имеют лучшую эффективность, но требуют более сложной настройки.
1. Автоматически Если вы даете указатель на функцию как целевую функцию, bayesopt
отправляет указатель всем параллельным рабочим в начале своего запуска. Для примера,
load ionosphere splits = optimizableVariable('splits',[1,100],'Type','integer'); minleaf = optimizableVariable('minleaf',[1,100],'Type','integer'); fun = @(params)kfoldLoss(fitctree(X,Y,'Kfold',5,... 'MaxNumSplits',params.splits,'MinLeaf',params.minleaf)); results = bayesopt(fun,[splits,minleaf],'UseParallel',true);
Этот метод эффективен, если указатель является маленьким, или если вы запускаете оптимизацию только один раз. Однако, если вы планируете запустить оптимизацию несколько раз, можно сэкономить время, используя один из двух других методов.
2. Параллельная константа Если вы планируете запустить оптимизацию несколько раз, сэкономьте время, передав целевую функцию работникам только один раз. Этот метод особенно эффективен, когда указатель на функцию включает в себя большой объем данных. Передайте цель один раз, установив указатель на функцию в parallel.pool.Constant
(Parallel Computing Toolbox), как в этом примере.
load ionosphere splits = optimizableVariable('splits',[1,100],'Type','integer'); minleaf = optimizableVariable('minleaf',[1,100],'Type','integer'); fun = @(params)kfoldLoss(fitctree(X,Y,'Kfold',5,... 'MaxNumSplits',params.splits,'MinLeaf',params.minleaf)); C = copyFunctionHandleToWorkers(fun); results1 = bayesopt(C,[splits,minleaf],'UseParallel',true); results2 = bayesopt(C,[splits,minleaf],'UseParallel',true,... 'MaxObjectiveEvaluations',50); results3 = bayesopt(C,[splits,minleaf],'UseParallel',true,... 'AcquisitionFunction','expected-improvement');
В этом примере copyFunctionHandleToWorkers
отправляет указатель на функцию работникам только один раз.
3. Создайте целевую функцию для работников Если у вас есть много данных для отправки работникам, можно избежать загрузки данных в клиент при помощи spmd
(Parallel Computing Toolbox), чтобы загрузить данные о работниках. Используйте Composite
(Parallel Computing Toolbox) с parallel.pool.Constant
для доступа к распределенным целевым функциям.
% makeFun is at the end of this script spmd fun = makeFun(); end % ObjectiveFunction is now a Composite. Get a parallel.pool.Constant % that refers to it, without copying it to the client: C = parallel.pool.Constant(fun); % You could also use the line % C = parallel.pool.Constant(@MakeFun); % In this case, you do not use spmd % Call bayesopt, passing the Constant splits = optimizableVariable('splits', [1 100]); minleaf = optimizableVariable('minleaf', [1 100]); bo = bayesopt(C,[splits minleaf],'UseParallel',true); function f = makeFun() load('ionosphere','X','Y'); f = @fun; function L = fun(Params) L = kfoldLoss(fitctree(X,Y, ... 'KFold', 5,... 'MaxNumSplits',Params.splits, ... 'MinLeaf', Params.minleaf)); end end
В этом примере указатель на функцию существует только для работников. Указатель никогда не отображается на клиенте.
Когда bayesopt
работает параллельно, выход оптимизации включает эти различия.
Итеративное отображение - итеративное отображение включает столбец с указанием количества активных работников. Это число после bayesopt
назначает задание следующему работнику.
Функции построения графика
График модели целевой функции (@plotObjectiveModel
) показывает ожидающие точки (эти точки, выполняемые параллельными рабочими). Высота точек зависит от ParallelMethod
Пара "имя-значение".
График истекшего времени (@plotElapsedTime
) показывает общее истекшее время с Real time метки и общее целевое вычисление функции время, суммированное по всем работникам, с Objective evaluation time (all workers) метки. Целевое время оценки включает время запуска работника на работе.
parallel.pool.Constant
(Parallel Computing Toolbox) | spmd
(Parallel Computing Toolbox)