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

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

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

Направление точки от отрезка линии

Цель этой проблемы - определить, находится ли точка справа от линейного сегмента или слева от линейного сегмента. Для данного отрезка AB мы используем знак определителя векторов (AB, AM), где M (X, Y) - точка запроса, а положение определяется как

Если значение позиции равно 0, то точка находится на линии, +1 с одной стороны и -1 с другой. Однако, поскольку у нас нет точек A и B (у нас в руке бесконечная линия, а не отрезок), мы используем альтернативу этому. Мы можем определить, находятся ли две точки P1 (x1, y1) и P2 (x2, y2) на одной или противоположных сторонах линии, используя знак (L11 / L22), где L - прямая ax + by + c и L11 = ax1 + by1 + c (аналогично L22). Если он положительный, это означает, что обе точки находятся на противоположных сторонах. Поскольку у нас нет контрольных точек, мы используем начало координат (L00) для разделения точек. Теперь L00 = a * 0 + b * 0 + c = c (константа). Следовательно, просто используя знак L11, мы можем определить, находятся ли точка x1 и начало координат на одной или противоположных сторонах линии L. Один класс - это тот, который содержит начало координат, а другой - нет. Величина L11 пропорциональна удалению точки P1 от линии L. С точки зрения классификации это означает, насколько уверенно мы можем сказать, что она принадлежит к соответствующему классу (точки, расположенные рядом с линией классификации, более склонны к ошибочной классификации) .

Что представляет собой нейрон?

В нейронной сети нейрон определяется как самая базовая единица, связанная с нейронами предыдущего уровня через веса, имеет член смещения и функцию активации. Но что это представляет собой математически? Давайте рассекать нейрон по частям. Глядя на рисунок 3, мы можем представить нейрон, представляющий линию w1 * x + w2 * y + b = 0.

Основываясь на предыдущем разделе, мы можем сказать, что с учетом входной точки (x1, y1) мы можем определить ее класс, просто посмотрев на величину члена w1 * x1 + w2 * x2 + b. Однако, используя этот линейный термин, мы не можем реализовать сложные границы, что объясняется далее в этой статье. А вот и спасатель, функция активации сигмовидной кишки. Все отрицательные значения имеют выход ‹0,5, а все положительные значения имеют выход› 0,5. Ближе выход сигмоида к 1 (или к нулю) подразумевает более положительное значение, что, в свою очередь, означает, что точка находится далеко от линии (далеко от линии в другом направлении), т.е. более вероятно, что точка принадлежит упомянутой класс.

Какой знак выхода нейрона относится к какому классу?

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

Я разработал сеть с помощью библиотеки keras, которая очень проста в использовании. Вы можете найти все реализации здесь. Это соответствует модели 1 в коде. Теперь, поскольку это пример с двумя классами, все, что нам нужно, - это простой линейный классификатор. Итак, один нейрон с функцией активации сигмовидной кишки (очевидно, с этой сетью и данными для достижения 100% точности). Веса, полученные моделью, равны w0 = 3,510 и w1 = 3,507 со смещением b = -10,593. Классификатор, построенный вместе с данными, показан на рисунке 4.

Эта сеть при тестировании в точке [-15, -15] дала на выходе идеальный 0 (подразумевает, что L11 имеет значение -ve), а на [15, 15] - идеальный 1 (подразумевает, что L11 имеет значение + ve) на выходе. Можно четко заметить, что [-15, -15] и [0, 0] находятся на одной стороне и, следовательно, значение -ve. Что, если мы перевернем метки? Когда я просто поменял местами метки данных, вывод [-15, -15] должен быть 1, что невозможно с текущими весами и данными, поскольку [-15, -15] и [0, 0] находятся на на той же стороне линии. Вместо этого модель меняет знак весов, чтобы добиться этого. Модифицированные веса: w1 = -3,509, w2 = -3,508 и b = 10,602. Хотя обе весовые конфигурации представляют одну и ту же линию, модель просто перевернула знаки параметров, чтобы присвоить положительное значение набору, содержащему начало координат.

Примечание. Несмотря на то, что [-15, -15] и [0, 0] находятся на одной стороне линии, модель смогла присвоить точке + ve значение, потому что мы зафиксировали член знаменателя L00 равным 1, а не c (здесь = b). Мы нигде в модели не использовали термин L00.

Где в сети происходит сложное обучение (использование нелинейности)?

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

Давайте посмотрим на следующий пример набора данных на рисунке 5, чтобы понять это подробно. Очевидно, что набор данных нельзя классифицировать, используя одну строку. Используя логистическую регрессию, нужно использовать функции более высокого порядка, такие как (x1) ², (x2) ², .., чтобы имитировать круговые или другие сложные границы.

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

Нам просто нужны два нейрона для имитации двух линий и один логический вентиль, который будет реализован поверх него для обработки информации. Логический вентиль должен обрабатывать следующую информацию: если данная точка находится слева от строки L1 (выход нейрона N1 - -ve) и слева от строки L2 (выход нейрона N2 - -ve), то она принадлежит классу 1. Если точка лежит справа от строки L1 (выход нейрона N1 + ve) и слева от строки L2 (выход нейрона N2 -ve), то она принадлежит классу 2. Если данная точка лежит справа от строки L1 (выход нейрона N1 равен + ve) и справа от строки L2 (выход нейрона N2 равен + ve), то он снова принадлежит классу 1. Следующая информация может быть представлена ​​в таблице, приведенной на рисунке 7.

Следовательно, нейрон N3 должен действовать как логический вентиль, таблица истинности которого должна быть такой, как показано на рисунке 7. Как мы можем подтвердить, что модель действительно учится тому, что я предполагаю? Для этого вам нужно продолжить чтение моей следующей статьи, где я проверял эти гипотезы, реализуя некоторые из этих моделей.