Глубокое обучение с подкреплением: глубокое обучение на языке Python

Введение и обеспечение курса

Здравствуйте и добро пожаловать на занятия по теме «Глубокое обучение с подкреплением: глубокое обучение на языке Python, часть 7».

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

Обучение с подкреплением существует примерно с 70-х годов, однако до сих пор ничего подобного не было возможным. Мир очень быстро меняется. Штат Калифорния меняет правила дорожного движения, чтобы компании, производящие беспилотные автомобили, могли тестировать их без контроля человека за рулём.

Мы видели, что обучение с подкреплением – это совершенно другой вид машинного обучения, нежели обучение с учителем или без. Алгоритмы обучения с учителем и без него предназначены для анализа и прогнозирования данных, тогда как обучение с подкреплением полностью посвящено обучению агента взаимодействию со средой и максимизации своего вознаграждения. Разумеется, если речь идёт о воспринимаемой агентом среде, это тоже данные, однако способ взаимодействия тут совершенно другой. Они имеют временную природу, то есть данные рассматриваются как последовательность, и происходят в режиме реального времени, то есть агент действует таким образом, что оказывает влияние на окружение и, следовательно, оказывает влияние на последующие показания своих датчиков.

В отличие от алгоритмов машинного обучения с учителем и без, агенты обучения с подкреплением имеют стимул – они хотят достичь цели. Это открывает настолько захватывающие перспективы, что потом обучение с учителем и без него может даже показаться скучными. Зачем обучать нейронную сеть данным из базы данных, если можно обучить её взаимодействовать с реальным миром?

Хотя глубокое обучение с подкреплением и ИИ имеют большой потенциал, они же несут и огромный риск. Билл Гейтс и Илон Маск сделали публичные заявления о некоторых рисках, которые ИИ несут для экономической стабильности и даже самому нашему существованию. Как вы знаете из моего первого курса по обучению с подкреплением, один из главных принципов обучения агентов обучения с подкреплением состоит в том, что при обучении ИИ возникают непредвиденные последствия. ИИ думает не так, как люди, и поэтому изобретает новые и неочевидные решения для достижения своих целей, зачастую удивляя даже экспертов – людей, лучших в своей области.

OpenAI – это некоммерческая организация, основанная Илоном Маском, Сэмом Альтманом и другими, с целью гарантировать, что ИИ будет развиваться так, чтобы приносить пользу, а не вред. Частично мотивом для создания OpenAI является смертельно опасный риск, который ИИ представляет для людей. Они полагают, что открытое сотрудничество является одним из ключевых условий для снижения этого риска.

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

Одна из целей моего первого курса по обучению с подкреплением состояла в том, чтобы подготовить вас к содержанию этого курса. В то же время тот курс сам по себе был большим, поэтому вы должны отдавать себе отчёт, что если вы хотите быть гарантированно готовым к этому курсу, то вам необходимо владеть и иметь опыт работы с большим массивом обязательных предварительных знаний. На самом деле я посвятил целую часть данного курса лишь для того, чтобы сделать обзор всего того, что вы должны знать, а также ключевых принципов.

Что ещё есть в этом курсе?

После обзора необходимых основ мы начнём создавать агентов обучения с подкреплением для некоторых избранных окружений в OpenAI Gym. Такой подход очень отличается от принятого в моём предыдущем курсе по обучению с подкреплением, где мы создавали собственную среду. Я предложил в качестве аналогии, что это было подобно игре в «режиме бога»,  поскольку мы знали всё об игре и могли видеть всё, что внутри. Разумеется, создать свои собственные окружения нереально – это равносильно созданию собственных видеоигр, а эта задача занимает годы работы целой команды для всего одной игры. OpenAI Gym даёт нам сверхпростой стандартный интерфейс для всех таких окружений, так что нам не придётся ломать голову над тем, чтобы понять, как с ними взаимодействовать.

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

Это классическая задача обучения с подкреплением, целью которой является как можно дольше удерживать шест на тележке. Мы также обучим агента задаче машины на склоне – ещё одной классической задаче обучения с подкреплением. Тут целью является приложить нужное усилие в нужное время, чтобы машина смогла взобраться на вершину горы. Сама машина не может выдать достаточную мощность, чтобы самостоятельно добраться до вершины, поэтому должна использовать импульс, чтобы взобраться на склон.

Ключевым в понимании этих задач является то, что если агент научится их решать, то он, по сути, изучит физику. Если же он изучит физику, то может научиться физически передвигаться в реальном мире. В качестве примера приведу одного из роботов компании Boston Dynamics, чтобы вы знали, что всё это действительно работает, – уже есть компании, которые всё это действительно делают!

