Агент, среда и награда: цикл взаимодействия

Урок разбирает базовый цикл RL и вводит словарь: агент, среда, состояние, действие, награда.

Цикл взаимодействия — повторяющаяся последовательность: состояние → действие → награда и новое состояние. Из этих кирпичиков собран любой RL-алгоритм.

Кто есть кто

В RL мир делится на две части: агент (тот, кто учится и принимает решения) и среда (всё остальное). Они обмениваются сообщениями по кругу.

  • Состояние (state, обозначают s) — описание ситуации, которое видит агент. В шахматах это расстановка фигур, в игре — кадр экрана.
  • Действие (action, a) — что агент может сделать: «налево», «прыгнуть», «купить».
  • Награда (reward, r) — число, которое среда выдаёт после действия. Это единственный сигнал обучения.

Схема цикла

На каждом такте времени t происходит один оборот:

          действие a_t
   ┌──────────────────────┐
   │                      v
+-------+             +---------+
| Агент |             |  Среда  |
+-------+             +---------+
   ^                      │
   │  состояние s_(t+1),  │
   └─── награда r_(t+1) ──┘

Агент видит состояние, выбирает действие, среда отвечает новым состоянием и наградой — и круг повторяется, пока эпизод не закончится (например, агент дошёл до цели или проиграл).

Возврат: что именно максимизирует агент

Агент стремится не к разовой награде, а к возврату (return) — сумме всех будущих наград. Часто будущие награды учитывают с коэффициентом дисконтирования gamma (о нём — отдельный урок), но идея проста: важна не одна конфета сейчас, а вся цепочка.

# Один эпизод: агент идёт по коридору к выходу.
# Действие "вперёд" даёт -1 (трата времени), достижение выхода даёт +10.
rewards = [-1, -1, -1, -1, 10]   # 4 шага + награда за выход

total_return = sum(rewards)
print("Награды за эпизод:", rewards)
print("Возврат (сумма наград):", total_return)

# Дисконтированный возврат: дальние награды весят меньше
gamma = 0.9
discounted = sum(r * gamma ** t for t, r in enumerate(rewards))
print("Дисконтированный возврат:", round(discounted, 2))

Вывод:

Награды за эпизод: [-1, -1, -1, -1, 10]
Возврат (сумма наград): 6
Дисконтированный возврат: 3.12

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

Среда — это «чёрный ящик» с двумя функциями: reset() возвращает начальное состояние, а step(action) принимает действие и возвращает четвёрку «новое состояние, награда, флаг конца, доп. информация». Именно такой интерфейс закрепил стандарт Gymnasium, к которому мы вернёмся в конце курса. Агент же — это любая логика, которая по состоянию выбирает действие; в простейшем случае это словарь «состояние → действие», а в сложном — нейросеть.

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

  • Считать, что агент видит весь мир. Он видит только состояние, которое выдаёт среда. Если состояние неполное, агент работает «вслепую».
  • Награждать за процесс, а не за цель. Если щедро награждать за каждый шаг, агент может научиться бесконечно ходить, а не доходить до выхода. Награда должна вести к настоящей цели.
  • Забывать про конец эпизода. Без терминального состояния возврат может расти бесконечно, и обучение разъезжается.

Итоги

  • Цикл RL: состояние → действие → награда и новое состояние, и так по кругу.
  • Агент максимизирует возврат — сумму будущих наград, а не разовую награду.
  • Стандартный интерфейс среды — reset() и step(action).
Проверьте себя
1. Что агент получает от среды после совершения действия?
AТолько новое состояние
BНовое состояние и награду
CТолько награду
DГотовую стратегию
2. Что такое возврат (return) в RL?
AНаграда за последний шаг
BСумма (возможно дисконтированная) будущих наград
CЧисло состояний
DКоличество действий агента
3. Зачем нужен флаг конца эпизода (terminal state)?
AЧтобы ускорить GPU
BЧтобы возврат был конечным и обучение не разъезжалось
CЧтобы увеличить награду
DОн не нужен