Это способ проще, чем вы думаете.

Большая часть приведенного ниже контента основана на курсе Введение в глубокое обучение с помощью PyTorch от Facebook AI. Если вы хотите узнать больше, пройдите курс или просто загляните здесь.

Представьте, что вы изучаете информатику и хотите знать, каковы ваши шансы поступить в университет своей мечты.

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

Вы были хорошим учеником с отметками 7 и оценками. Не могли бы вы определить, будете ли вы приняты?

Поздравляю! Ответ - ДА.

Откуда нам это знать? Что ж, когда вы смотрите на этот график, вы, вероятно, искали точку (7,6). Видя, что вокруг него много синих точек, и он был глубоко в синей области, вы могли предположить, что вас приняли.

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

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

Нахождение уравнения

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

В данном случае уравнение этой линии: 2x₁ + x₂ -18 = 0.

Что интересно, с помощью линейного уравнения мы можем извлечь математическую формулу, чтобы определить, приняты ли ученики. Это просто означает, что уравнение, используемое для определения сдал ли учащийся экзамен, составляет 2 * тест + -18 оценок. Если полученное число больше или равно 0, поздравляем с принятием! Если нет, то удачи в следующий раз.

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

Итак, давайте вернемся к нашему старому вопросу об учащемся с оценками и баллом 6, который принимается или отклоняется. Скважина 2 * 6 + 6–18 = 0. 0 равен 0, что является минимальным баллом для принятия, что означает, что этот ученик действительно принят.

Все линейные уравнения будут иметь следующий формат W₁x₁ + W₂x₂ + b. Сложно? Нисколько. Вернемся к уравнению 2x₁ + x₂ -18 = 0

В этом уравнении W₁ равно 2, умножаемое число - x₁ или, в данном случае, тест. w называется весом, и все, что вам нужно сделать, это умножить x₁ на него . x в данном случае - это входные для нашего примера баллы учащихся за их тест и оценки.

Это потому, что мы не хотим настраивать входы x, поэтому w позволяет нам манипулировать значениями, не касаясь входов.

То же самое касается W₂, у нас не было числа до x₂ в предыдущем уравнении, потому что вес равен 1 означает, что мы можем просто выразить x₂ как x₂.

Наконец, что не менее важно, у нас есть b, что означает смещение. b может быть как положительным, так и отрицательным числом, в нашем случае это число было -18.

Проблема размера

Возвращаясь к правильному пути, что, если бы у нас была еще одна часть данных, например, рейтинг класса? Что ж, вместо того, чтобы визуализировать точки данных в двух измерениях, мы бы вместо этого использовали 3 измерения для визуализации данных. Следовательно, уравнение больше не будет W₁x₁ + W₂x₂ + b,, а вместо этого будет W₁x₁ + W₂x₂ + W₃x₃ + b.

Помните, это потому, что у нас есть еще один вход (x₃) или, в нашем примере, ранг класса. Сейчас это не кажется большой проблемой, но если бы у нас было 4 разных фрагмента данных или 5, 20 или даже 1000. Что нам тогда делать?

Итак, одно общее решение, которое было согласовано, - это упрощение уравнения W₁x₁ + W₂x₂ + b до векторного уравнения Wx + b. В этом уравнении W представляет собой W₁…, Wn-₁, Wn, а x представляет x₁…, xn-₁, xn. Где n - количество измерений. Это означает, что W и x представляют все без исключения W и x в уравнении Wx+ W x… .. W n x n + b

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

Еще одна вещь, на которую следует обратить внимание с несколькими измерениями, - это граница решения. В 2D-фигурах мы использовали одномерную границу решения. В приведенном выше трехмерном примере мы использовали двухмерную границу решения. Заметили закономерность? Граница решения всегда находится на одно измерение ниже пространства, в котором она находится. Мы называем это гиперплоскостью. Если есть n измерений, нашей границей решения всегда будет n-1 размерность.

Когда мы думаем о нейронных сетях, мы часто думаем о следующем.

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

Персептроны

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

Вы, возможно, помните, что наше первоначальное уравнение также содержало систематическую ошибку. С нашим уравнением 2x₁ + x₂ -18 = 0. Итак, где это?

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