После шеста на тележке и машины на склоне мы рассмотрим одну или несколько игр Atari. Игра в видеоигры – это важный этап, который необходимо пройти для создания разумных агентов в реальном мире.

Видеоигры содержат больший набор действий, нежели шест на тележке и машина склоне, а состояния не всегда отображают полное знание окружающей среды. К примеру, выгляньте на картинку из игры Breakout. Можете ли вы сказать, движется ли мяч к отбивающему «веслу» или от него? Это неясно, поскольку это неподвижное изображение и это вся информация, которую мы можем получить из данного состояния. Ввиду этого, как вы убедитесь, важным становится моделирование последовательностей.

Однако хватит о рассматриваемых окружениях. Что насчёт методов, которые мы будем изучать? В моём прошлом курсе по обучению с подкреплением мы изучили три главных метода решения марковских процессов принятия решений (MDP). Это динамическое программирование, метод Монте-Карло и метод временных разниц. Мы узнали, что в конечном итоге нам необходимо решить так называемую проблему управления – научиться оптимальной стратегии, когда в каком бы состоянии мы ни были, мы всегда выбираем лучшее действие, основываясь на данном состоянии. Мы также узнали, что при нахождении оптимальной стратегии одной из важных составляющих является оптимальная функция ценности. Мы выдели, что сохранение словаря, отображающего состояния и действия в ценности и именуемого Q-таблицей, мы в конечном итоге находим оптимальную стратегию путём итерационного её обновления, основанного на опыте.

Затем мы обнаружили, что Q-таблицы приносят не так уж много пользы, поскольку в общем случае пространство состояний растёт по экспоненте, а потому мы не в состоянии использовать их, кроме как для самых маленьких игр. Далее мы рассмотрели методы приближений, позволяющие нам уменьшить большие и, возможно, бесконечные пространства состояний. Ключевым в использованных нами для обучения с подкреплением приближениях функций является то, что все они дифференцируемы или, другими словами, мы можем обучаться им, используя градиентный спуск, о котором вы узнали в предыдущих курсах по глубокому обучению. В моём первом курсе по обучению с подкреплением мы ограничились линейными моделями, однако я заявлял, что можно подключить и использовать любую дифференцируемую модель, такую как нейронная сеть. В этом курсе вы узнаете, что это не всегда так. На самом деле встраивание глубокой нейронной сети в агентов при их создании просто не будет работать. Можно получить правильный синтаксис и нейронная сеть может создать впечатление приближения некоторой функции, однако всё это будет работать не так, как задумывалось.

В этом курсе мы начнём с рассмотрения RBF-сетей. Они довольно старые, но хорошо работают в обучении с подкреплением, а кроме того, хорошо вписываются в контекст того, чем мы занимались в предыдущем курсе, поэтому являются хорошей переходной ступенью к более продвинутым темам данного курса.

После того, как мы научимся создавать RBF-сети, мы расширим наши знания об обучении методом временных разниц. До сих пор мы знали только о TD(0), однако вы увидите, что идея, лежащая в основе TD(0), может быть расширена до N-шагового метода и более общего метода TD(λ).

Затем мы познакомимся с методом, который одновременно использует не одну, а две функции приближений. В частности, мы используем одну нейронную сеть для обучения функции ценности, а вторую – для обучения стратегии. Это называется методом градиента по стратегиям.

И наконец мы рассмотрим глубокое Q-обучение. На первый взгляд может показаться, что мы уже это проходили – и глубокое обучение, и Q-обучение.

Однако напомню моё предыдущее замечание о том, что нельзя просто встроить и использовать нейронные сети к агентам как таковым – они просто недостаточно стабильно работают. Исследователи придумали множество хитростей, позволяющих использовать глубокие нейронные сети в агентах обучения с подкреплением. Одной из них является так называемое воспроизведение опыта, подсказку о которой я дал в своём предыдущем курсе. Идея в том, что по мере того, как агент отыгрывает эпизод, он собирает набор кортежей из состояний, действий и вознаграждений – нечто вроде набора данных, подобному тем, что используются в обучении с учителем. В этом случае необязательно проводить стохастический градиентный спуск, как мы это делали в предыдущем курсе, когда следовали за градиентом для одного примера за раз. Вместо этого можно вычислить градиент по отношению к ряду предыдущих примеров, что помогает стабилизировать функцию затрат и, следовательно, градиент. Нам понадобится и множество других хитростей, чтобы заставить работать глубокое Q-обучение, просто подождите и сами увидите, что они из себя представляют.

Где взять код

Весь код из моих курсов по машинному обучению находится в репозитарии Github по адресу

