Приложение. Theano. В каком порядке изучать курсы

Мертво ли Theano

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

Я создал эту лекцию, чтобы ответить на один часто встречающийся в последнее время вопрос про Theano и в каком порядке изучать данные курсы.

Как вы, возможно слышали, Йошуа Бенжио недавно объявил, что разработка библиотеки Theano будет прекращена после выхода версии 1.0. Я написал об этом на своём сайте lazyprogrammer.me 29 сентября 2017 года – на случай, если вы захотите проверить пост. Множество людей восприняло это как заявление, что библиотека Theano мертва. Полагаю, это некоторое преувеличение, и в данной лекции я объясню, почему.

Во-первых, поговорим о том, почему библиотека Theano не совсем умерла. Ну, если вы перейдёте на страницу библиотеки в Github, то увидите, что последняя версия на самом деле уже 1.0.1. Так что если вы думали, что они достигли версии 1.0 и всё бросили, то не совсем правы. На конец 2017 года последней версией является 1.0.1, но мы ещё знаем, будут ли следующие релизы.

Во-вторых, задумайтесь над тем, что в действительно означает выход версии 1.0. В наши дни разработчики программного обеспечения с открытым исходным кодом, как правило, весьма консервативны в нумерации. Вы можете встретить многолетние проекты с версией 0-точка-что-то-там, даже когда вокруг них сформировалось огромное сообщество. Пример в тему – последняя версия библиотеки Numpy на момент создания этой лекции – 1.14, последняя версия библиотеки SciPy – 1.0, последняя версия Pandas – 0.21.1, а последняя версия Sci-Kit Learn – 0.19.1. Все эти библиотеки годами интенсивно используются, и половина из них даже не достигла версии 1.0. Таким образом, тот факт, что разработчики Theano решили, что их проект заслуживает версии 1.0, – это огромная веха; в действительности это самая совершенная версия Theano из всех когда-либо существовавших. Так почему бы её не использовать?

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

Имейте также в виду, что почти все современные библиотеки глубокого обучения, с которыми мы встречаемся на сегодняшний день, не считая самой библиотеки Theano, в значительной степени вдохновлялись ею. Там есть некоторые различия, но много сходства. Как вы, вероятно, поняли из моих курсов, меня больше всего интересуют фундаментальные основы. Что я имею в виду? Ну, например, я полагаю, что для того, чтобы научить кого-то сложению, нужно обучить его фундаментальному пониманию операции сложения, а не просто научить запоминать, что 1+1=2, 1+2=3 и так далее. Сложение – чудесный пример, ведь существует бесконечное количество возможных сложений. В действительности его невозможно понять, пока не поймёшь основополагающие принципы. Я полагаю, что любое обучение должно происходить таким же образом. Поэтому изучение Theano – это изучение не синтаксиса, а фундаментальных основ того, как в Theano выполняются те или иные вещи.

Это очень отличается от обычного написания программ в Numpy, поскольку тут мы имеем дело не с числами, а с переменными. Так, когда мы записываем оператор присваивания вроде a = b + c, мы не присваиваем значение выражения b + c переменной a; в Theano b и c не имеют никаких значений, а потому и присваивание не имеет смысла. Вместо это мы указываем Theano, как должно быть вычислено значение a в будущем, когда мы зададим значения b и c. Это основополагающий принцип, перенесённый также на библиотеки Tensorflow, PyTorch, CNTK и другие. Таким образом, изучение Theano сводится не к запоминанию синтаксиса, а к пониманию этих основополагающих принципов. Они легко переносятся на другие библиотеки, схожие во многих отношениях, так как их разработка вдохновлялась библиотекой Theano.

Кроме того, учитывайте, что большинство библиотек глубокого обучения вышли гораздо позже Theano; в ряде случаев они всё ещё находятся на очень ранней стадии разработки. Это значит, что у них даже всё ещё  отсутствует множество функций. Например, индексацию массивов очень просто выполнить в Theano, но не так-то легко или даже невозможно в других библиотеках. Более подробно об этих различиях рассказывается в моей лекции «Theano vs. Tensorflow», входящей в курс «Глубокое обучение, часть 2», также называющийся «Современное глубокое обучение на языке Python». Так что если вы ищете определённый специальный функционал, не забывайте для начала, что библиотека, с которой вы работаете, может его даже не включать.

