Математика, код, рисунки, графики, аналогии и интеллектуальные карты

Я намерен познакомить вас с основными концепциями нейронных сетей, используя аналогии, математику, код, графики, рисунки и интеллектуальные карты. Мы фокусируемся на строительном блоке нейронных сетей: персептронах.

На протяжении всей статьи мы столкнемся с пугающей математикой и реализуем ее, используя код Python с Numpy. Мы также рассмотрим эквивалентную реализацию с использованием Scikit-learn. Наши результаты будут визуализированы с помощью Matplotlib и Plotly. И в конце каждой концепции мы структурируем свое понимание с помощью интеллект-карт.

Строение перцептрона

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

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

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

Входные данные умножаются на соответствующие веса, а затем суммируются со смещением. Это смешивание ингредиентов с соответствующими весами и добавление со смещением является аффинной функцией: z = 𝑤x + 𝑏

После смешивания кальмар выставляет оценку своего впечатления от вкуса. Эта оценка называется активацией и рассчитывается с использованием функции активации. Активация может быть просто результатом z, как есть , в этом случае мы можем использовать функцию identity. Это может быть число от -1 до 1, в этом случае мы можем использовать функцию гиперболический тангенс. Это также может быть число от 0 до 1, в этом случае мы можем использовать функцию сигмоида. Или число от 0 до ∞, в этом случае мы можем использовать функцию линейный блок выпрямителя (ReLU). Наконец, Squid может также попросить дать несколько баллов за один и тот же ввод, каждый балл от 0 до 1 на основе разных критериев. В этом последнем случае нас может заинтересовать доведение суммы всех оценок до 1, функция softmax была бы идеальной для этой задачи.

Выбор делается в зависимости от задачи и интервала вывода, который вам лучше всего подходит. Пример вычисления активации сигмоида 𝑎 ′ из входного вектора 𝑎 с весами 𝑤 и смещением 𝑏:

Терминология:

  • Может сбивать с толку входной вектор, представленный как 𝑎 в уравнении 1 и x в z = 𝑤x + 𝑏. Причина в том, что узлы входного слоя также называются активациями. В случае многослойных персептронов существует более двух слоев, и каждый слой считается входным слоем для следующего за ним.
  • Веса и смещение называются параметрами 𝑎 ′. Можно объединить веса и смещение в один вектор параметров. Это можно сделать, добавив перед вектором входов 1 и смещения в векторе, изначально содержащем только веса.

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

Тренировка перцептрона

De gustibus non est disputandum

Мы недовольны результатом нашего друга Squid. Кажется, что параметры, на которых он работает, случайны. Разумеется, смещение и веса были инициализированы как таковые:

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

Целью оценки производительности Squid является измерение его ошибки по отношению к целям y. Есть разные функции для вычисления этой ошибки:

  • Среднеквадратичная ошибка (MSE): хороший выбор, если задача является регрессионной и набор данных не содержит выбросов.
  • Абсолютная средняя ошибка (AME): хороший выбор, если задача является регрессионной и набор данных содержит выбросы.
  • Хубер-Лосс: сочетание MSE и AME.
  • Кросс-энтропия (потеря журнала): хороший выбор, если задача состоит в классификации: выходные данные перцептрона представляют собой распределение вероятностей.

Чтобы оценить наш перцептрон, мы будем использовать функцию среднеквадратичной ошибки:

Обучение направлено на минимизацию ошибки 𝐶 путем настройки параметров w и b. Лучше всего это представить себе на примере горы, когда вы пытаетесь спуститься домой, когда слишком темно, чтобы увидеть. Главная страница внизу представляет ошибку 𝐶 как минимум. Вычисление квадратного корня из MSE дает вам расстояние прямой линии между вами и домом. Однако знание этого расстояния не поможет вам в темноте. Вместо этого вы хотите знать, в каком направлении двигаться дальше.

Направления в трехмерном мире учитывают три координаты x, y и z. Отсюда вопрос «где дом?» нужно ответить относительно x, y и z. Точно так же вопрос «где минимальная ошибка 𝐶?» необходимо ответить с учетом параметров w и b. Математическое представление этих направлений - градиент. В частности, отрицательный градиент 𝐶:-.

∇𝐶 - вектор, содержащий все частные производные C по каждому параметру. Для MSE мы начнем с вывода уравнения 3:

