Реализация многослойных нейронных сетей персептрона в Python

машинное обучение глубокое обучение компьютерное зрение NLP

Автор | Вивек Патель Компиляция|Флин Источник|наука о данных

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

Уже существуют мощные библиотеки, такие как: TensorFlow, PyTorch, Keras и другие. Я расскажу об основах создания нейронной сети многослойного персептрона (MLP) в Python.

Персептроны являются основными строительными блоками нейронных сетей. Входная функция персептрона представляет собой линейную комбинацию весов, смещений и входных данных. В частности: in_j = весввод + смещение (in_j = весавход + смещение). На каждом персептроне мы можем указать функцию активации g.

Функция активации — это математический метод, который гарантирует, что персептрон «срабатывает» или активируется только после достижения определенного входного уровня. Распространенными нелинейными функциями активации являются сигмовидная, softmax, выпрямленная линейная единица (ReLU) или просто tanH.

Существует множество вариантов функций активации, но в этой статье мы рассмотрим только Sigmoid и softmax.

Рисунок 1: Персептрон

Для контролируемого обучения мы позже пересылаем входные данные через серию скрытых слоев на выходной слой. Это называется прямым распространением. На выходном слое мы можем вывести предсказание y*. С нашим прогнозом y* мы можем вычислить ошибку |y*-y| и заставить ошибку распространяться обратно через нейронную сеть. Это называется обратным распространением. В процессе стохастического градиентного спуска (SGD) веса и смещения каждого персептрона в скрытом слое обновляются.

Рисунок 2: Базовая структура нейронной сети

Теперь, когда мы рассмотрели основы, давайте реализуем нейронную сеть. Цель нашей нейронной сети — классифицировать рукописные цифры в базе данных MNIST. Я буду использовать библиотеку NumPy для основных вычислений матриц.

В нашей задаче данные MNIST представлены 8-битными цветовыми каналами в матрице [748,1]. По сути, у нас есть [748,1] матрица чисел, начинающаяся с [0,1,....255], где 0 означает белый цвет, а 255 — черный.

результат

База данных рукописных цифр MNIST содержит 60 000 рукописных примеров для учебных целей и 10 000 примеров для тестирования. После обучения на 60 000 примеров в течение 30 эпох я запустил обученную нейронную сеть на тестовом наборе данных и добился точности 93,2%. Его можно даже дополнительно оптимизировать, настроив гиперпараметры.

Как это работает?

Эта статья разделена на 5 частей. Эти части:

(1) Функция активации (2) Инициализация веса (3) Инициализация смещения (4) Алгоритм обучения (5) Делайте прогнозы

1. Функция активации

Сигмоид — это функция активации, определяемая уравнением 1/(1+exp(-x)), которая будет использоваться в персептроне скрытого слоя.

Softmax — это функция активации, которая обычно используется в выходном слое, когда мы хотим классифицировать входные данные по классам. В нашем случае мы хотим разбить число на одно из 10 сегментов [0,1,2,...,9]. Он вычисляет вероятность каждой записи в матрице; в сумме вероятности будут равны 1. Вход с наибольшей вероятностью будет соответствовать его предсказанию, т.е. 0,1,...,9. Softmax определяется как exp(x)/sum(exp(x)).

Рисунок 3: Реализация функции активации

2. Инициализация веса

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

  1. zero-initialize - инициализировать все веса = 0.

  2. Случайная инициализация — инициализируйте веса случайными числами, а не полностью случайными. Обычно мы используем случайные числа из стандартного нормального распределения (среднее 0 и дисперсия 1).

  3. Инициализация Ксавьера — инициализирует веса случайными числами из нормального распределения с установленной дисперсией. Мы установим дисперсию на основе размера предыдущего слоя.

Как упоминалось выше, ребра, поступающие в персептрон, умножаются на матрицу весов. Ключевым моментом является то, что размер матрицы зависит от размера текущего слоя и слоев перед ним. В частности, весовая матрица имеет размер [currentLayerSize, previousLayerSize].