В этом случае мы добавляем третий узел со значением 1. Но помните, что наш базис равен -18, так почему out x здесь 1? Что ж, оказывается, что линии, которые мы видим, на самом деле все взвешены. В нашем случае тестовая линия имеет вес 2, линия уклона имеет вес 1, а линия смещения имеет вес -18.

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

Нахождение линейной границы

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

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

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

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

Теперь наша неверно классифицированная точка находится в (4, 5). С нашей линейной границей, имеющей уравнение 3x1 + 4x2–10 = 0. Это означает, что если точка выше 0, точка будет синей, а намного ниже вернется красный цвет. Однако, как мы видим, эта линия в корне ошибочна, так как красная точка находится в синей области, давайте это изменим.

Теперь, чтобы зафиксировать линейную границу, все, что нам нужно сделать, это вычесть веса и смещения линейной границы (3, 4, -10) на расположение точки, а также еще одно смещение (давайте установим его на 1 для Теперь).

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

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

Скорость обучения традиционно колеблется от 0,001 до 0,01. В этом сценарии мы собираемся установить скорость обучения на 0,1, умножив числа, которые мы использовали для вычитания, на 0,1.

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

Теперь предположим, что у нас есть точка, расположенная в отрицательной области. Что бы мы сделали? Что ж, на самом деле единственное изменение здесь - это сложение вместо вычитания. Поэтому вместо вычитания, например, из 3, 4 и -10, мы добавляем к нашему вводу.

Теперь попробуй! Точка здесь расположена в (1,1), наша скорость обучения - 0,1, а наше смещение - 1. Можете ли вы определить, как выглядит уравнение новой линейной границы?

Если ваш ответ был 3,1x₁ + 4,1x₂ -9,9 = 0, ваш правильный ответ! Поскольку наша точка зрения и предвзятость равны 1, а скорость обучения - 0,1, мы просто добавили бы 0,1 к каждому из наших чисел.

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

Функция ошибки

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

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

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

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

Как будет выглядеть функция ошибок в количественном выражении? Было бы просто 2 или 3? Или это будет какое-то десятичное число?

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

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

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

Сигмовидная

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

Когда сигмовидная функция умножается на любое число, она возвращает некоторое значение от 1 до 0. Чем больше число, тем оно ближе к 1, и чем меньше число, тем ближе оно к 0. Число 0 находится точно в точке. 0,5.

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

Возьмем, к примеру, если ваша нейронная сеть вернула числа 5, 1 и -5. Если бы число было 5, ваша нейронная сеть вернула бы 0,924, очень близкое к 1, если бы ваше число было 1, функция активации вернула бы 0,62, очень близко к 0,5. И, наконец, если бы ваше число было -5, функция активации вернула бы значение 0,075.

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

Вероятностное пространство

Чтобы определить вероятность правильной классификации каждой точки, мы создаем вероятностное пространство. Это вероятностное пространство основано на нашей линейной границе с линейной границей 0,5. Это означает, что если точка лежит на линейной границе, вероятность того, что она красная или синяя, составляет 50%.

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

Максимальная вероятность

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

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

Теперь давайте умножим его, чтобы получить некоторый результат. Обратите внимание, как мы можем видеть здесь, красная точка с вероятностью 0,9 не синяя. Это означает, что на самом деле мы берем обратное значение, поэтому 0,1, мы также возьмем обратное значение для синей точки в красной области. Мы бы также присвоили 0,7 красной точке в красной области со значением 0,3. Теперь, если мы умножим эти значения на 0,1 * 0,6 * 0,7 * 0,2, мы получим значение 0,0084. Попробуем второй сценарий

Обратите внимание, что эти вероятности относятся к конкретному цвету, поэтому 0,8 будет вероятностью 0,8 для красного, ну 0,9 будет указывать на вероятность 0,9 для синего. Если мы умножим 0,8 * 0,7 * 0,6 * 0,9, мы получим значение 0,324.

Что же означают эти цифры? Что ж, он возвращает вероятность правильной классификации точек. В нашем первом сценарии наши шансы составляли 0,8%, а во втором - 32%. Теперь мы ясно видим, какая модель лучше.

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

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