Мы просто вывели MSE, нам нужно еще немного поработать, прежде чем мы получим частные производные от по параметрам. В уравнении 4 𝑎 зависит от выхода функции активации. В случае активации сигмовидной кишки 𝑎 эквивалентно 𝑎 ′ в уравнении 1. Затем идет градиент 𝐶 относительно z (напомним, что z = 𝑤x + 𝑏 ):

У нас есть градиент 𝐶 относительно z. Поскольку смещение в z умножается на 1, частные производные C по смещению равны:

И поскольку веса умножаются на вход x, частные производные C по весам:

Имея частные производные стоимости 𝐶 по параметрам, теперь мы можем иметь направление, в котором мы сделаем следующий шаг к дому. Теперь нам нужно знать, какой ширины мы должны сделать ступеньку. Выбор подходящего размера шага очень важен. Если ваш шаг слишком узкий, вы не сможете перепрыгивать препятствия на своем пути. Если ваш шаг будет слишком широким, вы можете пролететь мимо всего города внизу и оказаться на другой горе. Хороший размер шага находится где-то посередине, и его можно рассчитать, умножив частные производные (уравнения 6 и 7) на выбранное значение, называемое скоростью обучения или eta: 𝜂.

Теперь мы можем спуститься по склону горы. Это эквивалентно обновлению наших координат / параметров:

На этом завершается градиентный спуск: процесс вычисления направления и размера следующего шага перед обновлением параметров. С помощью Gradient Descent мы можем обучить Squid улучшить вкус. Мы делаем это, заставляя Squid питаться некоторыми входными данными и выводить оценку с использованием уравнения 1: это называется Feedforward. Оценка подставляется как 𝑎 в уравнение 4, результат которого подставляется как градиент 𝐶 относительно в уравнение 5. Затем мы вычисляем градиент 𝐶 относительно z в уравнении 6. Наконец, мы вычисляем градиент 𝐶 относительно параметров и обновляем изначально случайные параметры Squid. Этот процесс называется обратным распространением, поскольку он распространяет ошибку в обратном направлении от выходного уровня к входному.

Градиентный спуск является итеративным. Он останавливается, когда выполняется одно из этих условий:

  • Достигнуто заданное максимальное количество итераций.
  • Градиент достигает 0 или близок к нему на определенное значение.
  • Ошибка проверки достигла минимума. Это называется ранней остановкой.

Собираем кусочки вместе

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

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

Мы знаем, что для достижения целей наш перцептрон должен будет начать со случайными параметрами и оптимизировать их, чтобы смещение было равно 0, первый вес - 1, а второй вес - 0,5. Давайте проверим это:

В Scikit-learn

Мы начали с самого простого перцептрона. Поскольку он выполняет регрессию, ему не нужна функция активации. Все, что он пока делает, - это стохастический градиентный спуск. В Scikit-learn этого можно достичь с помощью класса SGDRegressor. Хотя Scikit-learn включает класс Perceptron, он не служит нашей текущей цели, поскольку является классификатором, а не регрессором.

Визуализация градиентного спуска

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

Вот тот же сюжет под другим углом, на этот раз с использованием Plotly:

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

Масштабирование функций

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

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

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

Двумя наиболее распространенными способами масштабирования данных являются Нормализация и Стандартизация. Мы собираемся реализовать их оба и визуализировать их влияние на градиентном спуске.

Нормализация

Также называемый масштабированием min-max, это метод, который сужает данные до значений от 0 до 1:

Нормализация в Scikit-learn:

Стандартизация

Также называемый нормализацией z-показателя, это метод, который центрирует данные вокруг 0 ​​со стандартным отклонением, равным 1. 𝜇 - среднее значение, 𝜎 - стандартное отклонение:

Стандартизация в Scikit-learn:

Влияние масштабирования элементов на градиентный спуск

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

Наш первый персептрон тренировался на немасштабированном наборе данных. Второй будет обучаться на нормализованных данных. А третий будет обучен на стандартизированных данных.

Теперь мы можем визуализировать пути, пройденные нашими тремя перцептронами. В приведенном ниже коде используется Plotly:

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

В итоге

использованная литература

А. Жерон, Практическое машинное обучение с помощью Scikit-Learn, Keras и TensorFlow (2019)

И. Гудфеллоу, Ю. Бенжио и А. Курвиль, Глубокое обучение (2016)

М. Нильсен, Нейронные сети и глубокое обучение (2019)

М. Амин, Обзор нейронных сетей: Блокнот и игровая площадка Jupyter

М. Амин, Обзор нейронных сетей: Фрагменты кода

XMind, Mind Mapping Software