Введение
В предыдущей статье мы рассмотрели основы байесовских бандитов. В этой статье мы углубимся в более практические аспекты работы с байесовскими бандитами, используя библиотеку Stochastic Machine Learning (SML) для Python
Настройка SML
Чтобы использовать SML, нам сначала нужно установить его с помощью пипе:
pip install stochastic_ml
Затем мы можем импортировать библиотеку следующим образом:
import stochastic_ml as sml
Создание байесовского бандита
SML предоставляет класс Bandit
для создания представлений байесовских бандитов. Чтобы создать бандит, нам нужно указать распределение вероятностей, представляющее вознаграждения, связанные с действиями.
Например, предположим, что мы хотим создать бандит с 5 действиями, где вознаграждения для каждого действия определяются нормальным распределением со случайным средним и дисперсией. Мы можем создать такой бандит следующим образом:
bandit = sml.Bandit(dist="normal", num_actions=5, mu=0, sigma=1)
Выбор действий
После создания бандита мы можем выбрать действия на основе текущего апостериорного распределения вознаграждений. SML предоставляет функцию choose_arm()
, которую мы можем использовать для выбора действий. Аргумент model
функции принимает модель Bandit
action = bandit.choose_arm(model)
Обновление бандита
После выбора действия мы должны обновить бандит с помощью наблюдаемого вознаграждения. SML предоставляет функцию update()
, которую мы можем использовать для обновления бандита. Аргумент reward
функции принимает наблюдаемое вознаграждение.
bandit.update(action, reward)
Эксперименты с Байесовскими Бандитами
Теперь, когда у нас есть понимание того, как использовать SML для создания и обновления байесовских бандитов, давайте применим эти знания для проведения нескольких простых экспериментов.
Эксперимент 1: Сравнение стратегий выбора
В этом эксперименте мы сравним различные стратегии выбора действий, такие как epsilon-greedy
и greedy
, Thompson sampling
. Мы оценим, какая стратегия дает лучшие средние вознаграждения в течение 10000 шагов.
import numpy as np
# Создание и инициализация бандита
bandit = sml.Bandit(dist="normal", num_actions=5, mu=0, sigma=1)
# Установка гиперпараметров для каждой стратегии
epsilon = 0.1
temperature = 1.0
# Повторение для всех стратегий
for strategy in ["epsilon-greedy", "greedy", "thompson_sampling"]:
# Инициализация среднего вознаграждения для каждой стратегии
avg_reward = 0.0
# Повторение для всех шагов
for _ in range(10000):
# Выбор действия с использованием заданной стратегии
if strategy == "epsilon-greedy":
action = bandit.choose_arm_epsilon_greedy(model, epsilon)
elif strategy == "greedy":
action = bandit.choose_arm_greedy(model)
elif strategy == "thompson_sampling":
action = bandit.choose_arm_thompson_sampling(model, temperature)
# Получение вознаграждения для выбранного действия
reward = np.random.normal(loc=bandit.mu[action], scale=bandit.sigma[action])
# Обновление бандита
bandit.update(action, reward)
# Обновление среднего вознаграждения
avg_reward += reward / 10000
# Вывод среднего вознаграждения для каждой стратегии
print(f"Среднее вознаграждение для {strategy}: {avg_reward}")
Эксперимент 2: Определение оптимального подтягивания за шнурок
В этом эксперименте мы используем байесовские бандиты для определения оптимальной силы подтягивания за шнурок, чтобы поднять тяжелый предмет. Мы будем моделировать подтягивание за шнурок как нормальное распределение с неизвестным средним и дисперсией.
import matplotlib.pyplot as plt
# Создание и инициализация бандита
bandit = sml.Bandit(dist="normal", num_actions=100, mu=0, sigma=1)
# Установка гиперпараметров
num_steps = 100
num_experiments = 10
# Повторение для всех экспериментов
for i in range(num_experiments):
# Инициализация средних вознаграждений
avg_rewards = np.zeros(num_steps)
# Повторение для всех шагов
for j in range(num_steps):
# Выбор силы подтягивания за шнурок
force = bandit.choose_arm_greedy(model)
# Получение вознаграждения (высоты, на которую поднят предмет)
reward = np.random.normal(loc=force, scale=1)
# Обновление бандита
bandit.update(force, reward)
# Обновление средних вознаграждений
avg_rewards[j] += reward / num_experiments
# Отрисовка средних вознаграждений
plt.plot(avg_rewards, label=f"Эксперимент {i+1}")
# Вывод графика средних вознаграждений для всех экспериментов
plt.legend()
plt.xlabel("Шаг")
plt.ylabel("Среднее вознаграждение")
plt.show()
Вывод
В этой статье мы показали, как использовать библиотеку SML для создания, обновления и проведения экспериментов с байесовскими бандитами. SML предоставляет удобный и эффективный способ работы с байесовскими бандитами для решения проблем машинного обучения. Мы рекомендуем изучить документацию SML, чтобы узнать больше о возможностях библиотеки.