Выполнение Байесовой оптимизации параллельно может сэкономить время. Выполнение параллельно требует 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 в точках, которые это оценивает, или некоторое другое значение, как задано 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
создайте, как в этом примере.
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). Объективное время оценки включает время, чтобы запустить рабочего на задании.