www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Введение в нейронные сети

Дата публикации Jun 17, 2019

«Ваш мозг не производит мысли. Ваши мысли формируют нейронные сети.- Дипак Чопра

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

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

Весь код, который обсуждается в этом и последующих уроках по темам (полностью подключенных) нейронных сетей, будет доступен через мойНейронные сетиGitHub репозиторий, который можно найти по ссылке ниже.

mrdragonbear / Neural-сети

Внесите свой вклад в развитие mrdragonbear / Neural-Networks, создав учетную запись на GitHub.

github.com

Надеюсь, вам понравится статья и выучите что-то, независимо от вашего предшествующего понимания нейронных сетей. Давайте начнем!


Мотивация для нейронных сетей

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

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

Методы, которые сосредоточены вокруг моделирования и прогнозированияколичественныйПеременная ответа (например, количество пикапов на такси, количество прокатов велосипедов) называется регрессией (и Ridge, LASSO и т. д.). Когда переменная ответакатегорический, тогда проблема больше не называется проблемой регрессии, а вместо этого помечается как проблема классификации.

Рассмотрим проблему бинарной классификации. Цель состоит в том, чтобы попытаться классифицировать каждое наблюдение в категорию (например, класс или кластер), определяемуюYна основе набора переменных-предикторовИкс,

Допустим, мы хотели бы предсказать, будет ли у пациента болезнь сердца, основываясь на особенностях пациента. Переменная ответа здесь категориальна, конечные результаты, или, если быть более точным, двоичные, имеют конечные результаты, поскольку существует только две категории (да / нет).

Здесь много функций - пока мы будем использовать только переменную MaxHR.

Чтобы сделать этот прогноз, мы бы использовали метод, известный как логистическая регрессия. Логистическая регрессия решает проблему оценки вероятности того, что у кого-то есть сердечные заболевания,Р (у = 1), учитывая входное значениеИкс,

Модель логистической регрессии использует функцию, называемуюлогистическийфункция, моделироватьР (у = 1):

В результате модель будет предсказыватьР (у = 1)сSобразная кривая, которая является общей формой логистической функции.

β₀сдвиг кривой вправо или влево нас = - β₀ / β₁,в то время какβ₁контролирует крутизнуSкривая

Обратите внимание, что еслиβ₁положительный, то прогнозируемыйР (у = 1)идет от нуля для небольших значенийИкск одному для больших значенийИкси еслиβ₁отрицательно, то у него есть противоположная ассоциация.

Это обобщено графически ниже.

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

Мы можем изменитьβ₀значение для того, чтобы переместить наше смещение.

Мы можем изменитьβ₁значение для того, чтобы исказить наш градиент.

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

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

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

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

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

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

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

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

Затем мы «обучаем» сеть, фактически наказывая ее за плохую работу.

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

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

В идеале мы хотим знать ценностьвесэто дает минимумℒ (ш).

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

Затем нам нужно найтивесэто удовлетворяет этому уравнению. Иногда нет явного решения для этого.

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

Если шаг пропорционален наклону, вы избегаете превышения минимума.

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


Градиентный спуск

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

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

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

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

Есть несколько соображений, чтобы сделать градиентный спуск:

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

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

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

Источник

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

Пример поверхности потери нейронной сети.Источник
Сеть застревает в локальных минимумах.
Сеть достигает глобальных минимумов.

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

Для каждой итерацииКДля получения производных можно использовать следующую функцию потерь (правдоподобия):

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

Затем мы выбираем пакет данных, возможно, 10% от полного набора данных, и строим новую поверхность потерь.

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

Мы сейчас на новом месте. Мы выбираем новое случайное подмножество полного набора данных и снова строим нашу поверхность потерь.

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

Мы продолжаем эту процедуру снова с новым подмножеством.

И выполнить наше обновление.

Эта процедура продолжается в течение нескольких итераций.

Пока сеть не начнет сходиться к глобальному минимуму.

Теперь у нас есть достаточные знания в нашем наборе инструментов для построения нашей первой нейронной сети.


Искусственная нейронная сеть (ANN)

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

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

Источник

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

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

Мы можем нарисовать нейронную диаграмму, которая проводит аналогию между нейронной структурой и искусственными нейронами в нейронной сети.

Источник

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

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


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

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

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

Теперь мы можем вернуться к нашему первому примеру с нашими данными о заболеваниях сердца. Мы можем взять две логистические регрессии и объединить их вместе. Индивидуальные логистические регрессии выглядят следующим образом:

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

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

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

Нам нужно уметь вычислять производные функции потерь по этим весам. Чтобы узнать недостающие веса, w₁, w₂ и w₃, нам нужно использовать то, что называется обратным распространением.


обратное распространение

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

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

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

Источник

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

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

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

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

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


Более сложные сети

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

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

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

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

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

Так почему люди используют многослойные нейронные сети, если одного слоя достаточно?

Нейронная архитектура с несколькими скрытыми слоями.

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

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


Резюме

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

Нейронные сети пошаговые.Источник

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

Часть 2 скоро будет доступна, следите за обновлениями!


Ссылки

Дж. Носедал и С. Райт, «Численная оптимизация», Springer, 1999

TLDR: J. Bullinaria, «Обучение с Momentum, сопряженное градиентное обучение», 2015

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map