Изграждане на основата: Внедряване на байесова оптимизация в Python

Бейсовата оптимизация е техника, използвана за глобална (оптимална) оптимизация на функциите на черната кутия.

Черната кутия е система, чиято вътрешна работа е неизвестна на наблюдателя. Тя може да има достъп само до входовете и изходите на системата, но не знае как системата достига до изходи въз основа на входовете. В контекста на оптимизацията функцията на черната кутия се отнася до целева функция.

За да илюстрираме, разгледайте функция f, която е недостъпна за нас. Не можем да получим директен достъп до f или да изчислим неговите градиенти. Единствената ни налична информация е предоставянето на вход x и получаването на оценка с шум (или без никакъв шум) на истинския изход.

Нашата цел е да оптимизираме основната стойност в рамките на функцията на черната кутия f според нашата цел, като я максимизираме например.

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

Байесовото оптимизиране предлага няколко предимства пред традиционните методи. Първо, той ефективно се справя със скъпи и шумни функционални оценки чрез изграждане на вероятностен сурогатен модел, който улавя несигурността и ръководи процеса на търсене интелигентно.

Той включва предишни знания или вярвания относно целевата функция, което позволява по-информирано вземане на решения.

Той също така балансира проучването и експлоатацията. Проучването позволява по-широко изследване на пространството за търсене, потенциално откриване на по-добри решения, докато експлоатацията се фокусира върху използването на известни обещаващи области за оптимизиране на текущото най-добро решение. Балансирането на тези два аспекта е от решаващо значение за намирането на по-добри решения и прецизиране на най-доброто решение.

Класическите бандитни алгоритми използват честотни граници за моделиране на неизвестната функция. Бандитните проблеми са клас от последователни проблеми за вземане на решения, които включват избор на действия от набор от опции (ръка) за поредица от стъпки или периоди от време. Всяко рамо има неизвестно разпределение на наградата, свързано с него, и целта е да се увеличи максимално кумулативната награда, получена чрез стратегически избор на ръцете.

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

Показателят за ефективност се отнася до настройката за съжаление. Настройката за съжаление е рамка, използвана за анализиране и количествено определяне на ефективността на алгоритмите или политиките за вземане на решения при проблеми с последователни решения. Той измерва кумулативната разлика между ефективността на избрана политика и оптималната политика, която би могла да бъде избрана в заден план.

  • Метрика за офлайн производителност: Метриката за офлайн производителност оценява алгоритъма или политиката, като използва информация от заден план. Той измерва колко добре би работил алгоритъмът, ако имаше достъп до пълния набор от данни или информация от самото начало. С други думи, той измерва ефективността въз основа на възможно най-добрите ретроспективни познания.
  • Метрика за онлайн ефективност: Метриката за онлайн ефективност, от друга страна, оценява алгоритъма или политиката в по-реалистичен сценарий, при който решенията се вземат последователно с ограничена информация. Той измерва ефективността въз основа на действително взетите решения и техните резултати без достъп до бъдеща информация. Онлайн показателят за производителност отразява производителността на алгоритъма в реалния свят в динамична и несигурна среда.

Оста X на куба показва техниката на моделиране, която може да бъде байесова или честотна. На оста Z кубът показва връзката между променливите, по-специално дали една променлива предоставя информация или представа за друга променлива или не.

Алгоритъм

Дадено: функция f(x)иискаме да я увеличим максимално. И имаме някои данни за f.

Стъпки:

  1. Първоначална проба:Започнете, като изберете ограничен набор от пробни точки на случаен принцип.
  2. Инициализиране на модела: Използвайте тези точки, за да изчислите сурогатна функция.
  3. Итерация:

3.1. Функция за придобиване:Използвайте функцията за придобиване и вземете следващата точка.

3.2. Актуализирайте модела: Преоценете заместващата функция.

3.3. Точка на валидиране: Проверете дали заместващата функция остава стабилна или дали дисперсията пада под предварително определен праг, или ако fе изчерпана, в зависимост от вашата конкретна цел на дизайна.

Дадена функция

Например, нека създадем функция черна кутия, която комбинира функциите синус и косинус, за да генерира изход.

import numpy as np
import matplotlib.pyplot as plt
np.random.seed(42)

def black_box_function(x):
    y = np.sin(x) + np.cos(2*x)
    return y

# range of x values
x_range = np.linspace(-2*np.pi, 2*np.pi, 100)

# output for each x value
black_box_output = black_box_function(x_range)

