Ограничения в байесовой оптимизации

Границы

bayesopt требует конечных границ на всех переменных. (переменные categorical, по своей природе, ограничены в их возможных значениях.) Передают нижние и верхние границы для действительных и переменных с целочисленным знаком в optimizableVariable.

bayesopt использует эти границы для точек выборки, или однородно или масштабируемый журналом. Вы устанавливаете масштабирование для выборки в optimizableVariable.

Например, чтобы ограничить переменную X1 к значениям между 1e-6 и 1e3, масштабируемым логарифмически,

xvar = optimizableVariable('X1',[1e-6,1e3],'Transform','log')

bayesopt включает конечные точки в свою область значений. Поэтому вы не можете использовать 0 в качестве нижней границы для преобразованной в журнал переменной.

Совет

Чтобы использовать нулевую нижнюю границу в преобразованной в журнал переменной, установите нижнюю границу на 1, затем в использовании целевой функции x-1.

Детерминированные ограничения — XConstraintFcn

Иногда ваша проблема допустима или четко определена только для точек в определенной области, названной feasible region. Детерминированное ограничение является детерминированной функцией, которая возвращает true, когда точка выполнима, и false, когда точка неосуществима. Таким образом, детерминированные ограничения не являются стохастическими, и они не функции группы точек, но отдельных точек.

Совет

Более эффективно использовать границы optimizableVariable, вместо детерминированных ограничений, ограничить оптимизацию прямоугольной областью.

Запишите детерминированной ограничительной функции использование подписи

tf = xconstraint(X)
  • X является таблицей width-D произвольной высоты.

  • tf является логическим вектор-столбцом, где tf(i) = true точно, когда X(i,:) выполним.

Передайте детерминированную ограничительную функцию в паре "имя-значение" XConstraintFcn bayesopt. Например,

results = bayesopt(fun,vars,'XConstraintFcn',@xconstraint)

bayesopt оценивает детерминированные ограничения на тысячи точек, и так запускается быстрее, когда ваша ограничительная функция векторизована. Смотрите Векторизацию (MATLAB).

Например, предположите, что переменные под названием 'x1' и 'x2' выполнимы, когда норма векторного [x1 x2] является меньше, чем 6, и когда x1 <= x2. Следующая ограничительная функция оценивает эти ограничения.

function tf = xconstraint(X)
tf1 = sqrt(X.x1.^2 + X.x2.^2) < 6;
tf2 = X.x1 <= X.x2;
tf = tf1 & tf2;

Условные ограничения — ConditionalVariableFcn

Условные ограничения являются функциями, которые осуществляют одно из следующих двух условий:

  • Когда некоторые переменные имеют определенные значения, другие переменные установлены в данные значения.

  • Когда некоторые переменные имеют определенные значения, другие переменные имеют NaN или, для категориальных переменных, значений <undefined>.

Задайте условное ограничение путем установки пары "имя-значение" ConditionalVariableFcn bayesopt на указатель на функцию, скажите @condvariablefcn. Функция @condvariablefcn должна иметь подпись

Xnew = condvariablefcn(X)
  • X является таблицей width-D произвольной высоты.

  • Xnew является таблицей тот же тип и размер как X.

condvariablefcn устанавливает Xnew быть равным X, кроме него также устанавливает следующие переменные в каждой строке Xnew к правильным значениям для ограничения.

Примечание

Если у вас есть и условные ограничения и детерминированные ограничения, bayesopt применяет условные ограничения сначала. Поэтому, если ваша условная ограничительная функция может установить переменные на NaN или <undefined>, гарантировать, что ваша детерминированная ограничительная функция может обработать эти значения правильно.

Условные ограничения гарантируют, что значения переменных разумны. Поэтому bayesopt применяет условные ограничения сначала так, чтобы все переданные значения были разумны.

Условное ограничение, которое устанавливает значение переменных

Предположим, что вы оптимизируете классификацию с помощью fitcdiscr, и вы оптимизируете по обоим аргументы пары "имя-значение" 'DiscrimType' и 'Gamma'. Когда 'DiscrimType' является одним из квадратичных типов, 'Gamma' должен быть 0 или ошибки решателя. В этом случае используйте эту условную ограничительную функцию:

function XTable = fitcdiscrCVF(XTable)
% Gamma must be 0 if discrim type is a quadratic
XTable.Gamma(ismember(XTable.DiscrimType, {'quadratic',...
        'diagQuadratic','pseudoQuadratic'})) = 0;
end

Условное ограничение, которое устанавливает переменную на NaN

Предположим, что вы оптимизируете классификацию с помощью fitcsvm, и вы оптимизируете по обоим аргументы пары "имя-значение" 'KernelFunction' и 'PolynomialOrder'. Когда 'KernelFunction' не является 'polynomial', установка 'PolynomialOrder' не применяется. Следующая функция осуществляет это условное ограничение.

function Xnew = condvariablefcn(X)
Xnew = X;
Xnew.PolynomialOrder(Xnew.KernelFunction ~= 'polynomial') = NaN;

Можно сохранить строку кода можно следующим образом:

function X = condvariablefcn(X)
X.PolynomialOrder(Xnew.KernelFunction ~= 'polynomial') = NaN;

Кроме того, задайте целевую функцию, которая не передает аргумент пары "имя-значение" 'PolynomialOrder' fitcsvm, когда значением 'PolynomialOrder' является NaN.