Ещё один важный факт, о котором я ранее уже упоминал, заключается в том, что Theano является замечательным инструментом для обучения. Она совершенно фантастически подходит для обучения, как писать код для нейронных сетей. Во многом это связано с тем обстоятельством, что синтаксис Theano очень похож на математические выражения, изложенные на бумаге. Рассмотрим, например, уравнение для слоя нейронной сети и сравним его с синтаксисом в Numpy и Theano:

Математическое выражениеf(WTx + b)
Numpyf(W.dot(x) + b)
Theanof(W.dot(x) + b)

То есть вид в Theano похож не только на математическое описание, но и практически такой же, как в Numpy, и это замечательно, ведь вы уже знакомы с Numpy. Таким образом, очень легко перейти от Numpy к Theano – синтаксис, по существу, один и тот же.

В качестве антипримера рассмотрим код библиотеки CNTK. На первом слайде приведён фрагмент кода для создания слоёв нейронной сети и определения функции затрат, а на втором – код для обучающего цикла (который, конечно же, на самом деле циклом не является, ведь цикл происходит внутри). То есть мы имеем 100 строк кода; как тут отыскать хотя бы уравнение для слоя нейронной сети? Его нигде нет!

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

Нельзя сказать, что библиотека CNTK плоха, просто я выбрал случайный пример. Но он показывает, что по сравнению с Theano и тем, что мы знаем о Sci-Kit Learn и Numpy, нелегко переходить от одной библиотеки к другой.

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

И наконец рассмотрим всё с практической точки зрения. Я наводил такой же пример в лекции «Python 2 vs. Python 3», поскольку это реальный пример и, столкнувшись с ним, вы не сможете со мной не согласиться. Итак, представим, что вы работаете в крупной компании с миллионными оборотами. Заказчики платят, чтобы вы добавили функционал к уже существующему продукту – чем больше добавите, тем больше денег получите. Задумайтесь, как глупо было бы заявить заказчикам: «Эй, я не буду делать то, что вам пообещал, поскольку разработчики хотят переписать наши нейронные сети в Tensorflow вместо Theano». Звучит дико. С точки зрения клиента, никакого видимого эффекта нет, и он воспримет это так, будто вы заявляете, что хотите потратить месяцы для написания кода, чтобы заменить одну нейронную сеть другой, которая при этом выдаёт тот же результат, что и старая. Начнём с того, что вам никто за это не заплатит. Таким образом, выбор у вас следующий:

1) продолжать создавать продукт с тем, что уже есть, и зарабатывать деньги или

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

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

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

В каком порядке изучать курсы (часть 1)

Здесь я отвечу на вопрос, который мне задают множество раз в день, – в каком порядке следует изучать курсы?

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

Я бы хотел наглядно показать данный материал. На самом деле я создал страницу, на которую вы можете перейти и посмотреть на таблицу, которую я сделал для себя. Поэтому перейдите на сайт deeplearningcourses.com, нажмите на ссылку Catalog, а затем нажмите на ссылку Click here. Это приводит нас к странице порядка курсов. Вначале идёт нечто вроде линейной диаграммы, где один курс следует за другим, однако на самом деле это не совсем то, что хотелось бы рассмотреть в данной лекции. Данная линейная диаграмма даёт базовый обзор, но она не совершенна. Дело в том, что связи между курсами являются куда более сложными, чем тут показано: иногда один курс даёт навыки, необходимые сразу для двух других курсов, а иногда курс оказывается настолько сложным, что основывается на ряде различных курсов. Это прекрасная возможность использовать граф, так что если вы перейдёте вверх и нажмёте на ссылку Click here to jump down, то окажетесь внизу страницы, где показан граф, на котором можно видеть зависимости между каждым из курсов. Мы рассмотрим каждую связь в этом графе и поясним, почему она существует и чем она важна.

