Глубокое обучение: смысл, мотивация и базовая структура NN

Что такое глубокое обучение, зачем оно нужно, и понимание нейронных сетей через их самую базовую структуру

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

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

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

Глубокое обучение - это подраздел машинного обучения, в основе которого лежат алгоритмы, основанные на структуре и функциях мозга и называемые искусственными нейронными сетями. [1]

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

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

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

  • Что такое алгоритм машинного обучения
  • Контролируемое и неконтролируемое обучение
  • Регрессия против классификации
  • Как обучать, проверять и тестировать алгоритмы машинного обучения
  • Базовые алгоритмы машинного обучения, такие как линейная регрессия, логистическая регрессия и т. Д.

Если нет, я отсылаю вас к написанной мной серии статей об основных алгоритмах и концепциях машинного обучения:



Давайте приступим к делу.

Ограничения традиционных алгоритмов машинного обучения

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

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

Допустим, вы должны были использовать некоторый алгоритм классификации, чтобы определить, является ли опухоль злокачественной или злокачественной. Для этого вы решаете использовать две характеристики опухоли: ее размер (x_1) и жесткость (x_2). Вот пример некоторых графических данных обучения, где O представляет опухоль, помеченную как злокачественную, а X представляет опухоль, помеченную как злокачественная:

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

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

Лучше, но не так убедительно. Можем ли мы выдвинуть еще более гипотезу? Еще более высокого порядка и больше терминов? Наверное. Должны ли мы? Ну, как далеко мы готовы зайти? Если для задачи только с двумя характеристиками, мы уже получаем сложную гипотезу с большим количеством терминов. Представьте себе, что теперь мы должны были использовать 100 функций для решения нашей проблемы: размер опухоли, жесткость, пол пациента, их возраст и т. Д. В худшем случае нам приходится принимать все возможные члены второго порядка для сформировать нашу гипотезу, оставив нам гипотезу из 10000 терминов. Фактически, для любой гипотезы, в которой учитываются все члены второго порядка, мы получаем O(n^2) членов, где n - количество характеристик:

Если бы мы взяли все условия третьего порядка, мы получили бы O(n^3) терминов. Это много терминов.

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

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

Работа с изображениями подразумевает, что наш алгоритм будет принимать в качестве входных данных значения цвета пикселей. Предполагая, что наше изображение в оттенках серого и его размер составляет 800 x 801 (что является фактическим размером изображения выше), это 640800 функций в нашем пространстве функций ... Это более 400 миллиардов членов, в худшем случае, если бы мы были взять все условия второго порядка. Представьте, как это будет работать, например, в автономном транспортном средстве.

Итак, какое решение? Что ж, вы, наверное, уже догадались: нейронные сети.

Нейронные сети

Несмотря на популяризацию в последнее десятилетие или около того, нейронные сети существуют уже некоторое время. Эту тему открыли Уоррен Маккалок и Уолтер Питтс в 1940-х годах, после чего многие другие внесли свой вклад в эту область [2]. В 1958 году Фрэнк Розенблатт создал Perceptron, алгоритм классификации с контролируемым обучением [3]. Хотя перцептроны больше не используются так широко, как раньше, это хороший переход к более современным сетям, используемым сегодня, и поэтому мы начнем с объяснения их работы.

Перцептрон

Персептрон - это алгоритм двоичной классификации, который принимает на вход несколько двоичных значений и выводит двоичное значение:

Рисунок 5 представляет собой пример самого простого перцептрона. Давайте объясним его разные части.

x_1,x_2,...,x_m - это m двоичные входы, и они составляют входной уровень. w_1,w_2,...,w_n - это то, что Розенблатт назвал весами. Эти веса используются для описания влияния ввода на общий вывод. Вход с более высоким весом будет иметь большее влияние на общий результат, чем вход с меньшим весом. Все кружки со стрелками, входящими в и из них, представляют идею пропуска входных данных через некоторую функцию z, которая, в свою очередь, даст некоторый результат. Они называются нейронами. Обратите внимание, что кружки для x_1,x_2,...,x_m не имеют входящих стрелок, только выходят стрелки, поэтому они не запускают никаких функций, они просто представляют собой входные данные. В перцептронах функция, используемая в нейронах, представляет собой взвешенную сумму между входными данными и весами:

