Обработка данных: глубокое обучение на языке Python

Введение и план курса

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

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

В данном курсе будут рассмотрены следующие лекции:  Введение в проект интернет-магазина,  Раздел прогнозирования. Проект интернет-магазина,   Построение целой нейронной сети прямого распространения,   Метод прямого распространения в подробностях,   Обучение нейронной сети,   Метод обратного распространения ошибкиПрактические вопросы машинного обучения. Обзор и итоги,   Практические упражнения в TensorFlow и что изучать далее?   Упражнения по достижению успеха в машинном обучении,   Проект распознавания выражения лица. Обзор,   Распознавание выражения лица,   Градиентный спуск в машинном обучении.

Итак, для чего же нужно глубокое обучение?

Кратко говоря, глубокое обучение, как и всё остальное машинное обучение, прежде всего нужно для прогнозирования. Так уж получается, что глубокое обучение работает лучше, чем большинство других методик, и вот некоторые примеры того, что оно может сделать. Я уверен, большинство из вас уже читали, как робот AlphaGo от компании Google обыграл чемпиона мира по игре в Го, хотя по мнению экспертов, это должно было произойти лишь в будущем через десяток лет. Глубокое обучение используется в автомобильных автопилотах, и оно же сейчас используется в поисковой системе Google. Конечно же, глубокое обучение используется в более привычных вещах вроде прогноза ситуации на фондовых рынках и распознавания лиц на изображениях. Вы можете использовать глубокое обучение даже для того, чтобы предсказать, кто победит на следующих президентских выборах!

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

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

План курса следующий:

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

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

Затем мы повторно рассмотрим проблему XOR и «проблему пончика», с которыми уже сталкивались в курсе логистической регрессии.

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

При построении нейронных сетей мы прежде всего рассмотрим библиотеку Numpy, чтобы вы лично могли создать нейронную сеть, получить практику и оценить теорию, на которой она базируется. Затем я покажу, как пользоваться библиотекой TensorFlow, чтобы вы могли создать простой plug-and-play скрипт, применимый для глубокого обучения. Мы также рассмотрим такой инструмент, как TensorFlow Playground, позволяющий наглядно увидеть, как обучается нейронная сеть.

В конце курса мы рассмотрим ещё один проект – по распознаванию выражения лица.

Мы всегда на связи.

Надеюсь, вам понравится этот курс!

Как этот курс вписывается в занятия глубоким обучением

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

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

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

y = Wx + b.

Эта модель используется повсюду вплоть до свёрточных и рекуррентных нейронных сетей, поэтому вам следует быть хорошо знакомыми с ней. В этом курсе мы можем обучить модель, всего лишь решив уравнение, и это единственный случай, когда мы в состоянии решить задачу в аналитическом виде. В этом курсе также даётся введение в основные способы обработки данных, а частности метод прямого кодирования (one-hot encoding).

Следующий курс, который я люблю называть «Логистическая регрессия: глубокое обучение, “часть 0″», посвящён ещё одному традиционному методу машинного обучения, но, в отличие от регрессии, используемому при классификации. В этом курсе вы узнаете о градиентном спуске – методу, при помощи которого можно обучить модель, если не получается найти решение в аналитическом виде. Вы также узнаете об основных концепциях машинного обучения, таких как регуляризация, и каким образом логистическая единица имитирует биологический нейрон.

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

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

Итак, с чего мы начнём? В этом курсе вы ознакомитесь с основами метода обратного распространения ошибки. Но существуют и способы его улучшения, такие как момент (momentum), адаптивные коэффициенты обучения и использование графического процессора на Amazon Web Services, – это составляет содержание части 2 курса по глубокому обучению. Кроме того, поскольку вам понадобятся некоторые библиотеки вроде Theano и TensorFlow, чтобы воспользоваться преимуществами графического процессора, в этом курсе вы с нуля научитесь пользоваться ими. Что замечательно, так это то, что они способны проводить автоматическое различие, позволяющее без чрезмерных усилий строить более глубокие и более сложные нейронные сети, включая свёрточные и рекуррентные. Разумеется, всё это требует знания метода обратного распространения ошибки, и именно поэтому он рассматривается в части 1.

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

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