Итак, вначале рассмотрим курс по SQL, поскольку у него нет связей. Он размещён в середине, но мы можем перенести его в сторону. Это самое замечательное в данном графе – можно просто взять объект и перетащить его – тут всё очень интерактивно. Итак, курс по SQL не имеет связей. Это значит, что данный курс не является необходимой предпосылкой ни для какого курса и никакой курс не является необходимой предпосылкой для изучения данного – он единственный, и его можно изучать когда угодно.

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

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

Начнём с того, что мы получаем после курса по Numpy. Как видите, от него идут две связи: одна ведёт к курсу по линейной регрессии, а вторая – к курсу по байесовскому машинному обучению и A/B-тестированию. Кстати, граф можно увеличивать, что мы сейчас и сделаем. Итак, от курса по Numpy связи идут к обоим указанным курсам, однако на самом деле я настоятельно рекомендую в качестве следующего этапа линейную регрессию. Само по себе байесовское машинное обучение не основано на каких-либо других курсах, но это более глубокий курс, требующий более глубокого понимания теории вероятностей и знания вопросов реальных разработок, таких как оптимизация коэффициента кликабельности на сайте. Поэтому линейная регрессия будет моей первой рекомендацией в вашем путешествии по машинному обучению.

После линейной регрессии идёт курс по логистической регрессии. Почему мы переходим от линейной регрессии к логистической? Основная идея состоит в том, что обе они являются линейными моделями. Другими словами, модель имеет вид y = mx + b, а это прямая. Отличие в том, что в линейной регрессии решается задача регрессии, а в логистической – задача классификации. Изучить же классификацию необходимо потому, что это одна из центральных задач нейронных сетей, которые идут за ней.

Как вы можете заметить, линейная регрессия также имеет две исходящие связи: одна идёт к логистической регрессии, а вторая – к обучению с подкреплением. Это связано с тем, что в моём курсе по обучению с подкреплением используется линейная регрессия, и, естественно, если вы не понимаете линейную регрессию, то не поймёте и этот курс. Вновь-таки, это гораздо более «слабая» связь, чем та, что идёт от линейной регрессии к логистической. Это потому, что обучение с подкреплением в действительности концептуально более сложное. Оно не основано на содержании других курсов напрямую, кроме показанных, однако идеи, лежащие в его основе, являются более глубокими. На самом деле вам стоит иметь некоторый опыт как в обучении с учителем, так и в обучении без учителя, прежде чем переходить к обучению с подкреплением, – это поможет выстроить правильный взгляд на предмет изучения. Мы вернёмся к обучению с подкреплением позже, а сейчас двинемся по пути к глубокому обучению.

По пути же к глубокому обучению перед этим обсуждалась логистическая регрессия, также именуемая нейроном. Это очень важно, поскольку чтобы создать нейронную сеть, мы должны вначале знать, как создать нейрон. Нейронная сеть является лишь набором нейронов, соединённых вместе. Это приводит нас к курсу «Глубокое обучение на языке Python, часть 1» – он с зелёненьким логотипом. В данном курсе вы узнаете, как работают нейронные сети и познакомитесь с базовыми фундаментальными операциями, такими как обратное распространение.

Изучив основы глубокого обучения, можно переходить к курсу «Глубокое обучение, часть 2, или Современное глубокое обучение на языке Python». У него та же картинка, но более тёмная, чтобы показать, что курс является продолжением предыдущего. Как и указано в названии, этот курс целиком посвящён современным разработкам в сфере глубокого обучения, и в нём рассматриваются способы усовершенствования базового обратного распространения, такие как импульс и методы адаптивного коэффициента обучения вроде RMSProp и Adam. В нём также говорится о современных методах регуляризации, такие как исключение и пакетная нормализация. Самое же главное – мы рассматриваем современные библиотеки глубокого обучения, такие как Theano и Tensorflow, а также библиотеки Keras, PyTorch, MXNet и CNTK. Вы увидите, что фундаментальные вещи не сильно меняются при переходе от одной библиотеки к другой – это всё одни и те же понятия.

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

