Оптимизация работы с байесовскими бандитами с использованием Stochastic Machine Learning (SML)

Работа с байесовскими бандитами. Часть 2. Стохастическое машинное обучение 2.0.4: настройка и эксперименты

Работа с байесовскими бандитами. Часть 2. Стохастическое машинное обучение 2.0.4

Введение

В предыдущей статье мы рассмотрели основы байесовских бандитов. В этой статье мы углубимся в более практические аспекты работы с байесовскими бандитами, используя библиотеку 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, чтобы узнать больше о возможностях библиотеки.

To leave a comment you need to Login / Create account