Раздел практических вопросов по обработке данных: на языке Python

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

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

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

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

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

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

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

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

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

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

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

Итак, что же дальше?

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

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

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

У библиотеки TensorFlow есть прекрасный онлайн-инструмент для графического отображения обучения нейронной сети, называющийся TensorFlow playground. Мы его также рассмотрим, поскольку, как я указывал на протяжении всего курса, очень важно иметь возможность наглядно видеть обучение нейронной сети. Использование данного инструмента поможет закрепить эту мысль.

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

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

Поэтому если вы хотите больше попрактиковаться, этот проект будет очень полезен. В нём мы будем создавать модели с использованием классов, так что вы сможете применить свои навыки в объектно-ориентированном программировании. Вы увидите, что это более ясный и организованный подход, чем процедурный, использовавшийся в курсе до этого. Целью же является познакомить вас с интерфейсом библиотеки Sci-Kit learn, являющейся популярной библиотекой в машинном обучении на языке Python.

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

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

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

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

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

Нейронные сети также являются новейшими инструментами в NLP, то есть обработке естественных языков, позволяя моделировать зависимости между словами и предложениями и представлять слова в виде числовых векторов, поскольку нейронные сети работают именно с ними. Одним из известных примеров такого рода является Word2vec, позволяющий выполнять такие операции, как знаменитое «король – мужчина + женщина = королева».

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

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

Dropout и DropConnect являются новыми способами регуляризации нейронной сети и стали альтернативой обычным L1 и L2-регуляризации, которыми мы привыкли пользоваться.

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

Так куда же двигаться дальше? Много чему ещё есть поучиться, когда речь заходит о глубоком обучении, и прямо здесь, на Udemy, есть соответствующие курсы для освоения материала, о котором говорилось ранее. Вы, думаю, легко найдёте эти курсы, когда кликните на мой профайл. Далее посетите мой сайт https://lazyprogrammer.me и убедитесь, что вы подписаны на рассылку. Я выдаю купоны на мои курсы на Udemy и постоянно пишу бесплатные статьи по машинному обучению. Это лучший способ оставаться в курсе того, чем я занимаюсь в рамках бесплатных учебных материалов, которые я выпускаю, чтобы помочь вам развиваться в сфере глубокого обучения.

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

Наконец, подписывайтесь на меня в твиттере и заходите на мою страничку в Facebook. Это ещё один способ удостовериться, что вы первые в очереди при публикации курса и выдаче купонов.

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

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

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

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

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

Именно так делается прогноз.

Что мы делаем при обучении? Мы берём производную функции затрат по J относительно W и двигаем W в этом направлении:

Обратите внимание, что J остаётся тем же для всех задач – это кросс-энтропийная функция для классификации и квадратичная ошибка для регрессии.

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

А как мы обучаем? Так же, как и ранее – берём производную и двигаемся в её направлении. При этом надо учитывать, что мы можем сделать нашу сеть сколь угодно глубокой и иметь w1, w2, w3 и так далее:

В этом курсе вы видели, что мы можем включить любое количество весовых коэффициентов.

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

где * означает свёртку.

Как и в случае с обычными нейронными сетями, у нас может быть любое количество свёрточных и обычных слоёв.

А как мы обучаем сеть? Опять же, как и ранее – берём производную и двигаемся в этом направлении.

Вы, наверное, уже заметили повторяющийся элемент.

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

А если вы полагаете, что обучение вновь состоит в нахождении производной функции затрат и движении в соответствующем направлении, – вы будете совершенно правы:

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

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

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

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

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

Глубокое обучение и модели машинного обучения в целом используются для составления прогнозов. Итак, что вы хотите спрогнозировать? Чем вы интересуетесь? Надеюсь, вы можете ответить самим себе на эти вопросы. Существует множество стандартных наборов данных для машинного обучения, которые исследователи используют в качестве проверочных тестов. Они бесплатных и их легко найти, хотя они не так хороши, как интересующие именно вас вещи. Но вы можете просмотреть базы данных MNIST, CIFAR, SVHN, Iris, а также правительственные данные, базу электронных писем Enron и многое другое.

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

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

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

Однозначно, вам стоит проверять значение функции затрат в процессе градиентного спуска – именно поэтому я всегда вывожу её значение на экран, когда заканчивается обучение модели. Если вы видите, что функция затрат растёт или вообще увеличивается взрывообразно, значит что-то определённо идёт не так.

Практикуясь, вам придётся искать ответы на вопросы, вроде «Что, если у моих данных есть аномальные скачки?» или «Что, если не хватает данных?», или «Как мне обрабатывать изображения, звуки и предложения?»

Заметьте, на этих занятиях мы работаем с абстрактными векторами. Один из общих методов предварительной обработки данных является его нормализация – то есть сделать так, чтобы все входные данные лежали в диапазоне между 0 и 1, или вычитать из фактического значения переменной среднее значение и делить на стандартное отклонение. Что касается слов и предложений, вы можете использовать метод мешка слов, являющийся приёмом прямого кодирования, или применить более сложные методы вроде TF-IDF.

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

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

 

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

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