# plot
plt.plot(x_range, black_box_output)
plt.xlabel('x')
plt.ylabel('y')
plt.title('Black Box Function Output')
plt.show()

Функционалните стойности за всяка x стойност (x_range) се изчисляват с помощта на black_box_function и след това изходът се изобразява.

Първоначална проба

Примерни резултати от функцияf.

# random x values for sampling
num_samples = 10
sample_x = np.random.choice(x_range, size=num_samples)

# output for each sampled x value
sample_y = black_box_function(sample_x)

# plot
plt.plot(x_range, black_box_function(x_range), label='Black Box Function')
plt.scatter(sample_x, sample_y, color='red', label='Samples')
plt.xlabel('x')
plt.ylabel('Black Box Output')
plt.title('Sampled Points')
plt.legend()
plt.show()

Моделиране

Сурогатните модели в байесовската оптимизация служат като заместител на истинската целева функция. Те улавят несигурността в поведението на функцията и предоставят прогнози или оценки на стойностите на функцията в ненаблюдавани точки в пространството за търсене. Чрез итеративно актуализиране на заместващия модел въз основа на оценките на наблюдаваната функция, байесовото оптимизиране насочва търсенето към региони от пространството за търсене, които вероятно съдържат оптималното решение.

Ние се стремим да разработим модел, означен като M, който притежава способността не само да предоставя прогнози, но и да запазва мярка за несигурност, свързана с тези прогнози. За тази цел ще приемем следния предварително дефиниран интерфейс:

  • наблюдавайте(M, x, y): записвайте наблюдения -› Всички
  • предсказване(M, x): прави предсказания -› Всички
  • sample(M, x): примерни стойности на латентна функция -› Thompson
  • getTail(M, v, x): вероятността за превишаване наx -› PI
  • getImprovement(M, v, x): интегралът над v-› EI
  • getQuantile(M, q, x):qтият квантил -› UCB
  • getEntropy(M, x): прогнозната ентропия -› P(ES)

Способността да се изпълняват различни процедури показва типовете подходи и функции за придобиване, които могат да бъдат използвани в класа на модела. Първите две са приложими във всички байесови оптимизационни модели. Освен това, например, ако имате достъп до вероятностите на опашката, можете да използвате метода на вероятността за подобрение (PI).

Гаусов процес

Гаусовите процеси (GP) обикновено се използват като сурогатни модели в байесовската оптимизация. Процесът на Гаус дефинира разпределение върху функции, където всеки краен набор от стойности на функции следва многомерно разпределение на Гаус. В контекста на байесовската оптимизация, GP се използва за моделиране на неизвестната целева функция и осигурява последващо разпределение върху стойностите на функцията, дадени на наблюдаваните данни.

GP е напълно специфициран от своята средна функция и ковариационна функция (наричана също функция на ядрото). Средната функция представлява очакваната стойност на функцията във всяка входна точка, докато ковариационната функция характеризира връзката между различните входни точки и контролира плавността и поведението на генерираната функция.

Като се има предвид набор от наблюдавани данни, GP може да се използва за правене на прогнози за стойностите на функцията в ненаблюдавани точки. Тези прогнози се основават на наблюдаваните данни и основните допускания, кодирани в средни и ковариационни функции. Важно е, че общопрактикуващите лекари осигуряват мярка за несигурност, свързана с тези прогнози, което позволява принципно справяне с несигурността в прогнозите.

В области с ограничени предварителни познания процесите на Гаус са особено полезни, защото разчитат на предположението, че подобни входове водят до подобни резултати. Това прави процесите на Гаус подходящи за откриване на модели и тенденции в данните, когато няма много предварителна информация.

Когато конструираме нашия модел, приемаме, че той показва случаен процес, е стационарен и се придържа към разпределение на Гаус. Случайният процес се отнася до математически модел, който описва еволюцията на система или явление във времето, където резултатите са обект на несигурност или случайност. Стационарността, в контекста на случаен процес, предполага, че статистическите свойства на процеса остават постоянни във времето. По-конкретно, това означава, че средната стойност, дисперсията и автоковариацията на процеса не се променят по отношение на времето или изместванията в началото на времето.

Притежаваме масив, f, представящ стойностите на функция черна кутия за всички нейни елементи. Предполагаме, че този масив следва нормално разпределение.

Функцията за плътност на вероятността ще приеме формата на функция за плътност на Гаус.

