Разбираем Actor-Critic — метод, который добавляет контекст к REINFORCE и убирает шум. Узнайте, как две сети работают вместе, и начните применять прямо сейчас.
REINFORCE — простой и понятный алгоритм обучения с подкреплением, но он страдает от высокого шума: удачные эпизоды могут толкать сеть в неправильном направлении, а неудачные — отбрасывать хорошие решения. В этой статье мы разберём Actor-Critic — архитектуру, которая добавляет контекст и радикально снижает дисперсию. Вы узнаете, как две сети работают в паре, увидите рабочий код и поймёте, почему на этой архитектуре построены современные алгоритмы вроде PPO и GRPO.
Представьте баскетболиста, который набрал 15 очков за игру. Это хорошо или плохо? Всё зависит от его обычного уровня: если обычно он набирает 10 — это отличная игра, если 25 — плохая. Число само по себе ничего не говорит без контекста.
REINFORCE работает именно так: он видит возврат (return) 0.7 и обновляет сеть, не зная, хорошо это или плохо для данного состояния. Положительный возврат всегда считается хорошим, отрицательный — плохим. Отсюда шум: удачные эпизоды дают ложный сигнал, неудачные — сбивают с толку.
Actor-Critic решает эту проблему, вводя две сети с разными задачами:
Критик никогда не выбирает действия. Он только наблюдает и оценивает. Его единственная задача — дать актёру более чистый сигнал.
# Актёр: вероятности 4 действий
actor_output = [0.1, 0.3, 0.2, 0.4]
# Критик: оценка ценности состояния
critic_output = 0.72Вместо того чтобы использовать сырой возврат для обновления актёра, мы вычисляем advantage:
advantage = actual_return - critic_estimateЕсли advantage положительный — действие сработало лучше ожидаемого, усиливаем его. Если отрицательный — хуже ожидаемого, ослабляем. Если ноль — ровно среднее, ничего не меняем.
Это простое вычитание убирает огромную часть шума. Проблема «удачного эпизода» исчезает, потому что «лучше ожидаемого» — теперь осмысленный сигнал, а не просто большое число.
Обе сети обновляются после каждого эпизода. Сначала критик (чтобы лучше оценивать), затем актёр (используя свежие оценки):
# Критик: учится предсказывать возврат точнее
critic_loss = (actual_return - critic(state)) ** 2
# Актёр: как в REINFORCE, но с advantage вместо сырого возврата
actor_loss = -advantage * log(probability_of_action_taken)Критик обучается как простая регрессия. Актёр — как REINFORCE, но с более чистым сигналом. Они улучшаются вместе.
После обучения критик научился оценивать ценность состояний в Gridworld:
Критик выучил карту мира, просто наблюдая за игрой актёра. Никто не говорил ему, где дыры — он понял это через опыт.
На Actor-Critic построены все современные алгоритмы RL:
Каждый из них — актёр, выбирающий действия, и что-то, оценивающее качество. Различия только в том, как вычисляется advantage и как стабилизируется обучение.
Откройте свой проект с REINFORCE и добавьте критика. Это всего одна дополнительная сеть с простой регрессионной потерей. Замените сырой возврат на advantage — и вы увидите, как шум уменьшится, а обучение ускорится. Весь код из этой серии, упорядоченный по дням, доступен на GitHub: github.com/MadhumithaKolkar/jax-rl-lab.
Счастливого обучения!
Хочешь закрепить знания на практике?
Решай задачи на Algolit — интерактивная платформа для обучения
Начать бесплатно →