Вывод основан на следующем правиле:

Порог - это предварительно определенное значение, которое мы выбираем. Больший порог означает, что мы менее строги в том, когда наш перцептрон выдает единицу. Меньший порог означает, что мы более строги.

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

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

Персептрон не обязательно должен содержать только один нейрон. Мы можем создать сеть перцептронов, отсюда и название нейронная сеть:

Слой с выходным нейроном мы называем выходным слоем. Любой слой между входным и выходным слоями называется скрытым слоем.

Персептроны отлично подходят для линейно разделяемых данных, то есть данных, которые можно разделить с помощью линии, плоскости или гиперплоскости [5]. Это означает, что это не решает нашу предыдущую проблему, когда нам нужен был способ создания очень сложных границ принятия решений без очень большой гипотезы.

Вывод ограничивается только нулем, и единица также накладывает некоторые ограничения. Представьте, что мы хотим использовать сеть на рисунке 6, чтобы определить, является ли число, написанное на изображении, нулем. Нам нужен вывод 1, если изображение содержит ноль, и вывод 0 в противном случае. По какой-то неизвестной причине наша сеть постоянно помечает изображения с номером один как с номером ноль. Что мы можем сделать? Мы можем попробовать немного изменить вес. Но небольшое изменение весов может привести к гораздо более значительным изменениям в выходном узле . Это может иметь столь же большое влияние, как изменение результата в выходном узле с единицы до нуля или наоборот. Таким образом, даже если мы начнем правильно определять, что единица не является нулем, остальная часть сети может стать ошибочной при работе с числами, отличными от единиц и нулей, скажем, девять.

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

Сигмовидные нейроны

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

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

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

Сигмовидные нейроны также могут иметь более одного выхода и не ограничиваются проблемами бинарной классификации:

Лучший способ понять, как работают сигмовидные нейронные сети, - это сигмовидная кривая:

Обратите внимание, что есть асимптоты в y = 1 и y = 0, удовлетворяющие нашему требованию получения значений от нуля до единицы. Но решает ли это проблему, о которой мы упоминали, когда небольшое изменение весов вызывает непропорционально большое изменение вывода? Чтобы ответить на этот вопрос, мы можем сравнить рисунок 7 с кривой ступенчатой ​​функции:

В случае перцептронов мы имели дело со ступенчатой ​​функцией, где небольшое изменение x (веса) могло вызвать полное изменение y (вывод). Сигмовидная кривая - это не что иное, как сглаженная версия ступенчатой ​​функции. Эта новая, более гладкая кривая позволяет лучше отразить изменение выходных данных по величине изменения весов.

Глубокое обучение

К настоящему времени вы должны лучше понимать вышеупомянутое определение глубокого обучения:

Глубокое обучение - это подраздел машинного обучения, связанный с алгоритмами, основанными на структуре и функциях мозга, которые называются искусственными нейронными сетями. [1]

Вы знаете, что такое нейронные сети и как они работают. Но почему «глубокий» и почему «обучающийся»?

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

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

Заключение

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

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

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

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

  • Является ли сигмовидная функция единственной нелинейной функцией, которую мы можем использовать в наших нейронах? Можно ли использовать другие нейроны для решения сложных задач?
  • Следуйте инструкциям в первой главе онлайн-книги Майкла Нильсена о глубоком обучении о том, как классифицировать цифры, написанные на изображении. Затем используйте какой-нибудь традиционный алгоритм машинного обучения (например, SVM) для решения той же проблемы. Сравните различные показатели, такие как скорость алгоритма, точность, использование ЦП и т. Д.
  • Изучите алгоритм градиентного спуска как введение в то, что мы будем обсуждать в следующей статье.

использованная литература

  1. Джейсон Браунли, «Что такое глубокое обучение», Machine Learning Mastery, 2019 г.
  2. Википедия, «Искусственная нейронная сеть», Википедия, 2021 г.
  3. Википедия, «Персептрон», Википедия, 2021 г.
  4. Майкл А. Нильсен, «Нейронные сети и глубокое обучение», Determination Press, 2015 г.
  5. Гаурав Тендолкар, «Линейные классификаторы», Блокнот по машинному обучению, 2016 г.