Тъй като приемаме стационарност, съвместното разпределение на вероятностите остава постоянно във времето, което означава, че е инвариантно във времето. Средната стойност на функцията е m. Очаква се ковариацията да има форма на Гаус и може да бъде апроксимирана с помощта на ядрото на радиална базисна функция (RBF).

След това се нуждаем от функция за прогнозиране, която има за цел да оцени вероятността на функцията f (x), предвид наличните данни, с които разполагаме.

Нормално разпределение с 0 средни стойности и ~C ковариация спрямо нормалното разпределение с 0 средни стойности и C ковариация.

Сега можем да го опростим.

k е масив от RBF ядра. C е ковариационната матрица.

Използвайки тази функция за прогнозиране, можем да заключим, че средно неизвестната функция ще приеме стойността μ при x, придружена от дисперсия на σ.

И така, алгоритъмът за сурогатната функция е повече или по-малко:

  1. Итерация през всяка примерна стойност на вход x, за която желаем да извършим оценка.
  • Изградете вектори k и f с помощта на ядрото на RBF.
  • Изграждане на матрици C иC~.
  • Изчислете μ и σ.
  • Добавете μ към масива predictedMu и σ към масивите predictedSigma.

2. Изчислете Омега като средна стойност на функцията на черната кутия за извадени точки.

3. Изчислете Капа = прогнозирано Mu + Омега

4. Връщане:

  • Капа, средната оценка на заместващата функция
  • predictedSigma,оценката на дисперсията от заместващата функция.
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF

# Gaussian process regressor with an RBF kernel
kernel = RBF(length_scale=1.0)
gp_model = GaussianProcessRegressor(kernel=kernel)

# Fit the Gaussian process model to the sampled points
gp_model.fit(sample_x.reshape(-1, 1), sample_y)

# Generate predictions using the Gaussian process model
y_pred, y_std = gp_model.predict(x_range.reshape(-1, 1), return_std=True)

# Plot 
plt.figure(figsize=(10, 6))
plt.plot(x_range, black_box_function(x_range), label='Black Box Function')
plt.scatter(sample_x, sample_y, color='red', label='Samples')
plt.plot(x_range, y_pred, color='blue', label='Gaussian Process')
plt.fill_between(x_range, y_pred - 2*y_std, y_pred + 2*y_std, color='blue', alpha=0.2)
plt.xlabel('x')
plt.ylabel('Black Box Output')
plt.title('Black Box Function with Gaussian Process Surrogate Model')
plt.legend()
plt.show()

Функция за придобиване

Как да изберем следващата точка за заместващата функция?

Функциите за придобиване определят следващата точка или набор от точки за оценка в пространството за търсене. Той определя количествено потенциалната полезност или желателност от вземане на проби от определена точка въз основа на текущото състояние на процеса на оптимизация. Целта на функцията за придобиване е да балансира проучването и експлоатацията.

Той взема предвид както прогнозираните стойности на сурогатния модел, така и несигурността, свързана с тези прогнози. Той комбинира тези два аспекта, за да идентифицира точки, за които се очаква да имат високи стойности на обективната функция и (или) висока несигурност, което показва потенциала за подобрение.

Има няколко функции за придобиване, използвани в байесовската оптимизация:

  • Очакваното подобрение (EI) избира точки, които имат потенциал да подобрят най-добре наблюдаваната стойност. Той определя количествено очакваното подобрение спрямо текущата най-добра стойност и взема предвид както средната прогноза на сурогатния модел, така и неговата несигурност.
from scipy.stats import norm

def expected_improvement(x, gp_model, best_y):
    y_pred, y_std = gp_model.predict(x.reshape(-1, 1), return_std=True)
    z = (y_pred - best_y) / y_std
    ei = (y_pred - best_y) * norm.cdf(z) + y_std * norm.pdf(z)
    return ei

# Determine the point with the highest observed function value
best_idx = np.argmax(sample_y)
best_x = sample_x[best_idx]
best_y = sample_y[best_idx]

ei = expected_improvement(x_range, gp_model, best_y)

# Plot the expected improvement
plt.figure(figsize=(10, 6))
plt.plot(x_range, ei, color='green', label='Expected Improvement')
plt.xlabel('x')
plt.ylabel('Expected Improvement')
plt.title('Expected Improvement')
plt.legend()
plt.show()

  • Горната граница на доверието (UCB) прави компромис между проучването и експлоатацията чрез балансиране на средната прогноза на сурогатния модел и термин на проучване, пропорционален на несигурността. Той избира точки, които предлагат добър баланс между прогнозирани високи стойности и изследване на несигурни региони.