Изображения также встречаются повсюду. Snapchat, Instagram, Facebook, беспилотные автомобили, домашние системы безопасности знают, как обрабатывать изображения. Это очень важно, и многомиллиардные компании существуют именно потому, что хорошо умеют это делать. Это подводит нас к следующему курсу цикла по глубокому обучению – «Свёрточные нейронные сети, или Глубокое обучение на языке Python, часть 3». Он полностью посвящён тому, как внедрить свёртку в нейронные сети и, прежде всего, что такое свёртка и как она помогает использовать структуру изображений.

После свёрточных нейронных сетей мы сворачиваем к глубокому обучению без учителя. Глубокое обучение без учителя не очень популярно среди начинающих, хотя и следовало бы. Если вы прислушаетесь к экспертам по глубокому обучению, таким как Ян Лекун, Йошуа Бенджио и Джеффри Хинтон, то узнаете, что все они говорят о важности глубокого обучения без учителя. Этот курс знакомит нас с рядом новых идей. Первая из них  – идея скрытых переменных, или скрытых причин. Это факторы, которые мы не наблюдаем непосредственно в наших данных, но о которых можно узнать, изучая структуру данных. Вторая – современные методы визуализации данных вроде t-SNE. Это очень важно, поскольку, как упоминалось ранее, наряду с изображениями текст является по-настоящему важным форматом данных, а чтобы наглядно показывать структуру текста в позднейших курсах, мы воспользуемся методом t-SNE. Таким образом, неплохо бы знать, что это такое и зачем оно нужно. Третья идея – предварительное обучение без учителя. Предварительное обучение является основой современных идей, таких как перенос обучения, и мы используем его как в обработке естественных языков, так и в свёрточных нейронных сетях. Четвёртое – проблема исчезающего градиента. Мы непосредственно продемонстрируем проблему исчезающего градиента, чтобы вы поняли, как она появляется.

Исчезающие градиенты особенно важны в контексте рекуррентных нейронных сетей, и так получается, что рекуррентные нейронные сети – это следующий курс в цикле по глубокому обучению – «Глубокое обучение на языке Python, часть 5». Вспомним два принципиально интересных типа данных – текст и изображения. Мы уже рассматривали изображения, а в этом курсе начинаем рассматривать текст. Почему так? Потому, что рекуррентные нейронные сети специализируются на моделировании последовательностей, а текст является лишь последовательностью слов. Таким образом, это лучший тип данных, для демонстрации рекуррентных нейронных сетей.

В каком порядке изучать курсы (часть 2)

Изучив рекуррентные нейронные сети, мы можем ещё лучше понять, как использовать глубокое обучение для обработки текстов, и этому посвящён следующий курс – «Обработка естественного языка с помощью глубокого обучения на языке Python, или Глубокое обучение на языке Python, часть 6». В этом курсе мы рассматриваем очень важную концепцию векторного представления слов. Она позволяет нам преобразовывать слова, являющиеся категориальными переменными, в векторы, являющимися числами, которые уже может обрабатывать нейронная сеть. Вот почему очень важно перед этим изучить обучение без учителя – потому что нахождение векторного представления слов на самом деле является задачей обучения без учителя. Кроме того, векторное представление слов позволяет нам использовать предварительное обучение, обсуждавшиеся в «Глубоком обучении на языке Python, часть 4». В этом курсе мы также рассмотрим очень продвинутую модель для анализа тональности текста, которая называется рекурсивной нейронной сетью или нейронной сетью деревьев. Это пример динамической нейронной сети, поскольку она изменяет свою структуру в зависимости от получаемых входных данных. Большинство библиотек глубокого обучения не приспособлены для работы с динамическими нейронными сетями, и я покажу, что получится, если вы попытаетесь создать такую, двигаясь простейшим путём, – по сути, вы в конечном итоге придёте к отдельным нейронным сетям для каждого учебного примера, что поглотит всю вашу оперативную память и заставит компьютер тормозить. Таким образом вы получите непосредственное представление о том, почему нелегко работать с динамическими нейронными сетями. К счастью, мы в состоянии воспользоваться нашими знаниями рекуррентных нейронных сетей (не забывайте, они являются необходимой предпосылкой для данного курса!), чтобы преобразовать дерево в последовательность, с которой рекуррентная нейронная сеть способна работать. Именно поэтому рекуррентные нейронные сети и являются необходимой предпосылкой для этого курса. Как вы можете заметить, этот курс – глубокая обработка естественных языков – не имеет исходящих связей. Это потому, что данный курс является наиболее глубоким, имеющимся у меня на данный момент. Безусловно, в будущем я планирую двигаться дальше в данном направлении.

Впрочем, это не последний курс в цикле по глубокому обучению. После него идёт «Глубокое обучение с подкреплением», оно же «Глубокое обучение на языке Python, часть 7». С учётом всего сказанного, полагаю, самое время вернуться назад и начать двигаться по пути изучения обучения с подкреплением. Как вы заметили, у меня есть курс по байесовскому машинному обучению, переходящий к обучению с подкреплением. На первый взгляд, эти два курса могут показаться не связанными между собой, однако существует очень важная концепция, которая применима к ним обоим и которая называется дилеммой исследования и использования. В байесовском машинном обучении вы познакомитесь с этой идеей в контексте попытки оптимизировать коэффициент кликабельности, или коэффициент переходов, то есть, другими словами, отношение количества раз, когда посетители покупают что-то на вашем сайте, к количеству раз, когда они посещают сайт. Полагаю, весьма практичная концепция, если вы занимаетесь чем-либо, связанным с интернет-торговлей.

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

Как вы понимаете, в курсе «Обучение с подкреплением, часть 1» мы получаем основы, и он является необходимой предпосылкой для курса по глубокому обучению с подкреплением, поскольку в последнем эти понятия используются для более сложных игр. Однако можно заметить, что это не единственная необходимая предпосылка для курса по глубокому обучению с подкреплением. Как следует из названия, он также основан на знании глубокого обучения, в частности, свёрточных нейронных сетей. Однако чтобы знать, как создать свёрточную нейронную сеть, необходимо знать, как создать обычную нейронную сеть, а это значит, что необходимо знать, что такое нейронная сеть, зачем она нужна и так далее. В глубоком обучении с подкреплением эти два пути сходятся – в данном курсе мы объединяем знание как обучения с подкреплением, так и глубокого обучения. Причина, по которой курс основан на свёрточных нейронных сетях, а не на рекуррентных, состоит в том, что мы будем учиться играть в видеоигры. Так, например, мы можем научиться играть в видеоигры наподобие Pong или Breakout, являющиеся классическими играми Atari. Это изображения, поскольку, по сути, представляют собой скриншоты игры. В дальнейшем можно будет применить и рекуррентные нейронные сети, и в таком случае курс по рекуррентным нейронным сетям станет необходимой предпосылкой к данному. На данный момент на этом заканчивается обучение с подкреплением, но я буду рад предоставить вам новые обновления в этой области.

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

Во многом подобно тому, как логистическая регрессия является основным строительным блоком нейронной сети, классические модели вроде деревьев решений являются основными строительными блоками ансамблевых методов. Именно поэтому данный курс является необходимой предпосылкой к курсу по ансамблевому машинному обучению. Вновь-таки, тут используется один и тот же логотип, но другого цвета, чтобы показать, что эти два курса очень тесно связаны. В курсе по ансамблевому машинному обучению мы учимся объединять разными способами несколько деревьев решений для создания некоторых очень мощных классификаторов. Что по-настоящему примечательно в этих методах, так это то, что в них очень легко подставлять и использовать данные, так что если вам нужно решение в стиле «подключи и работай» без необходимости изучать большой теоретический материал, то, скорее всего, глубокое обучение – это не для вас, однако ансамблевые методы подходят прекрасно. Модели глубокого обучения очень сильно зависят от гиперпараметров, и если вы неправильно их выберете, то ваша модель будет работать крайне плохо. Иногда требуются колоссальные вычислительные мощности, чтобы отыскать хорошие значения гиперпараметров, это активная область исследований, в которой ещё не все проблемы решены. Именно поэтому вы можете попытаться реализовать модель, увиденную в статье по глубокому обучению, однако если предположить, что автор пропустил некоторые, казалось бы, незначительные детали и вам в конце концов пришлось делать свои допущения, то вы можете получить совершенно другой результат. Так что глубокое обучение является очень хрупкой вещью. К счастью, ансамблевые методы не такие. В курсе мы концентрируемся на двух очень известных ансамблевых методах – методе случайного леса и AdaBoost. На данный момент это всё, что касается машинного обучения с учителем.

Далее мы видим переход от машинного обучения с учителем к машинному обучению без учителя, а точнее, к кластерному анализу. Причина, по которой мы изучаем обучение с учителем до обучения без него, состоит в том, что обучение без учителя несколько более абстрактно и требует от учащихся больше усилий, чтобы понять его практическую применимость и для чего его можно использовать. Кластерный анализ показывает, как моделировать данные, идущие без меток (целевых переменных), и, как вы могли догадаться, делается это в форме кластеризации. Идея, лежащая в основе кластеризации, очень проста: мы хотим выяснить, сколько существует естественно образованных групп данных и каковы взаимосвязи между данными в этих кластерах. Так, например, если мы группируем книги, то можем обнаружить в одном кластере книгу о Стиве Джобсе и книгу об Илоне Маске. Этот кластер, вероятно, посвящён технологическим компаниям и Кремниевой долине. Однако при этом мы не нуждаемся для этого в метках данных, мы сами можем об этом узнать, рассматривая, каким образом естественно группируются данные. Как я упоминал ранее, ознакомившись как с обучением с учителем, так и с обучением без него, вы будете готовы перейти к обучению с подкреплением. Я не делал кластерный анализ необходимой предпосылкой для обучения с подкреплением, так как никакой материал для последнего не основан на данном курсе, однако полезно знать эти методы, чтобы иметь более зрелый и опытный взгляд на машинное обучение.

Своего рода продолжением кластерного анализа является курс по скрытым марковским моделям. Причина этому может на первый взгляд показаться непонятной, поэтому позвольте мне навести две причины. Первая состоит в том, что и то, и другое являются моделями машинного обучения без учителя, просто скрытые марковские модели сложнее, так что вполне естественно вначале изучить кластерный анализ. Кроме того, кластеризация посвящена обработке неизменных данных, тогда как скрытые марковские модели – обработке последовательностей; это похоже на такой же процесс в глубоком обучении, где мы сначала рассматриваем статичные данные вроде изображений, а потом переходим к последовательностям данных вроде текста. Вторая же причина заключается в том, что в кластерном анализе мы изучаем метод, который называется гауссовыми моделями смешения и который используется в курсе по скрытым марковским моделям. Ключевым моментом тут является то, что в обоих используется алгоритм максимизации ожиданий, так что неплохо бы вначале рассмотреть этот алгоритм на простой модели; тогда, встретившись с ним вновь в более сложной модели вроде скрытой марковской, он будет уже не столь пугающим. Ключевым понятием, которое изучается в курсе по скрытым марковским моделям, является марковское допущение, которое просто означает, что текущее состояние зависит только от предыдущего состояния, но ни от каких других. Это упрощающее допущение, которое, как правило, облегчает работу с математическими выкладками. Вы также можете заметить, что мы сталкиваемся с марковским допущением в обучении с подкреплением, однако его не особо сложно изучить с нуля, так что по этой причине я не считаю скрытые марковские модели необходимой предпосылкой для обучения с подкреплением. В действительности марковское допущение – это единственное, что у них есть общего. Есть также небольшая связь между кластерным анализом и глубоким обучением без учителя, поэтому хотя я не собираюсь рисовать связь прямо сейчас, но временами считаю кластерный анализ «Машинным обучением без учителя, часть 1», а собственно курс по машинному обучению без учителя – «Машинным обучением без учителя, часть 2».

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

И у нас остаётся последняя связь в этой части графа, которую я хотел бы пояснить, – это первый курс по обработке естественных языков. Как вы можете видеть, он опирается на машинное обучение с учителем и подкрепляет собой глубокую обработку естественных языков. Главной целью базового курса по обработке естественных языков является применение базовых моделей машинного обучения к обработке текстов, и именно поэтому машинное обучение с учителем идёт перед ним – ведь курс полностью посвящён базовым моделям машинного обучения. Важнейшей задачей этого курса по обработке естественных языков является не реализация указанных моделей, а, скорее, дать общую картину того, как используется машинное обучение, каково взаимодействие между данными и моделью, что делает модель, каковы входные данные и исходящие результаты и как эти исходящие результаты интерпретировать. Мы берём эти принципы и используем их применительно к тексту; таким образом мы можем видеть, что текст можно рассматривать так, будто нет никакой разницы между ним и любыми другими данными. Это подкрепляет принцип «все данные – одинаковы». Модели машинного обучения всё равно, что из себя представляют ваши данные; она видит лишь таблицу чисел, и её не интересует, текст ли это, или изображение, или радиосигнал из космоса, – она просто делает то, для чего была предназначена, с числами, которые вы ей дали. Таким образом, данный курс даёт вам общее системное представление о работе моделей машинного обучения с текстом. Этот же курс также подкрепляет курс по глубокой обработке естественных языков, который, конечно же, является не таким уж и лёгким, поскольку опирается на большую предварительную подготовку в сфере глубокого обучения. Один из основных вопросов, который я получаю насчёт курсов по обработке естественных языков, звучит так: как можно улучшить результаты работы этих базовых моделей? И множество раз звучит один и тот же ответ: нужно использовать более сложную модель, хотя, разумеется, это требует изучения того, как работает эта более сложная модель. Глубокая обработка естественных языков тому подтверждение, поскольку в ней изучаются самые современные методы анализа тональности, тогда как во введении в обработку естественных языков используется лишь линейная модель. Таким образом, важно понимать, что хотя да, вполне возможно улучшить предсказательную способность простой базовой модели, этого не всегда просто добиться, так что вы должны быть к этому готовы. В данном случае просто оцените время, которое надо потратить, чтобы добраться до глубокой обработки естественных языков – нелёгкая задача!

Перейдём теперь к курсу по генеративно-состязательным сетям и вариационным автокодировщикам. Так же, как глубокое обучение с подкреплением не связано с глубокой обработкой естественных языков, этот курс тоже на самом деле не связан с глубоким обучением с подкреплением. Это «Глубокое обучение, часть 8», но только по очередности создания; на самом деле это идейное продолжение курса по глубокому обучению без учителя, который называется «Глубокое обучение на языке Python, часть 4». Повторюсь: есть часть 6, часть 7 и часть 8 только по очередности создания, но концептуально они друг с другом не связаны, хотя никогда не помешает знать все эти вещи, поскольку более широкий контекст облегчает дальнейшее изучение. Причина, по которой курс по генеративно-состязательным сетям и вариационным автокодировщикам связан с курсом по глубокому обучению без учителя, заключается в том, что генеративно-состязательные сети и вариационные автокодировщики также являются моделями глубокого обучения без учителя. Но тогда как курс по глубокому обучению без учителя полностью посвящён тому, как улучшить обучение с учителем, генеративно-состязательные сети и вариационные автокодировщики вовсе не имеют никакой прямой связи с обучением с учителем, хотя в рамках курса применяется и оно. В данном курсе основное внимание уделено созданию изображений. Генеративно-состязательные сети способны создавать изображения фотографического характера, опираясь на систему двойной нейронной сети. Это довольно впечатляюще, поскольку до генеративно-состязательных сетей мы не встречались с какого-либо рода моделью машинного обучения, способной создавать реалистично выглядящие изображения. В настоящее время генеративно-состязательные сети в состоянии создавать высококачественные изображения людей в высоком качестве, о которых вы даже не сможете сказать, что это не реальные люди. Определённо, это делает идею фильма «Матрица» вполне возможной!

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

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

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

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

;-) :| :x