Простая нейронная сеть в 9 строк кода на Python

нейро

Из статьи вы узнаете, как написать свою простую нейронную сеть на python с нуля, не используя никаких библиотек для нейросетей. Если у вас еще нет своей нейронной сети, вот всего лишь 9 строчек кода:

Перед вами перевод поста How to build a simple neural network in 9 lines of Python code, автор — Мило Спенсер-Харпер. Ссылка на оригинал — в подвале статьи.

После прочтения статью вы сможете создать свою собственную нейронную сеть на python. Также будут показаны более длинные и красивые версии кода.

как написать простую нейронную сеть на python
Диаграмма 1

Но для начала, что же такое нейронная сеть? Человеческий мозг состоит из 100 миллиарда клеток, называемых нейронами, соединенных синапсами. Если достаточное количество синаптичеких входов возбуждены, то и нейрон тоже становится возбужденным. Этот процесс также называется “мышление”.

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

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

Первые четыре примера назовем тренировочной выборкой. Вы сможете выделить закономерность? Что должно стоять на месте “?”

Диаграмма 2. Input - входный сигнал, Output - выходной сигнал.
Диаграмма 2. Input — входный сигнал, Output — выходной сигнал.

Вероятно вы заметили, что выходной сигнал всегда равен самой левой входной колонке. Таким образом ответ будет 1.

Обучение нейронной сети на Python

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

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

обучение нейронной сети на python
Диаграмма 3

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

Формула для расчета выхода нейрона

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

простая нейросеть на python

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

sigmoid функция

График функции Sigmoid рисует S-образную кривую.

функция активация - нейронная сеть на python

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

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

Формула для корректировки веса

Во время тренировочного цикла (Диаграмма 3) мы корректируем веса. Но насколько мы корректируем вес? Мы можем использовать формулу «Взвешенная по ошибке» формула

Почему эта формула? Во-первых, мы хотим сделать корректировку пропорционально величине ошибки. Во-вторых, мы умножаем на входное значение, которое равно 0 или 1. Если входное значение равно 0, вес не корректируется. Наконец, мы умножаем на градиент сигмовидной кривой (диаграмма 4). Чтобы понять последнее, примите во внимание, что:

    1. Мы использовали сигмовидную кривую для расчета выхода нейрона.
    2. Если выходной сигнал представляет собой большое положительное или отрицательное число, это означает, что нейрон так или иначе был достаточно уверен.
    3. Из Диаграммы 4 мы можем видеть, что при больших числах кривая Сигмоида имеет небольшой градиент.
  1. Если нейрон уверен, что существующий вес правильный, он не хочет сильно его корректировать. Умножение на градиент сигмовидной кривой делает именно это.

Градиент Сигмоды получается, если посчитать взятием производной:

Вычитая второе уравнение из первого получаем итоговую формулу:

Существуют также другие формулы, которые позволяют нейрону учиться быстрее, но приведенная имеет значительное преимущество: она простая.

Написание Python кода

Хоть мы и не будем использовать библиотеки с нейронными сетями, мы импортируем 4 метода из математической библиотеки numpy. А именно:

  • exp — экспоненцирование
  • array — создание матрицы
  • dot — перемножения матриц
  • random — генерация случайных чисел

Например, мы можем использовать array() для представления обучающего множества, показанного ранее.

“.T” — функция транспонирования матриц. Итак, теперь мы готовы для более красивой версии исходного кода. Заметьте, что на каждой итерации мы обрабатываем всю тренировочную выборку одновременно.

Код также доступен на гитхабе. Если вы используете Python3 нужно заменить xrange на range.

Заключительные мысли

Попробуйте запустить нейросеть, используя команду терминала:

python main.py

Итоговый должен быть похож на это:

У нас получилось! Мы написали простую нейронную сеть на Python!

Сначала нейронная сеть присваивала себе случайные веса, а затем обучалась с использованием тренировочного набора. Затем нейросеть рассмотрела новую ситуацию [1, 0, 0] и предсказала 0.99993704. Правильный ответ был 1. Так очень близко!

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

Конечно, это был только 1 нейрон, выполняющий очень простую задачу. А если бы мы соединили миллионы этих нейронов вместе?

Подписаться
Уведомить о
guest

13 Comments
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Анонимно

M C FVB

Mykolao

в 9 строке Python выдаёт ошибку синтаксиса

Alex

Синтаксис print нужно использовать со скобками — print(***)

Андрей
NameError: name 'xrange' is not defined
исправить   на "range" для 3 версии питона
Богдан

Спасибо

Sergey

Спасибо Ольга, статья очень вдохновляет … Я начинаю немного понимать концепцию того, как все это работает … Я вот тоже решаю задачки по многу раз и постепенно начинаю приходить к… Подробнее »

"Sergey

«У нас получилось! «. А у меня нет. Пишет везде SyntaxError..:). Anaconda3-2023.03-1-Windows-x86_64; python-3.11.3-amd64.exe

Сергей

class NeuralNetwork():    def __init__(self):        # Seed the random number generator, so it generates the same numbers        # every time the program runs.        random.seed(1)        # We model a single neuron, with… Подробнее »

b=иван

from numpy import exp, array, random, dot class NeuralNetwork(): def __init__(self): # Seed the random number generator, so it generates the same numbers # every time the program runs. random.seed(1)… Подробнее »

Ваня

NumPy — это что? Не библиотека что-ли? К тому же корявая. Зачем людям мозги пудрить?

Acemany

В статье написано «не используя никаких библиотек для нейросетей«. Про другие библиотеки ничего не говорилось.
И почему же по вашему numpy корявая? А мозги где кому-то пудрят?

Сергей

При вводе [0,0,0] ответ будет ровно 0.5 Чтобы такой фигни не было, надо добавить ещё 1 входной нейрон. На входе у него всегда 1. Знакомьтесь, «Нейрон смещения» Увидел это на… Подробнее »

Евгений

from numpy import exp, array, random, dot training_set_inputs = array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]]) training_set_outputs = array([[0, 1, 1, 0]]).T random.seed(1) synaptic_weights =… Подробнее »


gogpt