В рамках моего стремления узнать об ИИ я поставил себе цель построить простую нейронную сеть на Python. Чтобы убедиться, что я действительно это понимаю, мне пришлось создать его с нуля без использования библиотеки нейронной сети. Благодаря отличному сообщению в блоге Андрея Траска я добился своей цели. Вот он всего в 9 строках кода:
В этой записи блога я объясню, как мне это удалось, чтобы вы могли создать свой собственный. Я также предоставлю более длинную, но более красивую версию исходного кода. И я также создал видеоверсию этого сообщения в блоге.
Но сначала, что такое нейронная сеть? Человеческий мозг состоит из 100 миллиардов клеток, называемых нейронами, связанных между собой синапсами. Если в нейрон срабатывает достаточное количество синаптических входов, этот нейрон также срабатывает. Мы называем этот процесс «мышлением».
Мы можем смоделировать этот процесс, создав нейронную сеть на компьютере. Необязательно моделировать биологическую сложность человеческого мозга на молекулярном уровне, только правила более высокого уровня. Мы используем математический метод, называемый матрицами, которые представляют собой сетки чисел. Чтобы упростить задачу, мы просто смоделируем один нейрон с тремя входами и одним выходом.
Мы собираемся обучить нейрон решению задачи, описанной ниже. Первые четыре примера называются обучающей выборкой. Можете ли вы разработать схему? Должен ли "?" быть 0 или 1?
Вы могли заметить, что вывод всегда равен значению самого левого столбца ввода. Следовательно, ответ "?" должен быть равен 1.
Процесс обучения
Но как научить наш нейрон правильно отвечать на вопрос? Мы дадим каждому входу вес, который может быть положительным или отрицательным числом. Вход с большим положительным или большим отрицательным весом будет иметь сильное влияние на выходной сигнал нейрона. Прежде чем мы начнем, мы устанавливаем для каждого веса случайное число. Затем приступаем к тренировочному процессу:
- Возьмите входные данные из примера обучающего набора, скорректируйте их по весам и передайте через специальную формулу для расчета выхода нейрона.
- Вычислите ошибку, которая представляет собой разницу между выходом нейрона и желаемым выходом в примере обучающего набора.
- В зависимости от направления ошибки слегка отрегулируйте грузы.
- Повторите этот процесс 10 000 раз.
В конце концов веса нейрона достигнут оптимума для обучающей выборки. Если мы позволим нейрону подумать о новой ситуации, которая следует той же схеме, он должен сделать хороший прогноз.
Формула для расчета мощности нейрона
Вам может быть интересно, какова специальная формула для расчета выходного сигнала нейрона? Сначала мы берем взвешенную сумму входов нейрона, которая равна:
Затем мы нормализуем это так, чтобы результат был между 0 и 1. Для этого мы используем математически удобную функцию, называемую сигмовидной функцией:
При нанесении на график сигмовидная функция рисует S-образную кривую.
Итак, подставив первое уравнение во второе, окончательная формула для выхода нейрона будет:
Вы могли заметить, что для простоты мы не используем минимальный порог срабатывания.
Формула для корректировки весов
Во время тренировочного цикла (диаграмма 3) мы корректируем веса. Но насколько мы регулируем веса? Мы можем использовать формулу «производной, взвешенной по ошибке»:
Почему эта формула? Сначала мы хотим сделать корректировку пропорциональной размеру ошибки. Во-вторых, мы умножаем на вход, который равен 0 или 1. Если вход равен 0, вес не корректируется. Наконец, мы умножаем на градиент сигмовидной кривой (диаграмма 4). Чтобы понять это последнее, учтите, что:
- Мы использовали сигмовидную кривую для расчета выхода нейрона.
- Если на выходе получается большое положительное или отрицательное число, это означает, что нейрон так или иначе был достаточно уверен в себе.
- Из диаграммы 4 мы видим, что при больших числах сигмовидная кривая имеет неглубокий градиент.
- Если нейрон уверен, что существующий вес правильный, он не хочет его сильно корректировать. Этого можно добиться путем умножения на градиент сигмовидной кривой.
Градиент сигмовидной кривой можно найти, взяв производную:
Итак, подставив второе уравнение в первое уравнение, окончательная формула для корректировки весов будет:
Существуют альтернативные формулы, которые позволят нейрону обучаться быстрее, но у этой есть то преимущество, что она довольно проста.
Создание кода Python
Хотя мы не будем использовать библиотеку нейронной сети, мы импортируем четыре метода из математической библиотеки Python под названием numpy. Эти:
- exp - естественная экспонента
- array - создает матрицу
- точка - умножает матрицы
- random - дает нам случайные числа
Например, мы можем использовать метод array () для представления обучающего набора, показанного ранее:
Функция «.T» переводит матрицу из горизонтального положения в вертикальное. Итак, компьютер хранит числа вот так.
Ok. Думаю, мы готовы к более красивой версии исходного кода. После того, как я передам его вам, я поделюсь некоторыми заключительными мыслями.
Я добавил комментарии к исходному коду, чтобы все объяснять построчно. Обратите внимание, что на каждой итерации мы обрабатываем весь обучающий набор одновременно. Следовательно, наши переменные - это матрицы, представляющие собой сетку чисел. Вот полный рабочий пример, написанный на Python:
Код также доступен здесь: https://github.com/miloharper/simple-neural-network. Обратите внимание, что если вы используете Python 3, вам нужно будет заменить команду xrange на range.
Заключительные мысли
Попробуйте запустить нейронную сеть с помощью этой команды терминала:
python main.py
У вас должен получиться результат, который выглядит примерно так:
Мы сделали это! Мы построили простую нейронную сеть на Python!
Сначала нейронная сеть присваивала себе случайные веса, а затем обучалась с помощью обучающей выборки. Затем он рассмотрел новую ситуацию [1, 0, 0] и предсказал 0,99993704. Правильный ответ - 1. Очень близко!
Традиционные компьютерные программы обычно не обучаются. Что удивительно в нейронных сетях, так это то, что они могут учиться, адаптироваться и реагировать на новые ситуации. Также как человеческий разум.
Конечно, это всего лишь 1 нейрон, выполняющий очень простую задачу. Но что, если мы соединим миллионы этих нейронов вместе? Сможем ли мы однажды создать что-то осознанное?
ОБНОВЛЕНИЕ 2020: Хотите узнать больше? Сегодня я создал онлайн-курс, основанный на том, что вы узнали. Это идеальный курс, если вы новичок в нейронных сетях и хотите узнать больше об искусственном интеллекте. Я покажу вам революционный метод, изобретенный и запатентованный Google DeepMind, который называется Deep Q Learning. Вы создадите нейронную сеть, которая сама научится играть в игру без каких-либо предварительных знаний: