Выполнение Байесовой оптимизации параллельно может сэкономить время. Выполнение параллельно требует 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
оценивает начальные случайные точки, он выбирает точки, чтобы оценить путем подбора кривой модели Gaussian process (GP). Чтобы соответствовать модели GP, в то время как некоторые рабочие все еще оценивают точки, bayesopt
приписывает значение к каждой точке, которая находится все еще на рабочем. Оценочное значение является средним значением значения модели GP в точках, которые это оценивает, или некоторое другое значение, как задано
парой "имя-значение" 'ParallelMethod'
bayesopt
. Для параллельной оптимизации подходящих функций 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
, как в этом примере.
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
, чтобы загрузить данные по рабочим. Используйте Composite
с 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). Объективное время оценки включает время, чтобы запустить рабочего на задании.