VDS за 300р от нашего партнера SpaceWeb
[124]
22 Апр 2020, 19:55

Как построить простую нейронную сеть из 9 строк кода на Python

Мне очень хотелось разобраться в AI. И вот, я поставил перед собой цель построить простую нейронную сеть на Python. Чтобы разобраться во всем от и до, я решил построить ее с нуля без использования библиотек. Благодаря Эндрю Траску я достиг своей цели. 
Вот эти 9 строк кода:

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 = 2 * random.random((3, 1)) - 1 
for iteration in xrange(10000): 
    output = 1 / (1 + exp(-(dot(training_set_inputs, synaptic_weights)))) 
    synaptic_weights += dot(training_set_inputs.T, 
    (training_set_outputs - output) * output * (1 - output)) 
print 1 / (1 + exp(-(dot(array([1, 0, 0]), synaptic_weights))))

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

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

ai-python-1 

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

Мы собираемся обучить нейрон, чтобы решить проблему ниже. Первые четыре примера называются тренировочным набором. Можете ли вы разработать шаблон? Должен ли ‘ ?’ быть 0 или 1?

Вы могли заметить, что вывод всегда равен значению самого левого входного столбца. Поэтому ответ « ?» должно быть 1.

Учебный процесс

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

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

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

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

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

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

Если график нанесен на график, функция Sigmoid рисует S-образную кривую.

Диаграмма 4

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

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

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

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

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

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

Градиент сигмовидной кривой можно найти, взяв производную:

Таким образом, подставляя второе уравнение в первое, получаем окончательную формулу для корректировки весов:

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

Построение кода Python

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

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

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

Функция «.T» перемещает матрицу из горизонтальной в вертикальную. Таким образом, компьютер хранит такие цифры.

Код также доступен здесь: https://github.com/miloharper/simple-neural-network . Обратите внимание, что если вы используете Python 3, вам нужно заменить команду «xrange» на «range».

Последние мысли

Попробуйте запустить нейронную сеть с помощью этой команды терминала:

python main.py

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

 

 

Random starting synaptic weights: [[-0.16595599] [ 0.44064899] [-0.99977125]] 
New synaptic weights after training: [[ 9.67299303] [-0.2078435 ] [-4.62963669]] 
Considering new situation [1, 0, 0] -> ?:  [ 0.99993704]

Мы сделали это! Мы создали простую нейронную сеть, используя Python!

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

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

 


Перевод, оригинал на medium.com

Комментарии (0)

Добавить комментарий

Войдите, чтобы написать о чем-нибудь...
Вход Регистрация
Web.onRails
Здесь вы можете спросить или написать обо всём, что касается Веб-разработки.
написать о чем-нибудь...
Метки:
Лучшее
[52]
16 Окт 2011, 15:38
Вывести все элементы POST
[просмотров 11580]
[74]
31 мая 2011, 11:48
Python проверка существования переменной
[просмотров 8276]
[4]
10 Окт 2018, 15:33
Как запретить просмотр сайта по IP?
[просмотров 8249]
[100]
19 Дек 2014, 16:16
User-agent для Internet Explorer 11
[просмотров 6616]
[124]
21 Июл 2011, 14:04
Python Imaging Library (PIL)
[просмотров 6352]
[58]
29 мая 2012, 12:08
Узнать версию PHP из командной строки
[просмотров 4662]
[315]
16 Июл 2011, 20:03
Python работа с MySQL
[просмотров 4586]

Вести с Хабра