Многорукие бандиты

Обучение с подкреплением с Gymnasium на Python

Fouad Trad

Machine Learning Engineer

Многорукие бандиты

 

  • Игрок перед игровыми автоматами
  • Задача → максимизировать выигрыш
  • Решение → исследование и эксплуатация

Изображение: мужчина стоит перед рядом игровых автоматов

Обучение с подкреплением с Gymnasium на Python

Игровые автоматы

Изображение: 4 игровых автомата с разными вероятностями выигрыша — 45%, 35%, 85% и 62% — неизвестными пользователю.

  • Награда за выбор рычага — 0 или 1
  • Цель агента → накопить максимальную награду
Обучение с подкреплением с Gymnasium на Python

Решение задачи

 

  • Убывающий эпсилон-жадный алгоритм
  • Эпсилон → выбор случайного автомата

Диаграмма: с вероятностью эпсилон агент исследует, выбирая автомат случайным образом.

Обучение с подкреплением с Gymnasium на Python

Решение задачи

 

  • Убывающий эпсилон-жадный алгоритм
  • Эпсилон → выбор случайного автомата
  • 1 - эпсилон → выбор лучшего автомата на данный момент
  • Эпсилон убывает со временем

Диаграмма: с вероятностью эпсилон агент исследует, выбирая случайный автомат, а с вероятностью 1 - эпсилон эксплуатирует лучший известный автомат.

Обучение с подкреплением с Gymnasium на Python

Инициализация

n_bandits = 4  
true_bandit_probs = np.random.rand(n_bandits)

n_iterations = 100000 epsilon = 1.0 min_epsilon = 0.01 epsilon_decay = 0.999
counts = np.zeros(n_bandits) # How many times each bandit was played
values = np.zeros(n_bandits) # Estimated winning probability of each bandit
rewards = np.zeros(n_iterations) # Reward history
selected_arms = np.zeros(n_iterations, dtype=int) # Arm selection history
Обучение с подкреплением с Gymnasium на Python

Цикл взаимодействия

for i in range(n_iterations):
    arm = epsilon_greedy()

reward = np.random.rand() < true_bandit_probs[arm]
rewards[i] = reward selected_arms[i] = arm counts[arm] += 1
values[arm] += (reward - values[arm]) / counts[arm]
epsilon = max(min_epsilon, epsilon * epsilon_decay)
Обучение с подкреплением с Gymnasium на Python

Анализ выборов

selections_percentage = np.zeros((n_iterations, n_bandits))


Диаграмма: первый шаг — массив размера (iterations, n_bandits), заполненный нулями.

Обучение с подкреплением с Gymnasium на Python

Анализ выборов

selections_percentage = np.zeros((n_iterations, n_bandits))

for i in range(n_iterations): selections_percentage[i, selected_arms[i]] = 1

Диаграмма: второй шаг — выбранный рычаг в каждой итерации отмечается значением 1 в массиве.

Обучение с подкреплением с Gymnasium на Python

Анализ выборов

selections_percentage = np.zeros((n_iterations, n_bandits))

for i in range(n_iterations): selections_percentage[i, selected_arms[i]] = 1
selections_percentage = np.cumsum(selections_percentage, axis=0) / np.arange(1, n_iterations + 1).reshape(-1, 1)

Диаграмма: последние шаги — вычисляется накопленная сумма выборов бандитов, затем делится на номер итерации для получения доли выбора каждого рычага.

Обучение с подкреплением с Gymnasium на Python

Анализ выборов

  График доли выборов каждого бандита: по мере роста числа итераций агент всё чаще выбирает бандита №2.

for arm in range(n_bandits):
    plt.plot(selections_percentage[:, arm], label=f'Bandit #{arm+1}')
plt.xscale('log')
plt.title('Bandit Action Choices Over Time')
plt.xlabel('Episode Number')
plt.ylabel('Percentage of Bandit Selections (%)')
plt.legend()
plt.show()

for i, prob in enumerate(true_bandit_probs, 1): print(f"Bandit #{i} -> {prob:.2f}")
Bandit #1 -> 0.37
Bandit #2 -> 0.95
Bandit #3 -> 0.73
Bandit #4 -> 0.60
  • Агент учится выбирать бандита с наибольшей вероятностью выигрыша
Обучение с подкреплением с Gymnasium на Python

Давайте потренируемся!

Обучение с подкреплением с Gymnasium на Python

Preparing Video For Download...