В последующих курсах вы познакомитесь с рекуррентными нейронными сетями, удобными для обработки временных рядов и последовательностей. Вы также узнаете о глубокой обработке естественного языка, используемого для моделирования и понимания языка, в особенности для анализа тональности текста. Это та самая сфера, позволяющая распознать слово «тайвек» и корректно обрабатывать цепочки слов вроде «король» + «женщина» = «королева».

И наконец, вы узнаете об обучении с подкреплением, позволяющим применить глубокое обучение для игр; известнейшим приложением такого рода, должно быть, является AlphaGo от Google.

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

from sklearn.linear_model import LogisticRegression

model = LogisticRegression()

model.fit(X, Y)

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

Почему я это подчёркиваю?

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

Тест на готовность к глубокому обучению

В этой лекции мы удостоверимся в вашей готовности к данному курсу.

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

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

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

Вся последующая часть лекции является тестом на готовность к данному курсу. Учтите, если вы не сможете ответить на все предложенные вопросы и не чувствуете себя уверенно при работе с ними, вам придётся весьма нелегко при прохождении курса. Итак, начнём.

Истинно или ложно следующее утверждение: «Только специалисты по машинному обучению должны знать математику. Всем остальным достаточно уметь пользоваться Sci-kit learn API или каким-либо другим API».

Утверждение ложно. Sci-kit learn – замечательнейшая библиотека, но лишь для людей, уже знакомых с тем, как работают алгоритмы, и которым требуется удобное и хорошо спроектированное программное решение. Глубокое обучение не строится по принципу «подключи и пользуйся». Именно происходящее внутри алгоритма делает глубокое обучение интересным. К тому же обратите внимание, что следующие три строки кода имеют одинаковый API, но при этом приводят к различной точности в зависимости от набора данных:

logisticRegression.fit(X, Y)

neuralNetwork.fit(X, Y)

convNet.fit(X, Y)

Следующий вопрос. Что это за уравнение? Даю вам несколько секунд на размышление.

p(y=1)|x)= \sigma (w^T x)

Это уравнение двоичной логистической регрессии. Иногда его называют ещё «нейроном».

Следующий вопрос. А это что за уравнение? У вас есть несколько секунд на размышления.

J= -\sum_{i=1}^{N} t_i log (y_i) + (1-t_i) log(1-y_i)

Это уравнение кросс-энтропийной функции затрат. Оно же является отрицательным логарифмом правдоподобия для исходящей переменной модели.

Следующий вопрос. Что это за выражение?

w \leftarrow w - \eta \bigtriangledown J

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

Следующий вопрос. А это что за уравнение?

\frac{\partial J}{\partial w} = X^T (Y-T)

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

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

Что касается математики, то вы должны владеть дифференциальным счислением, линейной алгеброй и теорией вероятности на уровне старшекурсника. Если вы полагаете, что сможете изучить весь этот материал за день, то глубоко ошибаетесь. Если вы полагаете, что у вас появились суперспособности только от того, что прошли какой-нибудь курс вроде «Как научиться учиться», или полагаете, что можете овладеть всем мировым знанием с помощью техники скоростного чтения, – вы глубоко ошибаетесь. Лично я бы рассчитывал как минимум на несколько месяцев.

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

Что касается необходимых предпосылок в сфере программирования, то у меня есть бесплатный курс «Numpy Stack на языке Python», который легко найти с помощью функции поиска. Учтите, что он не предназначен для новичков – вы должны уверенно владеть программированием. При изучении курса по библиотеке Numpy вы должны уже иметь полное понимание упомянутых выше разделов математики, поскольку Numpy Stack обычно используется в целях улучшения вычислений, основанных на этих разделах.

Нейронные сети без математики

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

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

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

В данном случае на рисунке у нас есть один слой входных вершин, один слой исходящих вершин и один слой скрытых вершин. Глубокие нейронные сети обычно имеют один или несколько слоёв скрытых вершин.

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

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

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

На рисунке показана одна из логистических единиц. Попытайтесь в качестве упражнения найти две остальные.

В нейронных сетях обучение модели называется обратным распространением ошибки. Что это значит?

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

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

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

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

Share via
Copy link