https://github.com/lazyprogrammer/machine_learning_examples

Папка, соответствующая этому курсу, называется rl2.

Команда для загрузки кода выглядит так: git clone, а затем адрес моей страницы на Github, которую вы можете скопировать из домашней страницы репозитария:

git clone git@github.com:lazyprogrammer/machine_learning_examples.git

Я рекомендую использовать сетевой протокол SSH, чтобы не приходилось каждый раз вводить свой пароль на Github. Периодически проверяйте наличие обновлений при помощи команды git pull, чтобы всегда иметь последнюю версию кода.

В этом курсе нет каких-либо данных, поскольку все виды среды, которые мы будем использовать, находятся в OpenAI Gym.

Если вы не знаете, как пользоваться Github, или вам нужна помощь в настройке среды разработки с соответствующими библиотеками языка Python, ознакомьтесь с лекцией по настройке среды в приложении. Я рассчитываю, что на данном этапе все эти вещи для вас, вероятно, уже тривиальны – данный курс создавался с учётом именно этого.

Как уже упоминалось, для этого курса нам понадобится одна дополнительная библиотека – OpenAI Gym. К счастью, установить её очень легко. Для первой части курса нам понадобится только базовая установка, которая проводится просто по команде

sudo pip install gym

Позже, когда мы будем обучать наших агентов в среде игр Atari, нам также понадобится компонент Atari, который можно установить с помощью команды

sudo pip install gym[atari]

Или, если вы хотите установить всё сразу, можно использовать команду

sudo pip install gym[all]

Если же вам понадобится больше информации, можете перейти по адресу

https://gym.openai.com/docs

Некоторые сложности могут появиться, если вы работаете на Mac. Вы получите сообщение об ошибке, если у вас не установлено CMake. Простейший способ установить его – запустить команду

brew install cmake

Тут используется систему Homebrew, которую также придётся установить, если она ещё не установлена. Сделать это крайне легко – просто скопируйте команду с их сайта.

Я всегда советую своим слушателям писать код самостоятельно, однако если вы застряли или вам нужна помощь, код в моём репозитарии Github уже был проверен на работоспособность, поэтому вы всегда можете сверить свой код с моим.

Порой меня спрашивают, на чём можно попрактиковаться в этом курсе. Практика заключается в реализации изученных алгоритмов и проверке их вариаций. Дело в том, что одно дело – смотреть лекции по теории и понимать концепции в общих чертах, и совсем другое – понимать настолько хорошо, чтобы можно было самостоятельно реализовать их в коде без чьей-либо помощи. Это именно то, что делают программисты, и именно такой подход вы должны использовать. Позвольте чётко пояснить: вы не должны просто просматривать видео, так как в конце концов вы ничего не запомните. Я советую не поступать так, поскольку в таком случае у вас ничего не получится. Поэтому проявляйте инициативу и активность – именно для таких людей предназначен этот курс. Только пытаясь написать код самостоятельно и стараясь разобраться в деталях, вы действительно начнёте понимать, о чём идёт речь.

Как успешно пройти этот курс

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

Я пришёл к этим рекомендациям после многих лет обучения и обнаружил, что слушатели, следующим им, в основном достигают успеха, тогда как затруднения, как правило, связаны с тем, что они этим рекомендациям не следуют. Если вы уже видели эту лекцию, можете её пропустить. Однако обратите внимание, что это сокращённая версия лекции; полная версия находится в приложениях.

Рекомендация № 1. Активно пользуйтесь разделом вопросов и ответов (Q&A). Как правило, вы получите ответ в течение нескольких часов, может, даже нескольких минут, если окажется, что я на сайте и получил уведомление. Не забывайте, что я хочу, чтобы вы добились успеха. Нет никакого оправдания ситуации, когда вы запутались, поскольку всё, что сбивает с толку, может быть легко разъяснено в разделе вопросов и ответов. Иногда я могу попросить вас выяснить что-либо самостоятельно, но это лишь потому, что я уверен в вашей способности свести концы с концами и что это поможет вам найти правильный ответ. Подобного рода вещи ведут к наилучшему пониманию; в этом случае вы ничего не забудете – а это произойдёт, если я просто скажу ответ, над которым вам не придётся поработать.