def upper_confidence_bound(x, gp_model, beta):
    y_pred, y_std = gp_model.predict(x.reshape(-1, 1), return_std=True)
    ucb = y_pred + beta * y_std
    return ucb

beta = 2.0

# UCB
ucb = upper_confidence_bound(x_range, gp_model, beta)

plt.figure(figsize=(10, 6))
plt.plot(x_range, ucb, color='green', label='UCB')
plt.xlabel('x')
plt.ylabel('UCB')
plt.title('UCB')
plt.legend()
plt.show()

  • Вероятността за подобрение (PI) оценява вероятността дадена точка да се подобри спрямо текущата най-добра стойност. Той взема предвид разликата между средната прогноза и текущата най-добра стойност, като взема предвид несигурността в сурогатния модел.
def probability_of_improvement(x, gp_model, best_y):
    y_pred, y_std = gp_model.predict(x.reshape(-1, 1), return_std=True)
    z = (y_pred - best_y) / y_std
    pi = norm.cdf(z)
    return pi

# Probability of Improvement
pi = probability_of_improvement(x_range, gp_model, best_y)


plt.figure(figsize=(10, 6))
plt.plot(x_range, pi, color='green', label='PI')
plt.xlabel('x')
plt.ylabel('PI')
plt.title('PI')
plt.legend()
plt.show()

Независимо от използвания подход, ние избираме точката, която има най-висока стойност на оста y.

num_iterations = 5

plt.figure(figsize=(10, 6))

for i in range(num_iterations):
    # Fit the Gaussian process model to the sampled points
    gp_model.fit(sample_x.reshape(-1, 1), sample_y)

    # Determine the point with the highest observed function value
    best_idx = np.argmax(sample_y)
    best_x = sample_x[best_idx]
    best_y = sample_y[best_idx]

    # Set the value of beta for the UCB acquisition function
    beta = 2.0

    # Generate the Upper Confidence Bound (UCB) using the Gaussian process model
    ucb = upper_confidence_bound(x_range, gp_model, beta)

    # Plot the black box function, surrogate function, previous points, and new points
    plt.plot(x_range, black_box_function(x_range), color='black', label='Black Box Function')
    plt.plot(x_range, ucb, color='red', linestyle='dashed', label='Surrogate Function')
    plt.scatter(sample_x, sample_y, color='blue', label='Previous Points')
    if i < num_iterations - 1:
        new_x = x_range[np.argmax(ucb)]  # Select the next point based on UCB
        new_y = black_box_function(new_x)
        sample_x = np.append(sample_x, new_x)
        sample_y = np.append(sample_y, new_y)
        plt.scatter(new_x, new_y, color='green', label='New Points')

    plt.xlabel('x')
    plt.ylabel('y')
    plt.title(f"Iteration #{i+1}")
    plt.legend()
    plt.show()

Готино, нали? Продължава да се учи и подобрява във всяка итерация.

Байесовото оптимизиране предлага няколко положителни аспекта. Едно от основните му предимства е възможността за оптимизиране на функциите на черната кутия, които нямат аналитични градиенти или имат шумни оценки. Използването на заместващ модел, като например процес на Гаус, балансира проучването и експлоатацията за ефективно търсене на оптималното решение. Той предоставя принципен подход за итеративно избиране на точки, които предлагат добър компромис между изследване на неизследвани региони и експлоатация на обещаващи области.

Намира приложения в различни области. Той е особено подходящ за настройка на хиперпараметри при машинно обучение. Може да се използва за оптимизиране на сложни симулации, експериментални проекти и други сценарии, при които оценката на целевата функция е скъпа или отнема много време.

Прочетете още















Източници

https://www.researchgate.net/publication/322035981_Per_Instance_Algorithm_Configuration_for_Continuous_Black_Box_Optimization

https://www.researchgate.net/publication/341691661_A_Kernel_Design_Approach_to_Improve_Kernel_Subspace_Identification

https://nesslabs.com/exploration-exploitation-ambidextrous-mindset-success-trap

https://www.youtube.com/watch?v=C5nqEHpdyoE

https://www.researchgate.net/publication/334714068_Low-Cost_Multi-Objective_Optimization_of_Multiparameter_Antenna_Structures_Based_on_the_l1_Optimization_BPNN_Surrogate_Model

https://www.researchgate.net/publication/327613136_Bayesian_optimization_for_likelihood-free_cosmological_inference