Реализация TensorFlow 2.x для DDPG и TD3

В этой статье мы будем реализовывать методы градиента глубокой детерминированной политики и градиента глубокой детерминированной политики с двойной задержкой с помощью TensorFlow 2.x. Мы не будем углубляться в теорию и рассмотрим только самое необходимое. Прежде чем продолжить, рекомендуется ознакомиться с DQN и Double DQN. Для этой статьи я преобразовал код Td3 PyTorch доктора Фила в TensorFlow, а для DDPG я взял его целевой метод обновления сети. Пожалуйста, обратитесь к его каналу на YouTube здесь (лучший канал на YouTube для кодирования RL).

ДДПГ:

DDPG используется для сред с непрерывным пространством действия. DDPG сочетает в себе идеи как DQN, так и актерско-критического метода. Попробуем разобраться с кодом.

Сети:

  1. Наша сеть критиков принимает состояние и действие в качестве входных данных, и эти входные данные объединяются вместе.
  2. Критическая сеть выводит значение для действия в определенном состоянии.
  3. Мы используем непрерывную среду, поэтому мы используем активацию tanh (выходные значения ч/б -1 и 1), а вывод — это продолжительность действия, т.е. в «LunarLanderContinuous-v2» действие представлено в виде массива [-1 1] , поэтому здесь длина равна 2.

Выбор класса агента и действия:

  1. В DDPG у нас есть целевые сети как для актера, так и для критика, как и в DQN, у нас есть целевая сеть.
  2. Обратите внимание, что мы скомпилировали наши целевые сети, так как мы не хотим получить ошибку при копировании весов из основных сетей в целевые сети.
  3. Мы также использовали буфер воспроизведения для хранения опыта.
  4. Для выбора действия сначала мы преобразуем наше состояние в тензор, а затем передаем его в актор-сеть.
  5. Для обучения мы добавили шум в действии, а для тестирования шум добавлять не будем.
  6. Мы обрежем наше действие ч/б диапазоном максимального и минимального значения действия.

Обновить целевую сеть:

  1. Обновление целевых сетей в ddpg и td3 использует мягкие обновления, т.е. мы каждый раз немного обновляем веса.
  2. Сети могут быть обновлены, как показано ниже, как описано в исследовательской статье.

Функция поезда:

  1. Во-первых, мы берем опыт из нашего буфера воспроизведения и конвертируем его в тензоры.
  2. Целевое значение потери критика рассчитывается путем прогнозирования действий для следующих состояний с использованием целевой сети актора, а затем с помощью этих действий мы получаем значения следующего состояния с использованием целевой сети критика.
  3. Затем мы применяем уравнение Беллмана для расчета целевых значений (target_values ​​= вознаграждение + self.gamma * target_next_state_values ​​* done). Обратите внимание, что во время тренировки выполненное сохраняется как (1-готово).
  4. Наши прогнозируемые значения являются выходными данными основной сети критиков, которая принимает состояния и действия из буферной выборки.
  5. Критические потери затем рассчитываются как MSE целевых значений и прогнозируемых значений.
  6. Потери актера рассчитываются как отрицательные значения основных значений критика с входными данными, поскольку действия главного актера предсказываются.
  7. Затем мы обновляем наши целевые сети с тау 0,005.

Цикл обучения:

  1. Наш цикл обучения прост, т. е. он взаимодействует, накапливает опыт и учится на каждом этапе действия.

TD3PG:

TD3 вдохновлен двойным DQN и решает проблему завышения критических значений и имеет следующие изменения по сравнению с DDPG.

  1. Использование двух основных сетей критиков, кроме их целевых сетей.
  2. Задержка обновления для актерской сети.
  3. Регуляция шумов действий.

Мы рассмотрим только отличия кода от DDPG.

Класс агента:

  1. В классе агентов у нас есть 2 основные сети критиков и соответствующие им целевые сети.
  2. При выборе действия мы перестаем добавлять шум к действиям через несколько шагов.

Функция поезда:

  1. В функции поезда td3 есть только 3 отличия от функции DDPG.
  2. Во-первых, действия из целевой сети актера упорядочиваются путем добавления шума, а затем отсечения действия в диапазоне максимального и минимального действия.
  3. Во-вторых, значения следующего состояния и значения текущего состояния являются как целевыми критическими, так и обеими основными критическими сетями. И как минимум две сети учитываются как для значений следующего состояния, так и для значений текущего состояния.
  4. В-третьих, актор-сеть обучается через каждые 2 шага.

Итак, все дело в различиях в реализации. Теперь посмотрим на результаты тренировок.

DDPG против TD3PG:

На этих двух графиках показаны эпизоды, использованные обоими алгоритмами для достижения среднего балла 200 в «LunarLanderContinuous-v2» за последние 100 эпизодов.

Как видите, алгоритм TD3 получил в среднем 200 наград за последние 100 эпизодов всего за 400 эпизодов. В то время как DDPG получил только 100 после 560 серий.

На что обратить внимание при реализации:

При кодировании RL следует помнить о следующих вещах.

  1. Количество нейронов, скрытых слоев, скорость обучения оказывают огромное влияние на обучение.
  2. Форма тензоров и массива NumPy должны быть правильными. Во многих случаях реализация правильная, и коды работают, но агент ничего не узнает только потому, что форма тензоров неверна, и когда операции применяются к этим тензорам, они дают неправильные результаты.

Полный код этой статьи вы можете найти здесь и здесь. Следите за будущими статьями, в которых мы будем реализовывать еще несколько алгоритмов RL и алгоритмов глубокого обучения в TensorFlow 2.

Итак, на этом статья заканчивается. Спасибо за прочтение, надеюсь, вам понравилось и вы смогли понять то, что я хотел объяснить. Надеюсь, вы читаете мои будущие статьи. Хари Ом…🙏

Использованная литература: