Глубокое обучение с подкреплением с помощью Python | Часть 1 | Создание окружающей среды
В этой серии руководств мы рассмотрим каждый этап создания опытного агента обучения с подкреплением (RL), способного играть в игры.
Эта серия разделена на три части:
- Часть 1: проектирование и создание игровой среды. В этой части мы создадим игровую среду и настроим ее, чтобы агент RL мог на ней тренироваться.
- Часть 2: создание и обучение нейронной сети Deep Q (DQN). В этой части мы определяем и строим различные уровни DQN и обучаем их.
- Часть 3: протестируйте и играйте.
Мы также можем попробовать создать другую простую игровую среду и использовать Q-Learning для создания агента, который сможет играть в эту простую игру.
Мотивация:
Однажды я был в кроличьей норе YouTube и мне порекомендовали ЭТО ВИДЕО, оно касалось самоощущения у человеческих младенцев, после просмотра видео мне в голову пришел похожий вопрос Могу ли я разработать умного агента, который будет достаточно умен, чтобы чувствовать свое тело, и способен изменять свои функции для выполнения определенной задачи?
Эта серия статей - мой способ ответить на этот вопрос.
Проектирование окружающей среды:
В этой среде мы хотим, чтобы агент развил чувство своего тела и то, как изменить его особенности, чтобы не проиграть игру.
Во-первых: элементы окружающей среды:
1- Поле содержит все остальные элементы. Мы представляем его в коде классом с именем «Поле» следующим образом:
Атрибуты поля:
- width (int) : ширина поля (не в пикселях).
- height (int: высота поля (не в пикселях)
- body (np.array) : содержит представление массива игровых элементов (игрока и стен). Этот массив передается в DQN и также используется для рисования интерфейса с помощью pygame.
Field методы:
- update_field (сам, стены, игрок): обновляет поле.
2- Стены:
Атрибуты стены:
Методы стены:
- create_hole (self): создает отверстие в стене, ширина которого равна собственной ширине. hole_width.
- move (self): перемещает стену по вертикали (при каждом вызове стена перемещается на n шагов вниз (n = self.speed)).
3- Игрок:
Атрибуты игрока:
Методы Player:
- move (self, field, direction = 0): перемещает игрока:
- direction = 0 - ›Без изменений
- direction = 1 - ›влево
- direction = 2 - ›вправо
- change_width (self, action = 0):
- action = 0 - ›Без изменений
- action = 3 - ›сузить на одну единицу
- action = 4 - ›увеличить на одну единицу
Класс Environment:
Этот класс облегчает связь между средой и агентом, он предназначен для использования с агентом RL или с игроком-человеком.
Основные компоненты, необходимые агенту RL:
1- Атрибут ENVIRONMENT_SHAPE: используется DQN для установки формы входного слоя.
Атрибут 2- ACTION_SPACE: используется DQN для установки формы выходного слоя.
3- НАКАЗАНИЕ и НАГРАДА: установите значения как наказания, так и вознаграждения, используемых для обучения агента (мы используем эти значения, чтобы сообщить агенту, были ли его предыдущие действия хорошими или плохими).
4- Метод сброса: для сброса среды.
5- шаг: принимает действие в качестве аргумента и возвращает следующее состояние, вознаграждение, логическая переменная с именем game_over, которая сообщает нам, закончилась игра (игрок проиграл) или нет.
Понятно, что эта среда ничем не отличается, она включает в себя все необходимые компоненты и многое другое.
Атрибуты среды:
Методы Environment:
- __init__ (self): инициализирует среду, инициализируя некоторые атрибуты и вызывая метод reset.
- сброс (самостоятельно): сбрасывает среду и возвращает состояние игрового поля после его сброса.
- print_text (self, WINDOW = None, text_cords = (0,0), center = False, text = «», color = (0,0,0), size = 32): печатает текст в заданном pygame.display (WINDOW) с заданными функциями.
+ шаг (собственное действие, действие):
1- Вызовите метод перемещения игрока, чтобы переместить игрока.
2- Вызовите метод change_width игрока, чтобы переместить игрока.
3- Переместите стену на один шаг.
4- Обновите поле.
5- Проверьте, успешно ли игрок прошел стену. Если да, дает игроку награду и увеличивает его выносливость.
6- Отметьте три условия проигрыша: игрок проигрывает, если выполнено хотя бы одно из этих трех условий.
когда игрок проигрывает, значение возвращаемой награды будет равно НАКАЗАНИЕ, а индикатор состояния игры (game_over ) изменяется с false на true.
7- Проверьте, попадает ли текущая стена в нижнюю часть поля, когда это происходит, стена вне диапазона заменяется новой стеной.
8- Возврат next_state normalized, reward, game_over
+ render (self, WINDOW = None, human = False):
Аргументы:
- WINDOW (pygame.display): pygame.display, на котором будет отображаться игра.
- human (bool): если в игру будет играть человек, этот аргумент имеет значение True, в этом случае pygame перехватывает нажатые клавиши клавиатуры, чтобы получить действие, которое будет выполнено. .
Объяснение метода render построчно:
1- Проверьте, является ли игрок человеком. Если это так, возьмите нажатую клавишу и преобразуйте ее в соответствующее действие (например, если нажата стрелка вправо, установите действие = 2, что означает перемещение игрока на шаг вправо), затем вызовите step для выполнения выбранного действия.
2- Обновите поле, затем начните рисовать стены и игрока в виде блоков.
3- Выведите счет и выносливость игрока.
4- Наконец, обновите дисплей, чтобы отобразить отображаемый экран.
Наконец: соберите все вместе
Теперь мы воспользуемся всем, что мы объяснили, и сыграем в игру:
Следующий код повторяет игру до тех пор, пока игрок не выиграет, набрав более или равный Win_score,, или не выйдет из игры.
Вы можете получить полный код ЗДЕСЬ.
Вы можете подписаться на меня в Twitter @ModMaamari