Люди использовали обучение с подкреплением для решения множества интересных задач. Будь то такие простые, как игры 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]. Если потребуется, я с радостью предоставлю вам личное сопровождение.