В своем исследовании я наткнулся на эффективный метод обучения под названием Asynchronous Advantage Actor Critic (A3C), опубликованный DeepMind. Этот алгоритм с большим отрывом превосходит знаменитый DQN, а также дает более стабильные результаты. В этом посте я хотел дать подробное объяснение того, как работает алгоритм, надеюсь, вдохновив больше людей применять его в своих проектах. Если вас интересует код, я реализовал алгоритм с использованием Tensorflow и Keras, вдохновленный этой статьей о Medium. Библиотека совместима с OpenAI’s Gym API.

Модели критиков-актеров

Прежде чем мы погрузимся в асинхронную часть, я хотел бы объяснить модели обучения «актер-критик» (AC). В задаче обучения с подкреплением агент существует в некотором состоянии s и пытается выбрать действие a, чтобы максимизировать свои дисконтированные будущие вознаграждения.

Агент AC состоит из актера и критика. Актер пытается изучить политику π (s) (также известную как правило, которому следует агент), получая обратную связь от критика. Критик изучает функцию ценности V (s) (ожидаемый доход в виде вознаграждений), которая используется для определения того, насколько выгодно находиться в определенном состоянии. Преимущество определяется как A (s) = Q (s, a) -V (s). На практике мы не хотим вычислять Q (s, a). Вместо этого мы формулируем оценку функции преимущества как A (s) = r + γV (s ') - V (s),, где r - текущее вознаграждение, а γ - коэффициент дисконтирования. Таким образом достигается тот же результат без необходимости изучения функции Q. Еще более эффективным методом было бы использование обобщенной функции преимущества.

Целевые функции

Если посмотреть на агента-критика с точки зрения нейронной сети, мы дадим агенту два выхода: ценность и политику. Выходные данные значения предсказывают скаляр, который изучает функцию значения V (s). Выход политики π (s) (активация softmax) - это вектор, который представляет распределение вероятностей по действиям. Мы выбираем действие недетерминированно путем выборки из этого распределения вероятностей. Обозначим π (a | s) как вероятность выбранного действия a для данного состояния s.

Мы приходим к следующим функциям потерь (мы хотим их минимизировать). R представляет собой дисконтированное будущее вознаграждение (R = r + γV (s ’)).

Потеря значения: L = Σ (R - V (s)) ² (ошибка в квадрате суммы)

Потеря политики: L = -log (π (a | s)) * A (s)

Но не так быстро! Хотя приведенные выше функции потерь будут работать, лучше ввести в уравнение энтропию H (π).

H (π) = - Σ (P (x) log (P (x))

Энтропия - это мера того, насколько разбросаны вероятности. Чем выше энтропия, тем более схожей будет вероятность каждого действия, что делает агента более неуверенным в выборе действия. Энтропия может быть добавлена ​​к функции потерь, чтобы стимулировать исследование, не позволяя агенту быть слишком решительным и сходиться в локальных оптимумах.

Убыток по полису: L = -log (π (a | s)) * A (s) - β * H (π)

Когда мы объединяем две функции потерь, мы получаем функцию потерь для всей модели:

L = 0,5 * Σ (R - V (s)) ² - журнал (π (a | s)) * A (s) - β * H (π)

Обратите внимание, что потеря ценности установлена ​​на 50%, чтобы изучение политики происходило быстрее, чем изучение ценности. Для получения дополнительной информации о выводе этих функций потерь я рекомендую посмотреть видео Лекция Дэвида Сильвера о RL. С этим мы можем обучить нашего агента по AC!

Асинхронный

Самое интересное в A3C - это первый A - асинхронный. В статье DeepMind показано, что, внедряя асинхронное обучение, мы можем уменьшить корреляцию между эпизодами, улучшая различные методы обучения, включая Q-обучение (повышение эффективности данных). Это также более эффективное использование многоядерных процессоров, позволяющее обучать агентов делать удивительные вещи, используя только ноутбук.

A3C работает, порождая агентов AC миньонов, каждый из которых выполняет действия в своей отдельной среде и обновляет главную нейронную сеть после выполнения определенного количества действий. Отдельные агенты синхронизируют свои веса с главной сетью после каждого обновления градиента.

Вот и все, что вам нужно для общего обзора A3C. Если вас интересует подробная реализация алгоритма, обязательно ознакомьтесь с моим репозиторием Github и отличной статьей на Medium о его реализации.

На следующей неделе я буду следить за этой публикацией о том, как я применил A3C для игры Relay для генерации уровней - это крутая часть! Не стесняйтесь оставлять мне предложения в разделе комментариев!