Перекрестная энтропия

Если бы между логарифмами машинного обучения и существовал «секретный соус», то это был бы он. Произведение логарифма X * Y равно сумме логарифма X + Y. Итак, давайте использовать логарифмы. Теперь, когда мы используем логарифм в наших вычислениях, это выглядит примерно так.

ln(0.6) + ln(0.2) +ln(0.1) +ln(0.7) = (-0.51) + (-1.61) + (-2.3) +(-0.36)

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

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

Алгоритм А

= ln(0.6) + ln(0.2) +ln(0.1) +ln(0.7)

= (0.51) + (1.61) + (2.3) +(0.36)

= 4.8

Вы также можете попробовать Алгоритм B.

ln(0.7) + ln(0.9) +ln(0.8) +ln(0.6)

Алгоритм Б

= ln(0.7) + ln(0.9) +ln(0.8) +ln(0.6)

= (.36) + (.1) + (.22) +(.51)

= 1.2

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

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

Архитектура нейронной сети

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

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

Но как это на самом деле работает? Что ж, давайте посмотрим на это по пунктам. Мы знаем, что линейная модель - это вероятностное пространство, поэтому давайте определим вероятность каждой точки.

Вероятности в этом случае составляют 0,7 и 0,8. Теперь давайте сложим 0,7 + 0,8 и получим 1,5. Конечно, нам нужно сделать еще одну вещь, поскольку вероятность 1,5 математически невозможна.

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

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

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

Возможно, вы заметили, что структура приведенных выше линейных уравнений пугающе похожа на структуру перцептрона. Это не совпадение и лежит в основе взаимосвязи линейных уравнений и восприятия. Если мы посмотрим на уравнение ниже, мы увидим, что вход (x) умножается на некоторое смещение (5 или -2). Мы также можем видеть наше смещение положительного числа 8, чтобы гарантировать, что вывод не будет перекосом.

Мы можем проверить это снова с помощью нашего второго уравнения со смещением -1 и весами 7 и -3.

Корреляция между вероятностным пространством и восприятием подтверждается. Теперь давайте объединим эти два линейных уравнения в нейронную сеть. Возможно, вы помните, что второй слой имеет веса 7 и 5. Это вместе со смещением -6 позволяет нам соединить его с нашими предыдущими уравнениями.

Ради форматирования мы можем очистить нашу нейронную сеть дальше и исключить повторяющиеся x1 и x2 на первом уровне.

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

Математика с прогнозированием

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

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

Хорошо, давайте рассмотрим математику слой за слоем. Сначала мы умножим наш первый слой (x1, x2, 1) на наши веса. Каждый вход будет иметь разные веса, в уравнении веса в одной строке - это те, которые мы умножаем. Затем мы передаем результат входных * весов через сигмовидное уравнение, чтобы получить значение от 0 до 1. Затем мы умножаем эти результаты на некоторый вес (второй слой W). Затем этот вывод будет еще раз пропущен через сигмоид, чтобы получить наш вывод.

Заключение

Вот и все! Полное полуматематическое руководство по интуиции нейронной сети. Если вы не получаете 100% всего контента, не волнуйтесь, многие старшие инженеры тоже этого не делают. Вместо этого гораздо более ценно общее понимание того, как все части взаимодействуют друг с другом.

Основные выводы

  • Нейронная сеть устанавливает линию для определения границы между различными выходами, называемую границей решения.
  • Количество входов равно количеству измерений, в которых данные отображаются по формуле Wx + b.
  • Линейная граница перемещается небольшими приращениями из-за скорости обучения. Используется градиентный спуск.
  • Линейная граница получает обратную связь о своей работе непрерывным выходом в результате вероятностного пространства.
  • Мы вычисляем непрерывный выход, используя отрицательный логарифм, чтобы определить кросс-энтропию нашей сети и насколько хорошо она работает.
  • Изогнутые границы представляют собой комбинацию линейных границ, которые могут быть представлены перцептронами.
  • Математические данные, лежащие в основе нейронных сетей, умножаются на веса и функцию активации. Чем больше слоев, тем больше раз мы умножаем на веса и функцию активации.

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