Эта статья предназначена для тех, кто знаком с самыми основами TensorFlow и хочет создать что-то интересное самостоятельно. На протяжении всей этой статьи мы пытаемся решить классическую задачу управления балансированием подвижного перевернутого маятника над тележкой. OpenAI Gym предоставляет нам среду, и все, что нам нужно сделать, это сосредоточиться на улучшении алгоритма обучения для решения проблемы.
Чтобы установить Gym, выполните следующие действия: https://pypi.org/project/gym/0.7.4/

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

Начнем с политики, которая выполняет случайное действие и полностью игнорирует текущее состояние и значение вознаграждения.

Неудивительно, что тележка не может уравновесить шест. Если вы когда-либо посещали занятия по теории управления, то вам может показаться очевидным, что контроллер с обратной связью решает проблему. Если нет, то не беспокойтесь. Вы, конечно, можете следовать вместе.
Вам нужно наблюдать за состоянием тележки и шеста, чтобы принять решение. Состояние, которое среда возвращает нам, представляет собой вектор, который включает в себя положение тележки, скорость тележки, угол полюса и угловую скорость полюса. Итак, наше состояние представляет собой вектор 4*1.

Мы подходим к этой проблеме, определяя функцию, которая отображает состояние в действие. Пусть W — матрица 2*4. Q линейная функция состояния определяется как:
Q(s) = W * s
Основываясь на двух элементах Q, мы принимаем решение о наших действиях.
action = 0 if Q[0] › Q[1] else action = 1
Итак, что мы собираемся сделать:
1. случайным образом инициализируем матрицу W,
2. запустить симуляцию и получить вознаграждение :D
3. на основе вознаграждения настроить матрицу W так, чтобы она каждый раз давала нам надежный вектор Q.
Для шага номер 3 мы будем использовать TensorFlow.

Перед этим разберемся, что означает вектор Q. Наш вектор Q состоит из двух значений Q, каждое из которых соответствует двум возможным действиям, которые мы можем предпринять в любом состоянии.
Значение Q, соответствующее действию «а», дает нам сумму текущих и всех будущих вознаграждений, которые мы собираемся получить. Из-за неопределенности будущие вознаграждения умножаются на ставки дисконтирования. Если R и γ обозначают вознаграждение и ставку дисконтирования соответственно, то

Почему так? Подумайте об этом, потому что по определению значение Q следующей пары состояния и действия представляет собой сумму всех вознаграждений, связанных с настоящим и будущим экземплярами. Это дает нам следующую архитектурную сеть, которую мы будем использовать в нашем коде:

Наша цель — найти оптимальное W, которое минимизирует стоимость. Не смотри на меня с недоумением. TensorFlow сделает всю работу за нас. Давайте сначала импортируем некоторые библиотеки и инициализируем некоторые переменные.

Теперь создадим архитектуру с помощью библиотеки TensorFlow.

Теперь мы готовы обучить нашу модель.

Скорее всего, тележка балансировала шест несколько раз, прежде чем все серии закончились! Если нет, вы можете либо запустить всю программу снова, либо просто запустить последнюю ячейку, чтобы продолжить обучение для следующих 500 эпизодов. Вы также можете загрузить лучшее W, которое вы сохранили.

Наконец-то конец урока! Теперь ты должен пойти и получить награду для себя!!

Что вы можете попробовать дальше?
Этот учебник представляет собой введение в Q-обучение. Поиграйте со своим кодом. То, что мы только что завершили, явно не лучший алгоритм. Вы заметили, что функция стоимости не очень хороша? Кроме того, вы можете использовать глубокую сеть для более точного прогнозирования вектора Q вместо использования одной матрицы W. Вы можете внедрить Q-обучение в свой собственный проект. Вы можете использовать аналогичный алгоритм для решения других задач OpenAI Gym.