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

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

Функциональная машина

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

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

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

Начнем сразу с небольшого набора данных:

Этот набор данных содержит два класса: зеленые треугольники и синие квадраты. С этого момента мы будем кодировать зеленые треугольники значением 1 и синие квадраты значением 0.

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

Теперь мы подробно рассмотрим этот классификатор. Однако прежде чем перейти к нейронным сетям, давайте рассмотрим более простой классификатор: перцептрон.

Шагая сквозь персептрон

Напомним, как выглядит перцептрон:

Входные данные перцептрона - это координаты точки (A и B) плюс вход «смещения» с фиксированным значением 1. Выходные данные - число от 0 до 1. Числа, близкие к 1, означают «синий квадрат», а числа близко к 0 означает «зеленый треугольник».

Когда перцептрон делает прогноз, он начинает с вычисления значения этого промежуточного узла z. Он умножает входные данные на веса и складывает результаты, например:

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

Чтобы было ясно, это плоскость, потому что мы используем данные с двумя входами и одним выходом, всего для трех измерений. С большими размерами самолет стал бы умопомрачительной линейной формой более высокого измерения. Тем не менее, основная идея остается неизменной для любого количества измерений: первая половина перцептрона образует «прямую» форму.

Вторая половина перцептрона перемещает эту форму через сигмоид, чтобы произвести выходной сигнал ŷ. Вот как выглядит ŷ:

Сигмоид изогнул z, превратив его в кривую поверхность со значениями от 0 до 1. Значения, близкие к 0, классифицируются как синие квадраты, а значения, близкие к 1, классифицируются как зеленые треугольники. Чтобы получить точный прогноз, мы можем округлить ŷ до ближайшего целого числа. Значения выше 0,5 превращаются в 1, а значения ниже 0,5 - в 0 - вот так:

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

И вот что мы получаем, когда используем перцептрон для классификации наших данных: прямую «границу принятия решения». Точки на одной стороне границы классифицируются как зеленые треугольники. Точки на другой стороне классифицируются как синие квадраты.

Напомним, вот схема перцептрона и функций внутри него:

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

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

Переход на нейронную сеть

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

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

Мы позаботились о первой половине нейросети. Чтобы завершить его, нам нужно закрыть его выходным слоем, например:

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

Говоря о функциях активации, softmax в конце несколько переборщил. Помните, как работает softmax: он принимает кучу входов («логитов») и изменяет их размер так, чтобы их сумма была 1. Только с двумя выходами, как в этом случае, каждый будет равен 1 минус другой - и как только мы узнаем, одно мы знаем и другое. Вы можете задаться вопросом: зачем нам нужны избыточные выходы? Разве мы не можем заменить softmax более простой функцией, которая возвращает одно значение от 0 до 1, например сигмоид?

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

Отступления о softmax в сторону, теперь у нас есть нейронная сеть. Посмотрим, что внутри него происходит.

Визуализация функций сети

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

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

Видеть? Три узла, которые происходят из предыдущего слоя, имеют характерную сигмовидную форму y. Единственный узел, который выпирает, - это узел дополнительного смещения, который имеет фиксированное значение 1 - горизонтальная плоскость.

Затем сеть вычисляет логиты как взвешенную сумму скрытых узлов - вот этот расчет:

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

Если вам интересно узнать фактические числовые значения, то вот веса, которые я получил в своем эксперименте:

Мы почти закончили. Затем логиты проходят через softmax, чтобы получить выходные данные, каждый из которых равен 1 минус другой. Мы решили сосредоточиться на втором выходе. Вот:

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

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

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

Чтобы подвести итог:

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

Вот визуальное резюме второй половины нейронной сети:

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

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