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

Сначала давайте посмотрим, что такое классификация? Представьте, что вам дано 100 помеченных образцов длины лепестков и длины чашелистиков двух видов цветков. Итак, у вас есть 50 образцов цветка A и 50 образцов цветка B. Теперь кто-то дает вам новый образец (который содержит новую длину лепестков и новую длину чашелистиков) и спрашивает вас, какой это цветок, A или B? Вам нужно классифицировать этот образец (сказать, что это за цветок) на основе 100 образцов, которые вы дали вам ранее. Способ, которым нейронные сети решают эту задачу, очень прост и великолепен!

Вернемся к первому примеру; Классификация цветков по длине лепестков и чашелистиков. Рассмотрим рисунок п.1. Он показывает распределение цветков по длине лепестков и чашелистиков.

Предположим, что синее распределение относится к цветку A, а желтое — к цветку B. А также допустим, что горизонтальная ось (которую мы назовем x_1) представляет собой длину лепестка, а вертикальная ось (которую мы назовем x_2). ) — длина чашелистика.

Вы, очевидно, видите, что их можно классифицировать по линии, которая отделяет синие от желтых. Уравнение прямой в 2-мерном пространстве: (w_1).x_1 + (w_2).x_2 + b = 0. Итак, нам нужно найти лучшие w_1,w_2 и b, чтобы найти лучшую линию. Для этого нам нужна некоторая функция, которая сообщает нам, насколько мы ошибаемся, исходя из лучшей линии и лучшей классификации. В содержимом нейронной сети мы называем эту функцию Функция потерь. Простая функция потерь — это наименьший квадрат. Функция наименьших квадратов:

Я не хочу вдаваться в основы функций потерь и того, как они получены, но вы можете рассматривать их как функцию, которая сравнивает истинный ответ с нашим прогнозом для всех выборок и дает нам ошибку. Как видите, мы вычитаем наш прогноз (h(xi)) из истинного ответа (di), а затем возводим его во вторую степень по всем заданным выборкам (i от 1 до m для m выборок). Если вы не уверены в функции потерь, я предлагаю вам прочитать Статья Тиртаджиоти Саркара о функции потерь наименьших квадратов, чтобы получить краткое представление о том, что такое функция потерь и как мы можем их создать.

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

Он показывает графическое представление потерь (J(w,b)) по отношению к коэффициентам(w,b). На этом рисунке у нас есть только 2 коэффициента, конечно, мы можем иметь более 2 коэффициентов. Задача оптимизатора — найти красную точку на графике. После того, как он найдет точку чтения, мы можем получить нашу строку для классификации данных. На рис. п.4 показана секретная версия данных.

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

Таким образом, очевидно, что нам нужно какое-то нелинейное преобразование для преобразования данных в новую координату, и в этой координате легко найти строку для их классификации. Есть несколько популярных функций, которые могут выполнять это нелинейное преобразование, которое, кажется, отлично справляется с преобразованием. У них также есть другие атрибуты, которые могут помочь нам в задаче классификации. Примерами таких функций являются сигмовидная, тангенциальная, ReLU и т. д. Опять же, в контексте нейронной сети мы называем эти функции Функциями активации. Если мы это сделаем, мы сможем получить распределение данных, идеально подходящее для линейной классификации. Уравнение может быть таким: Tanh((w_1).x_1 + (w_2).x_2 + b)(или какая-либо другая функция активации). Рассмотрим рисунок п.6..

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

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

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

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

Но что, если нелинейное преобразование не работает? Можете ли вы представить себе случай, когда даже нелинейное преобразование не работает? Рассмотрим рисунок п.10.

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

Итак, что мы можем сделать? Один из способов заключается в том, что мы можем использовать высшие измерения, чтобы помочь себе. Представьте, что вы могли бы просто сопоставить все данные с более высоким измерением, которое делает красные точки над синими. Тогда вы легко сможете классифицировать их с помощью плоскости.

На рис. п.12 видно, что мы легко можем классифицировать их плоскостью. Чтобы выполнить эту операцию, мы можем использовать новое измерение для классификации. Новые параметры представляют собой комбинации исходных параметров: D1 = (w_1).x_1 + (w_2).x_2 + b_1, D2 = (w_3) .x_1 + (w_4).x_2 + b_2 и D3 = (w_5).x_1 + (w_6).x_2 + b_3(Ds это размеры). И мы используем эти новые измерения для классификации данных, которые будут такими: (w_1).D1 + (w_2).D2 + (w_3).D3+ b. Это уравнение для трехмерной плоскости, и цель нейронной сети — найти наилучшие веса (w_n и b_n) для классификации данных.

рассмотрим рисунок п.13.

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

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

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

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

Ссылки:

http://colah.github.io/posts/2014-03-NN-Manifolds-Topology/

https://playground.tensorflow.org



https://towardsdatascience.com/gradient-descent-in-a-nutshell-eaf8c18212f0