Реализация TensorFlow 2.x для DDPG и TD3
В этой статье мы будем реализовывать методы градиента глубокой детерминированной политики и градиента глубокой детерминированной политики с двойной задержкой с помощью TensorFlow 2.x. Мы не будем углубляться в теорию и рассмотрим только самое необходимое. Прежде чем продолжить, рекомендуется ознакомиться с DQN и Double DQN. Для этой статьи я преобразовал код Td3 PyTorch доктора Фила в TensorFlow, а для DDPG я взял его целевой метод обновления сети. Пожалуйста, обратитесь к его каналу на YouTube здесь (лучший канал на YouTube для кодирования RL).
ДДПГ:
DDPG используется для сред с непрерывным пространством действия. DDPG сочетает в себе идеи как DQN, так и актерско-критического метода. Попробуем разобраться с кодом.
Сети:
- Наша сеть критиков принимает состояние и действие в качестве входных данных, и эти входные данные объединяются вместе.
- Критическая сеть выводит значение для действия в определенном состоянии.
- Мы используем непрерывную среду, поэтому мы используем активацию tanh (выходные значения ч/б -1 и 1), а вывод — это продолжительность действия, т.е. в «LunarLanderContinuous-v2» действие представлено в виде массива [-1 1] , поэтому здесь длина равна 2.
Выбор класса агента и действия:
- В DDPG у нас есть целевые сети как для актера, так и для критика, как и в DQN, у нас есть целевая сеть.
- Обратите внимание, что мы скомпилировали наши целевые сети, так как мы не хотим получить ошибку при копировании весов из основных сетей в целевые сети.
- Мы также использовали буфер воспроизведения для хранения опыта.
- Для выбора действия сначала мы преобразуем наше состояние в тензор, а затем передаем его в актор-сеть.
- Для обучения мы добавили шум в действии, а для тестирования шум добавлять не будем.
- Мы обрежем наше действие ч/б диапазоном максимального и минимального значения действия.
Обновить целевую сеть:
- Обновление целевых сетей в ddpg и td3 использует мягкие обновления, т.е. мы каждый раз немного обновляем веса.
- Сети могут быть обновлены, как показано ниже, как описано в исследовательской статье.
Функция поезда:
- Во-первых, мы берем опыт из нашего буфера воспроизведения и конвертируем его в тензоры.
- Целевое значение потери критика рассчитывается путем прогнозирования действий для следующих состояний с использованием целевой сети актора, а затем с помощью этих действий мы получаем значения следующего состояния с использованием целевой сети критика.
- Затем мы применяем уравнение Беллмана для расчета целевых значений (target_values = вознаграждение + self.gamma * target_next_state_values * done). Обратите внимание, что во время тренировки выполненное сохраняется как (1-готово).
- Наши прогнозируемые значения являются выходными данными основной сети критиков, которая принимает состояния и действия из буферной выборки.
- Критические потери затем рассчитываются как MSE целевых значений и прогнозируемых значений.
- Потери актера рассчитываются как отрицательные значения основных значений критика с входными данными, поскольку действия главного актера предсказываются.
- Затем мы обновляем наши целевые сети с тау 0,005.
Цикл обучения:
- Наш цикл обучения прост, т. е. он взаимодействует, накапливает опыт и учится на каждом этапе действия.
TD3PG:
TD3 вдохновлен двойным DQN и решает проблему завышения критических значений и имеет следующие изменения по сравнению с DDPG.
- Использование двух основных сетей критиков, кроме их целевых сетей.
- Задержка обновления для актерской сети.
- Регуляция шумов действий.
Мы рассмотрим только отличия кода от DDPG.
Класс агента:
- В классе агентов у нас есть 2 основные сети критиков и соответствующие им целевые сети.
- При выборе действия мы перестаем добавлять шум к действиям через несколько шагов.
Функция поезда:
- В функции поезда td3 есть только 3 отличия от функции DDPG.
- Во-первых, действия из целевой сети актера упорядочиваются путем добавления шума, а затем отсечения действия в диапазоне максимального и минимального действия.
- Во-вторых, значения следующего состояния и значения текущего состояния являются как целевыми критическими, так и обеими основными критическими сетями. И как минимум две сети учитываются как для значений следующего состояния, так и для значений текущего состояния.
- В-третьих, актор-сеть обучается через каждые 2 шага.
Итак, все дело в различиях в реализации. Теперь посмотрим на результаты тренировок.
DDPG против TD3PG:
На этих двух графиках показаны эпизоды, использованные обоими алгоритмами для достижения среднего балла 200 в «LunarLanderContinuous-v2» за последние 100 эпизодов.
Как видите, алгоритм TD3 получил в среднем 200 наград за последние 100 эпизодов всего за 400 эпизодов. В то время как DDPG получил только 100 после 560 серий.
На что обратить внимание при реализации:
При кодировании RL следует помнить о следующих вещах.
- Количество нейронов, скрытых слоев, скорость обучения оказывают огромное влияние на обучение.
- Форма тензоров и массива NumPy должны быть правильными. Во многих случаях реализация правильная, и коды работают, но агент ничего не узнает только потому, что форма тензоров неверна, и когда операции применяются к этим тензорам, они дают неправильные результаты.
Полный код этой статьи вы можете найти здесь и здесь. Следите за будущими статьями, в которых мы будем реализовывать еще несколько алгоритмов RL и алгоритмов глубокого обучения в TensorFlow 2.
Итак, на этом статья заканчивается. Спасибо за прочтение, надеюсь, вам понравилось и вы смогли понять то, что я хотел объяснить. Надеюсь, вы читаете мои будущие статьи. Хари Ом…🙏