Найдите что-либо подобное байесовой оптимизации

Оптимизируйте параллельно

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

Смотрите также

|

Похожие темы