Люди использовали обучение с подкреплением для решения множества интересных задач. Будь то такие простые, как игры atari, или такие сложные, как Го и Дота. Обучение с подкреплением не только способно решать поставленные задачи, но и обеспечивает сверхчеловеческую производительность.
В этом блоге мы не просто собираемся решить еще одну среду обучения с подкреплением, но и создадим ее с нуля.
Для тех, кто не знаком с обучением с подкреплением и интересуется, что такое среда, позвольте мне сделать краткое введение. Даже если вы новичок в машинном обучении, к концу этого блога вы узнаете много нового.
Обучение с подкреплением | Краткое введение
Обучение с подкреплением - это ветвь машинного обучения, в которой у нас есть агент и среда. Среда - это не что иное, как задача или симуляция, а Агент - это алгоритм ИИ, который взаимодействует с окружающей средой и пытается ее решить.
На диаграмме ниже окружение представляет собой лабиринт. Цель агента - решить этот лабиринт, предприняв оптимальные действия.
Из диаграммы видно, как агент и среда взаимодействуют друг с другом. Агент отправляет действие в среду, а среда отправляет наблюдение и вознаграждение агенту после выполнения каждого действия, полученного от агента. Наблюдение - это не что иное, как внутреннее состояние окружающей среды. А награда означает, насколько хорошо было действие. По мере прохождения блога это станет яснее.
Итак, нам нужны 2 вещи, чтобы применить обучение с подкреплением.
- Агент: алгоритм ИИ.
- Среда: задача / симуляция, которую должен решить агент.
Среда взаимодействует с агентом, отправляя его состояние и вознаграждение. Таким образом, ниже приведены шаги по созданию среды.
- Создайте Моделирование.
- Добавьте вектор состояния, который представляет внутреннее состояние моделирования.
- Добавьте систему вознаграждений в моделирование.
Теперь приступим к созданию среды.
Создание среды
Я собираюсь создать действительно простую игру на Python. После завершения игры мы можем добавить в нее вектор состояния и систему вознаграждения. Вот и все, у нас есть первая среда обучения с подкреплением.
Эта игра будет простой игрой с веслом и мячом. Где у нас весло на земле, а весло должно попадать в движущийся мяч. Если мяч касается земли вместо ракетки, это промах.
Я собираюсь использовать встроенный в Python модуль turtle. Turtle предоставляет легкий и простой интерфейс для создания и перемещения различных фигур. Большая часть кода не требует пояснений, поэтому я просто дам вам краткое представление о коде. Пока нет необходимости углубляться в синтаксис кода.
Давайте создадим фоновое окно для нашей игры.
Мы создали пустое окно размером (600, 600)
пикселей. Координата средней точки окна (0, 0)
. Значит, мы можем двигаться вверх-вниз и влево-вправо на 300 пикселей.
Круто, 10% среда завершена. Давайте добавим весло внизу и шарик в центр.
Отлично, 20% среда готова. Давайте добавим движение весла влево и вправо при нажатии клавиш влево и вправо.
Мы создали 2 функции для перемещения весла влево и вправо. Затем мы связываем эти функции левой и правой клавишами. Означает, что при нажатии клавиши со стрелкой вправо вызывается функция paddle_right и ракетка перемещается вправо на 20 пикселей.
Отлично, мы выполнили 30% среды. Давайте теперь добавим движение мяча.
Для мяча я установил горизонтальную скорость на 3 и вертикальную скорость на -3. Означает, что мяч перемещается на 3 пикселя по горизонтали и -3 пикселя по вертикали после каждого кадра. Итак, для каждого кадра мы должны обновлять положение мяча в нашем основном цикле, используя его скорость.
Готово на 40%. Но подождите, мяч просто пересек экран. Он должен был столкнуться с боковыми стенками. Таким образом, мы должны ввести в код следующие проверки границ.
- Мяч должен столкнуться с верхним и боковым шарами.
- Мяч должен столкнуться с ракеткой.
- Если мяч касается земли, игра должна начаться заново.
Выглядит неплохо. Это сделано на 70%. Давайте забьем последний гвоздь в гроб - оценочную карточку.
Мы поддерживаем 2 переменные с именами hit
и miss
. Если мяч попал в ракетку, мы увеличиваем hit
, иначе miss
. Затем мы можем создать карту результатов, которая печатает счет в верхней средней части экрана.
Теперь это похоже на настоящую игру. Мы завершили 90% -ную среду. Осталось добавить в это моделирование вектор состояния и систему вознаграждения .
Государственный вектор и система вознаграждений
Мы передаем вектор состояния нашему ИИ-агенту, и агент выбирает действие на основе этого состояния. Вектор состояния должен содержать ценную информацию. Качество действия, предпринимаемого агентом, зависит от того, насколько информативен вектор состояния.
Я создал вектор состояния, который содержит следующую информацию.
- Положение лопасти по оси x
- Положение мяча по осям x и y
- Скорость мяча по осям x и y.
Ниже приводится система вознаграждений, которую я реализовал.
- Дайте награду в
+3
, если мяч коснется ракетки - Дайте награду в размере
-3
, если мяч не попадает в ракетку. - Дайте награду
-0.1
каждый раз, когда весло движется, чтобы весло не двигалось без необходимости.
Мы также должны реализовать пространство действий. Агент выберет одно из действий из области действий и отправит его в среду. Ниже приведено пространство действий, которое я реализовал.
0
- Переместите весло влево.1
- Ничего не делать.2
- Переместите весло вправо.
Агент отправит в среду одно из этих чисел, и среда выполнит действие, соответствующее этим числам.
Все это упаковано в эту крошечную функцию step. Это функция, в которой агент взаимодействует с окружающей средой. Агент вызывает эту функцию и предоставляет значение действия в аргументе. И эта функция возвращает агенту вектор состояния и вознаграждение. Эта функция возвращает еще одну переменную, которая завершена. Это говорит агенту о том, что погодный эпизод прекращен или нет. В нашем случае эпизод завершается, когда мяч касается земли, и начинается новый эпизод. Код будет иметь гораздо больше смысла, когда вы увидите его вместе.
Наконец, все готово на 100%. Выглядит неплохо. Давай решим это сейчас.
Решение проблемы окружающей среды
Основное внимание в этом блоге уделяется созданию среды. Поэтому я очень кратко расскажу об алгоритме агента в этом блоге.
Я реализовал алгоритм DQN для решения этой задачи. В основе этого алгоритма мы используем нейронную сеть, которая принимает состояния в качестве входных данных и выводит действие. В DQN гораздо больше возможностей, которые вы всегда можете проверить в этой замечательной статье DQN.
Ниже приведен отрывок с агентом, играющим в игру. Весло часто начинает отбивать мяч после 49 промахов.
Ниже приводится сюжет награды / эпизодов. Агент начинает получать частые высокие награды после 30 эпизодов.
На этом пока все. Мы создали действительно простую среду с нуля и решили ее с помощью DQN. Ниже представлен репозиторий GitHub, содержащий полный код. Я буду публиковать больше интересных проектов, а пока следите за обновлениями.
Примечание
Я разрабатываю проект с открытым исходным кодом под названием Орбита, который будет представлять собой набор сред обучения с подкреплением. Если у вас есть интересная идея и вы внесете свой вклад в этот пакет, создав свою собственную среду, напишите мне на [email protected]. Если потребуется, я с радостью предоставлю вам личное сопровождение.