Изучите математику, лежащую в основе моделей глубокого обучения!

Вступление

Цель этой публикации:

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

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

В общем смысле нейронные сети - это метод аппроксимации функций. Следуя универсальной аппроксимационной теореме:

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

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

У нейронных сетей есть два основных ограничения:

  • Они могут только приближать непрерывные функции
  • И в определенном диапазоне значений

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

Они будут выполнять что-то похожее на то, что показано на изображении ниже:

По сути, они преобразуют входные данные в другое пространственное представление, чтобы было проще их различать.

Следующий пример действительно показателен:

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

Получилось бы что-то похожее на:

Но, как видим, не совсем хорошо. Хотите узнать, на что способна нейронная сеть?

Так выглядит лучше;)

Что нейронные сети не умеют делать

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

  • Во-первых, потому что мы потребовали бы от него точных значений.
  • Во-вторых, потому что, как мы уже говорили, они способны приближать функции в заданном диапазоне. Для умножения потребуется диапазон [-inf, + inf].

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

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

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

Как обучаются нейронные сети?

По сути, процесс обучения нейронных сетей похож на обучение человека. Они учатся повторением.

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

Давайте посмотрим на конкретный пример

Как вы, возможно, знаете, нейронные сети состоят из слоев, которые, в свою очередь, состоят из нейронов.

По этой ссылке вы можете увидеть полный пример: https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/

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

Архитектур намного больше, но эта самая используемая. В этом типе архитектуры каждый нейрон i-слоя соединяется со всеми нейронами i + 1 слоя.

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

Для простоты предположим, что наш обучающий набор состоит только из 1 элемента: 0,05, 0,1, который является классом 1 (это может быть класс 0, если вероятность нейрона o1 больше, чем вероятность нейрона o2, или класса 1, если вероятность происходит обратное).

На следующем изображении вы можете увидеть сеть со случайно инициализированными весами, элементом обучающего набора на входе и желаемым выходом:

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

Два наиболее распространенных метода обучения:

  • Вперед пас
  • Обратное распространение

Вперед пас

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

Но прежде всего давайте посмотрим, каков нейрон на самом деле:

Где fn_activation - выбранная функция активации. Некоторые из наиболее популярных функций активации:

Похожи ли искусственные нейронные сети на настоящие нейронные сети?

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

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

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

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

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

Нейронные сети основаны не на своих биологических партнерах, а на них самих.

Прямое и обратное распространение

Теперь мы поймем, как сеть вычисляет выход outh1.

Взглянем еще раз на сеть:

ИЗОБРАЖЕНИЕ

Для расчета o1 и o2 нам потребуется:

Для первого слоя скрытый слой:

Для последнего слоя выходной:

Где: o1 = outo1 и o2 = outo2.

Итак, нам нужно рассчитать:

Теперь, чтобы получить outh1 и outh2, нам нужно применить fn_activation. В данном случае мы выбрали логистическую функцию в качестве активационной:

so:

Давайте посмотрим, как мы находимся в процессе вычисления выходных данных:

Теперь нам просто нужно вычислить o1 и o2:

Итак, применив функцию активации:

Наконец-то! Наши прогнозы нейронной сети рассчитаны! Но подождите, наши прогнозы ужасны! Они совсем не похожи на желаемые 0,01 и 0,99! Как это исправить?

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

Давайте посчитаем общую ошибку:

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

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

Например, можете ли вы придумать способ подсчитать, насколько вес w5 влияет на общую ошибку? Другими словами, насколько изменение веса w5 влияет на общую ошибку? Вам не знакомо?

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

Давайте посмотрим на пример: представьте, что мы хотим создать производную функцию:

Другими словами, мы хотим выяснить, насколько изменение переменной x влияет на переменную y.

Мы можем понимать эту функцию как композицию других 2, где:

Теперь нам нужно получить y по отношению к x. Для этого нам нужно получить сначала y по отношению к u, а затем u по отношению к x .

В нашем примере:

Применялось цепное правило. Давайте теперь посмотрим на это как на график:

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

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

Как сказал Джек Потрошитель: давайте по частям. Общая ошибка определяется как:

Как мы видим, w5 влияет только на нейрон o1, поэтому мы просто заботимся о Eo1, что делает наше Etotal = Eo1.

Таким образом, мы могли бы определить дисперсию веса w5 с учетом Etotal как:

Большой! Пойдем со следующим термином:

Это можно выразить как:

И его производная:

Последние два шага возможны, потому что производная логистической функции является четной функцией, то есть f (x) = f (-x).

Хорошо, давайте вернемся к делу. У нас уже есть производная, поэтому теперь мы должны вычислить ее значение:

У НАС уже есть первый и второй термины, и нам просто нужно вычислить выделенный термин, чтобы добраться до w5:

Если мы помним, in01 был:

А если мы посмотрим на входы нейрона o1, то сразу же сможем вычислить формулу in01:

И теперь мы можем вычислить наш срок;

Наконец-то! У нас уже есть все необходимые термины, чтобы узнать, насколько w5 влияет на Etotal:

Мы уже знаем, как рассчитать, насколько влияют веса между вторым слоем и терерой (скрытым и выходным). Но… как мы узнаем, на что влияют веса между первым слоем и вторым слоем (входом и выходом)?

Очень просто, как и раньше!

Что нам нужно определить в первую очередь?

Производная от Etotal по весу w1. И как это определяется?

Вот сеть:

Давайте разберем нейронную сеть в нейронах:

Теперь у нас есть 2 возможных пути:

Итак, нам нужно вычислить ошибки, соответствующие 1 и 2 нейронам:

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

При этом мы уже должны:

Решим вопрос Eo1:

Теперь у нас есть, насколько различается Eo1 по отношению к w1. Но нам чего-то не хватает, если еще раз взглянуть на нейросеть:

Нам также нужна ошибка, соответствующая второму нейрону, Eo2. С помощью этой ошибки мы могли бы вычислить, насколько вес w1 влияет на Etotal, что нас и интересует:

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

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

Заключительные слова

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

Если вам понравился этот пост, вы можете просмотреть другие мои посты о Data Science и Machine Learning здесь.

Если вы хотите узнать больше о машинном обучении, науке о данных и искусственном интеллекте, подписывайтесь на меня на Medium и следите за моими следующими сообщениями!