Рекомендация № 2. Убедитесь, что ваши знания соответствуют необходимым предпосылкам этого курса. Предпосылки перечислены в описании курса, и их можно бесплатно посмотреть до того, как подписываться на какой-либо курс на сайте. Надеюсь, знания соответствуют. Если нет, то множество понятий из этого курса покажутся просто бессмысленными. Хотя тут есть краткий обзор предыдущего материала, но нужно знать меру: мы не можем сделать обзор предыдущего обзора или даже обзор предыдущего обзора предыдущего обзора. Как понимаете, это быстро выходит из-под контроля да и становится неактуальным для многих слушателей. Если же вам нужен обзор на обзор, то, вероятно, вам в любом случае придётся многое навёрстывать. Поэтому, если вам нужна дополнительная информация, пожалуйста, обратите внимание, что я уже предоставил к ней доступ во многих местах. Просто задавайте вопрос в разделе вопросов и ответов.

Рекомендация № 3. Реализуйте в коде всё, что мы изучили. Лекции с кодом призваны помочь тем, кто предпочитает именно такой подход. Однако, это может не подходить лично вам. Я порекомендовал несколько возможных подходов в лекции «Как писать код самостоятельно», который вы можете найти в приложении. Реализация в коде – это настоящая проверка того, понимаете ли вы материал или нет, а также практические занятия по этому курсу.

Tensorflow или Theano – ваш выбор!

Каждый пример данного курса будет делаться как в Theano, так и в Tensorflow. Итак, что это значит и почему так?

Для начала небольшой урок истории. Библиотека Theano является предшественницей всех ныне существующих библиотек глубокого обучения. Популярные сегодня библиотеки глубокого обучения в значительной степени были вдохновлены успехом Theano, имевшей такие примечательные функции, как  ускорение графического процесса и автоматическое дифференцирование.

Theano было и остаётся замечательным инструментом для изучения глубокого обучения, поскольку её синтаксис во многом схож на Numpy, так что если вы умеете писать код в Numpy, то без особых усилий сможете писать его и в Theano. К тому же поскольку много других библиотек глубокого обучения являются новыми, в них ещё нет функций, которые есть в Theano, однако если вы хотите сделать что-то действительно особенное, с Theano вы можете застрять. Theano очень ориентировано на первоосновы. Это значит, что вы можете взять своё математическое уравнение и, когда попытаетесь написать его в коде, обнаружить, что тот очень похож на математическую запись.

В случае более новых библиотек, таких как Tensorflow, это зачастую не так. Наоборот, очень часто получается так, что когда у вас есть некоторое уравнение и вы знаете, как его написать в Numpy, при попытке сделать то же самое в Tensorflow ничего не работает. Приходится искать документацию по Tensorflow, чтобы найти правильную функцию для того, что вы пытаетесь сделать, а иногда такой функции и нет. Что с этим делать? По правде говоря, зачастую ответ – ничего.

Однако несмотря на замечательность Theano, развитие этой библиотеки прекращено. Поэтому изначально, когда эти курсы создавались, Theano была лучшей библиотекой для них, поскольку не только обладала всеми необходимыми функциями, но и позволяла создавать вещи, используя первоосновы, без необходимости рыться в документации, чтобы найти правильное название нужной функции. Таким образом, было удобно работать в Theano, да и сегодня с ней можно работать, если есть желание.

К счастью, разработка других популярных библиотек для глубокого обучения происходит быстрыми темпами. У Tensorflow, судя по всему, новые версии выходят ежемесячно. Разумеется, за ней стоит Google, а мы знаем, что Google никуда не денется. Кроме того, там очень заботится о производстве кода для машинного обучения, поскольку системы машинного обучения Google должны предоставлять результаты реальным пользователям, так что можно быть уверенным, что если ваша компания хочет производить код для машинного обучения, то Tensorflow является надёжным выбором. Twitter является примером компании, которая выбрала именно такое решение.

Короче говоря, каждый пример кода в этом курсе будет сделан как в Theano, так и в Tensorflow. Поэтому если вас не интересует Theano, вы можно спокойно пропустить лекции с её кодом, поскольку также будет аналогичная лекция с применением Tensorflow. Если же вас интересуют обе эти библиотеки, можете просматривать лекции с ими обеими.

Помните, что общая схема, которой мы будем следовать в этом курсе, заключается в переходе от теории к коду. Вначале мы обсудим теорию, то есть новые понятия, новые уравнения, новые алгоритмы и так далее, а затем реализуем эту теорию в коде. Поэтому в следующей после теории лекции не будет ни новых понятий, ни новых алгоритмов, ни новых уравнений, мы просто реализуем то, что обсуждалось в предыдущей. Таким образом, обычно должна идти одна лекция с кодом, но поскольку у нас есть Theano, то будут лекции и с Theano, и с Tensorflow, в которых реализуется одно и то же.

Андрей Никитенко
Андрей Никитенко
Задать вопрос эксперту
Понравилась статья? Поделить с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: