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

Границы

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 - таблица ширины D произвольной высоты.

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

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

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

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

Например, предположим, что переменные с именем '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> значения.

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

Xnew = condvariablefcn(X)
  • X является видо- 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 для любого стохастического ограничения.

Наблюдайте связанные значения ограничений в каждой итерации, установив bayesopt Verbose Пара "имя-значение" с 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;

Передайте разделы c и подбор данных cdata и grp к целевой функции fun путем создания fun как анонимная функция, которая включает в себя эти данные. См. Параметризация функций.

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);

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

См. также

|

Похожие темы