Как упоминалось выше, ребра, поступающие в персептрон, умножаются на матрицу весов. Ключевым моментом является то, что размер матрицы зависит от размера текущего слоя и слоев перед ним. В частности, весовая матрица имеет размер [currentLayerSize, previousLayerSize].

Предположим, у нас есть скрытый слой со 100 узлами. Наш входной слой имеет размер [748,1], а желаемый выходной слой имеет размер [10,1]. Матрица весов между входным слоем и первым скрытым слоем имеет размер [100, 748]. Размер каждой весовой матрицы между скрытыми слоями равен [100, 100]. Наконец, размер матрицы весов между последним скрытым слоем и выходным слоем равен [10, 100].

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

Рисунок 4: Реализация инициализации веса

3. Инициализация смещения

Как и при инициализации веса, размер матрицы смещения зависит от размера слоя, особенно от текущего размера слоя. Одним из способов инициализации смещения является установка смещения на ноль.

Для нашей реализации нам нужно будет обеспечить смещение для каждого скрытого и выходного слоя. Размер матрицы смещения составляет [100, 1] из расчета 100 узлов на скрытый слой, а размер выходного слоя — [10, 1].

Рисунок 5: Реализация инициализации смещения

4. Обучение алгоритма

Как уже было сказано, обучение основано на концепции стохастического градиентного спуска (SGD). В SGD мы рассматриваем только одну тренировочную точку за раз.

В нашем примере мы будем использовать активацию softmax на выходном слое. Потери будут рассчитаны по формуле «Перекрестная энтропийная потеря». Для SGD нам нужно будет использовать softmax для вычисления производной кросс-энтропийной потери. То есть эта производная сводится к y*-y, что является предсказанным y* минус ожидаемое значение y.

Рисунок 6: Перекрестная потеря энтропии и ее производная при активации softmax

Нам также нужно написать производную сигмовидной функции активации. На рисунке 7 я определяю сигмовидную функцию и ее производные.

Рисунок 7: Сигмовидная функция (вверху) и ее производная (внизу)

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

  1. Скорость обучения (LR): скорость обучения — это параметр, с помощью которого пользователь указывает, насколько быстро сеть позволяет нам изучать и обновлять свои параметры. Выбор хорошей скорости обучения — это искусство. Если LR слишком высок, мы можем никогда не прийти к приемлемой ошибке обучения. Если LR слишком низкий, мы можем потратить много времени на вычисления.

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

  3. Размер пакета: с каждой итерацией Epoc2h мы будем группировать обучающие данные. Для каждой точки обучения в пакете мы будем собирать градиенты и обновлять веса/смещения после завершения пакета.

  4. Импульс: это параметр, который мы ускорим, собирая скользящее среднее прошлых градиентов и разрешая движение в этом направлении. В большинстве случаев это приведет к более быстрой сходимости. Типичные значения варьируются от 0,5 до 0,9.

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

Теперь мы покажем реализацию в псевдокоде.

5. Делайте прогнозы

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

Наша цель состоит в том, чтобы классифицировать числа от 0 до 9. Таким образом, индекс матрицы aj2 будет соответствовать предсказанию. Индекс с наибольшей вероятностью будет выбран np.argmax() и будет нашим прогнозом.

в заключении

теперь правильно! Мы сделали. Мы написали реализацию нейронной сети на Python.

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

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

Что еще мы можем сделать, чтобы уменьшить количество ошибок тестирования? Да, мы можем масштабировать входные данные. Как и во многих алгоритмах, большее число может оказать существенное влияние на результаты алгоритма. В нашем примере числа варьируются от [0 до 255]. Это смещение можно уменьшить, если масштабировать числа так, чтобы они находились в диапазоне от [0 до 1].

Спасибо за чтение!

Оригинальная ссылка:к data science.com/implement в…

Добро пожаловать на сайт блога Panchuang AI:panchuang.net/

sklearn машинное обучение китайские официальные документы:sklearn123.com/

Добро пожаловать на станцию ​​сводки ресурсов блога Panchuang:docs.panchuang.net/