Стратегия epsilon-greedy

Урок разбирает epsilon-greedy — самый простой и популярный способ балансировать исследование и использование.

epsilon-greedy — стратегия выбора действия: с вероятностью epsilon агент берёт случайное действие (исследует), а с вероятностью 1 минус epsilon — действие с максимальной оценкой (использует).

Как это устроено

Идея предельно проста. Берём число epsilon, например 0.1. Перед каждым действием бросаем «монетку»: с вероятностью 10% выбираем случайное действие, в остальных 90% — лучшее по текущей Q-оценке. Так агент почти всегда поступает разумно, но иногда пробует что-то новое, чтобы не упустить лучший вариант.

import random
random.seed(7)

Q = [1.5, 3.0, 0.5]   # оценки трёх действий, лучшее — индекс 1

def epsilon_greedy(Q, eps):
    if random.random() < eps:
        return random.randint(0, len(Q) - 1)        # исследование
    return max(range(len(Q)), key=lambda i: Q[i])   # использование

counts = [0, 0, 0]
for _ in range(1000):
    counts[epsilon_greedy(Q, 0.3)] += 1

print("Выборы действий за 1000 шагов:", counts)
print("Лучшее действие (индекс 1) выбрано чаще всего:", counts[1] == max(counts))

Вывод:

Выборы действий за 1000 шагов: [124, 767, 109]
Лучшее действие (индекс 1) выбрано чаще всего: True

При epsilon=0.3 действие 1 выбирается примерно в 70% + доля случайных попаданий, а оставшиеся попытки уходят на исследование других действий. Так агент и эксплуатирует лучшее, и продолжает проверять остальные.

Затухание epsilon

На практике epsilon обычно делают убывающим: начинают с большого (например, 1.0 — чистое исследование) и постепенно снижают до маленького (0.01). Логика та же, что в прошлом уроке: исследуй активно, пока знаешь мало, и переходи к использованию, когда оценки стали надёжными.

epsilon по эпизодам (линейное затухание 1.0 -> 0.05):
эпизод 0:    1.00   (всё случайно)
эпизод 250:  0.52
эпизод 500:  0.05   (почти только лучшее действие)

Как работает под капотом

epsilon-greedy гарантирует, что каждое действие в каждом состоянии будет испробовано бесконечно много раз (если epsilon>0). Это важное теоретическое условие сходимости Q-learning: чтобы оценить ценность действия, его нужно периодически пробовать. Слабость метода — исследование «вслепую»: случайное действие выбирается равновероятно, без учёта того, какие действия перспективнее. Более умные стратегии (UCB, softmax) исправляют это.

Частые ошибки

  • Слишком большой постоянный epsilon. Агент будет много шуметь и наберёт мало награды даже после обучения.
  • epsilon = 0 с самого начала. Это чистая жадность — агент не исследует и легко застревает.
  • Снижать epsilon слишком быстро. Агент не успеет собрать достаточно опыта и зафиксирует неоптимальную политику.

Итоги

  • epsilon-greedy: с вероятностью epsilon — случайное действие, иначе — лучшее по оценке.
  • epsilon обычно делают затухающим: много исследования в начале, мало в конце.
  • Это простой способ обеспечить достаточное исследование, но он исследует «вслепую».
Проверьте себя
1. Как действует epsilon-greedy?
AВсегда выбирает случайное действие
BС вероятностью epsilon — случайное действие, иначе — лучшее по оценке
CВсегда выбирает лучшее по оценке
DВыбирает действие по очереди
2. Зачем epsilon обычно делают затухающим со временем?
AЧтобы экономить память
BЧтобы много исследовать в начале и больше использовать к концу обучения
CЧтобы ускорить GPU
DЧтобы агент перестал действовать
3. В чём слабость epsilon-greedy по сравнению с UCB или softmax?
AОн не сходится никогда
BОн исследует вслепую — случайное действие выбирается равновероятно, без учёта перспективности
CОн требует модель среды
DОн не использует награды