Нейронные сети в кусках размером с укус — начало

Нейронные сети, также известные как многослойные персептроны (MLP), представляют собой сложные алгоритмы, требующие больших вычислительных мощностей и тонны данных для получения удовлетворительных результатов в разумные сроки. Тем не менее, при правильной реализации и при наличии достаточного количества правильных типов данных они могут давать результаты, с которыми до сих пор не могла сравниться ни одна другая техника машинного обучения (с намеком на Gradient Boosted Trees для табличных данных…)

Вы уже видели этот фильм

Так что же они?

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

На высоком уровне они аналогичны любому другому алгоритму машинного обучения:

Как и многие другие алгоритмы машинного обучения, они используют формулу метка равна весу, умноженному на значение данных плюс смещение (или y = w*x + b), чтобы определить, где они рисуют свои линии/гиперплоскости для прогнозирования. (Примечание: вы можете быть более знакомы с y = mx + b, где m определяется как наклон линии. В машинном обучении этот наклон называется весом.) И, как и многие другие алгоритмы машинного обучения, они используйте градиентный спуск, чтобы найти оптимальные значения для w и b, чтобы наиболее точно соответствовать обучающей метке y во всем их наборе данных. Если вы уже разбираетесь в линейных классификаторах, таких как Персептрон и логистической регрессии, у вас есть отличное начало для понимания концепций нейронных сетей.

Нейронные сети и логистическая регрессия имеют и другие общие черты. Логистическая регрессия начинается с предположения о выпуклой форме границы решения (сигмовидная функция). Нейронные сети, при достаточной сложности, могут создавать границы решений практически любой формы. Они делают это, модифицируя гиперплоскость, чтобы она больше не была плоской (если вы мыслите в двух- или трехмерных терминах). Сигмовидную функцию можно использовать для изгиба гиперплоскости, но вы также можете использовать Softplus (которая создает кривую). line) или ReLU (в котором используется формула шарнира, аналогичная расчету потерь шарнира, используемому в машинах опорных векторов, — либо 0, либо некоторое положительное значение). На практике сегодня ReLU или Rectified Linear Unit обычно является предпочтительным подходом, поэтому я буду использовать его в качестве своего предположения о метках, когда буду писать.

…Но это не совсем то же самое…

Одним из первых отличий нейронных сетей от других алгоритмов машинного обучения является исходное предположение о весах. В то время как большинство алгоритмов машинного обучения начинают с предположения о весе, равного 0, и изменяют его, нейронные сети начинают с ненулевых весов, которые обычно генерируются случайным образом. Для линейных классификаторов, которые ищут прямую линию или гиперплоскость, или если вы предполагаете, что граница наилучшего решения для ваших обучающих данных образует выпуклую форму, на самом деле не имеет значения, каковы начальные веса. Начиная с 0, это просто простой вариант по умолчанию. Однако, если вы разрешаете волнистые линии на границе решения вместо прямых, вы не всегда хотите начинать с одного и того же места. Фактически, вы можете запустить алгоритм несколько раз, используя разные начальные веса, чтобы определить, где существует наилучшая предсказательная сила, которую вы можете найти. Значения смещения (смещения или b) для нейронных сетей могут начинаться с 1 или, если ваши значения данных масштабируются так, что 1 — это большое число (подробнее об этом позже), что-то меньшее.

Терминология и диаграммы

Различные этапы обработки данных нейронной сети называются «узлами». У вас есть входной узел, где начинаются ваши данные, и выходной узел, где заканчивается прогноз. Кроме того, слой активации посередине также считается узлом. Эти узлы связаны математическими формулами, которые мы применяем (w * x + b) либо к исходным данным, либо к результату функции узла активации исходных данных, обозначенной как f (x) ниже:

Узел активации называется «скрытым уровнем». У вас может быть более одного из этих скрытых слоев, и почему вы можете захотеть это сделать, будет темой для другого поста. Изображение выше часто называют «нейроном» (опять же, отчасти из-за сходства на уровне поверхности…). Однако на самом деле оно не закончено. Чтобы быть «сетью», вы должны быть к чему-то подключены, и получается, что нейронные сети требуют как минимум двух нейронов. Итак, вы можете подумать, что нейронная сеть может выглядеть так:

Но на самом деле мы немного упрощаем последний этап, суммируя все значения w*x и добавляя всего одно смещение, чтобы получить наш прогноз, поэтому настоящая нейронная сеть будет такой:

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

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

Что они делают

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

Эти линии были результатом использования функции активации ReLU и случайных значений весов и смещения, и мы делаем вид, что не сделали упрощение в конце для иллюстрации. Обратите внимание, что две линии начинаются с разных значений смещения (синяя +5, красная -1), которые представляют прогнозы по умолчанию для нейрона до тех пор, пока не сработает активация ReLU. Активация ReLU означает, что все прогнозируемые значения останутся на этих смещениях до тех пор, пока значение x достигает определенной точки. В случае синей линии и из-за случайного выбора весов эта активация приводит к слегка положительному наклону прогноза, который начинается, когда x = 5. Для красной линии значения равны 0 до x = 14, после чего прогнозы резко отрицательный наклон.

Теперь, чтобы получить «окончательный» результат (на данный момент), нам нужно сложить эти две строки вместе. Таким образом, наше окончательное значение смещения будет средней точкой между +5 и -1, или 2,5, которое становится нашим предсказанным значением, пока мы не доберемся до точки шарнира. Наклон обеих линий равен 0, пока x = 5, так что это не изменится. Когда x = 5, только синяя линия оказывает какое-либо влияние (наклон красной линии добавляется, но все еще равен нулю), поэтому между 5 и 14 наклон функции прогнозирования точно соответствует синей линии. Однако, когда x = 14, резкий отрицательный наклон красной линии добавляется к слабому положительному наклону прогнозирования синей линии, что приводит к умеренному отрицательному наклону прогнозирования от x = 14 и выше. Функция будет визуализировать что-то вроде этого:

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