fun = @(X)mysvmfun(X,predictors,responce,c)

function objective = mysvmfun(X,predictors,response,c)
    args = {predictors,response, ...
        'CVPartition',c, ...
        'KernelFunction',X.KernelFunction};
    if ~isnan(X.PolynomialOrder)
        args = [args,{'PolynomialOrder',X.PolynomialOrder}];
    end
    objective = kfoldLoss(fitcsvm(args{:}));
end

Двойные ограничения

Coupled constraints является ограничениями, которые можно оценить только путем вызывания целевой функции. Эти ограничения могут быть стохастическими или детерминированными. Возвратите эти ограничительные значения от своей целевой функции во втором аргументе. Смотрите Байесовы Целевые функции Оптимизации.

Целевая функция возвращает числовой вектор для двойных ограничений, одну запись для каждого двойного ограничения. Для каждой записи отрицательная величина указывает, что ограничение удовлетворено (также названный выполнимым). Положительное значение указывает, что ограничение не удовлетворено (неосуществимое).

bayesopt автоматически создает двойное ограничение, названное Ошибочным ограничением, для каждого выполнения. Это ограничение включает bayesopt к образцовым точкам что ошибки причины в оценке целевой функции. Для получения дополнительной информации смотрите Ошибки Целевой функции и predictError.

Если вы связали ограничения в дополнение к Ошибочному ограничению:

  • Включайте пару "имя-значение" NumCoupledConstraints в свой (требуемый) вызов bayesopt. Не включайте Ошибочное ограничение в этот номер.

  • Если какое-либо из ваших двойных ограничений является стохастическим, включает пару "имя-значение" AreCoupledConstraintsDeterministic и передает false для какого-либо стохастического ограничения.

Наблюдайте двойные ограничительные значения в каждой итерации путем установки пары "имя-значение" Verbose bayesopt на 1 или 2.

Примечание

Когда существуют связанные ограничения, итеративное отображение и функции построения графика могут дать парадоксальные результаты, такие как:

  • Минимальный объективный график может увеличиться.

  • Оптимизация может объявить проблему, неосуществимую, даже когда она показала более раннюю допустимую точку.

Причина этого поведения состоит в том, что решение о том, выполнима ли точка, может измениться, в то время как оптимизация прогрессирует. bayesopt определяет выполнимость относительно своей ограничительной модели и этой модели изменения, когда bayesopt оценивает точки. Таким образом, “минимальный объективный” график может увеличиться, когда минимальную точку позже считают неосуществимой, и итеративное отображение может показать допустимую точку, которую позже считают неосуществимой.

Для примера смотрите Байесовую Оптимизацию с Двойными Ограничениями.

Байесова оптимизация с двойными ограничениями

Двойное ограничение является тем, которое может быть оценено только путем выполнения целевой функции. В этом случае целевая функция является перекрестной подтвержденной потерей модели SVM. Двойное ограничение состоит в том, что количество векторов поддержки равняется не больше, чем 100. Образцовые детали находятся в, Оптимизируют перекрестный Подтвержденный Классификатор SVM Используя bayesopt.

Создайте данные для классификации.

rng default
grnpop = mvnrnd([1,0],eye(2),10);
redpop = mvnrnd([0,1],eye(2),10);
redpts = zeros(100,2);
grnpts = redpts;
for i = 1:100
    grnpts(i,:) = mvnrnd(grnpop(randi(10),:),eye(2)*0.02);
    redpts(i,:) = mvnrnd(redpop(randi(10),:),eye(2)*0.02);
end
cdata = [grnpts;redpts];
grp = ones(200,1);
grp(101:200) = -1;
c = cvpartition(200,'KFold',10);
sigma = optimizableVariable('sigma',[1e-5,1e5],'Transform','log');
box = optimizableVariable('box',[1e-5,1e5],'Transform','log');

Целевая функция является потерей перекрестной проверки модели SVM для раздела c. Двойное ограничение является количеством векторов поддержки минус 100.5. Это гарантирует, что 100 векторов поддержки дают отрицательное ограничительное значение, но 101 вектор поддержки дает положительное значение. Модель имеет 200 точек данных, таким образом, двойной ограничительный диапазон значений от-99.5 (всегда существует по крайней мере один вектор поддержки) к 99,5. Положительные значения означают, что ограничение не удовлетворено.

function [objective,constraint] = mysvmfun(x,cdata,grp,c)
SVMModel = fitcsvm(cdata,grp,'KernelFunction','rbf',...
    'BoxConstraint',x.box,...
    'KernelScale',x.sigma);
cvModel = crossval(SVMModel,'CVPartition',c);
objective = kfoldLoss(cvModel);
constraint = sum(SVMModel.IsSupportVector)-100.5;

fun = @(x)mysvmfun(x,cdata,grp,c);

Установите NumCoupledConstraints на 1, таким образом, оптимизатор знает, что существует двойное ограничение. Установите опции строить ограничительную модель.

results = bayesopt(fun,[sigma,box],'IsObjectiveDeterministic',true,...
    'NumCoupledConstraints',1,'PlotFcn',...
    {@plotMinObjective,@plotConstraintModels},...
    'AcquisitionFunctionName','expected-improvement-plus','Verbose',0);

Большинство точек приводит к неосуществимому количеству векторов поддержки.

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

|

Похожие темы