Параллельная байесовская оптимизация

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

Параллельный запуск байесовской оптимизации может сэкономить время. Параллельная работа требует 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 Computing Toolbox) | (Parallel Computing Toolbox)

Похожие темы