Как сделать нейросеть

0
7

Как сделать свою нейросеть за 10 минут на Python

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

Из него мы используем метод exp, который нужен для вычисления экспонента и всех элементов входного массива. Но нам это в принципе не важно. Как я ранее говорил, это просто формула, которую мы применяем. И не обязательно быть математиком, чтобы это делать. Затем нам нужно объявить тренировочные данные. С этой целью мы создадим две переменные. Первая это training inputs. Она будет хранить в себе массив 4 на 3 с соответствующими входными данными, которые я наглядно . показывал ранее на табличке.

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

Вторая переменная это Training Outputs. Она хранит в себе массив 1 на 4, и это наши ожидаемые выходные данные. Также не забываем транспонировать вторую переменную, чтобы ее содержание поменялось и было 4 на 1. Дальше нам надо инициализировать веса. Ранее я уже говорил, что мы будем это делать при помощи генератора случайных чисел. Чтобы и у вас, и у меня получались одинаковые случайные числа, давайте договоримся и укажем сид генератора в значении 1.

Хауди-хо, друзья! Недавно вы просили меня рассказать, как создать свою собственную нейронную сеть с нуля. Поэтому сегодня мы с вами этим и займемся. Создадим простейшую нейронную сеть, а именно Перцептрон. И на самом деле это не так сложно, как может показаться на первый взгляд. Дело в том, что нейронные сети как таковые базируются на определенных алгоритмах и математических функциях. Здесь можно встретить сигмоиду, линейную регрессию и угродительность. Но как мы знаем, чтобы пользоваться формулами, не обязательно понимать, как они работают.

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

Допустим, передадим ей значение 1.1.0. Как вы помните, во входных тренировочных данных такого значения у нас не было. В коде задействовать нашу уже обученную нейросеть можно также очень просто. Запускаем получившийся код и видим результат. Наша нейронная сеть прекрасно справилась и поняла, что очень большая вероятность того, что на выходе должна быть цифра 1. И то, что мы сейчас с вами запрограммировали, это простейшая нейронная сеть, которая называется Перцептрон. Но даже с такой простой нейронкой уже можно решить решать какие-то более-менее реальные задачи.

Несколько финальных замечаний

Другие методы и формулы. Чтобы нейроны обучались, нужно задать формулу корректировки весов — мы говорили про это выше. Если нейронов много, то формулу нужно как-то распространить на все из них. Для этого используется метод градиентного спуска: рассчитывается градиент по весам, а потом от него делается шаг в меньшую сторону. Звучит сложно, но на самом деле для этого есть специальные формулы и функции.

И теперь, когда мы понимаем общий принцип действия, давайте перейдем к написанию кода, чтобы более наглядно увидеть реализацию всего, что я только что рассказывал. Но сначала в Python нам нужно установить модуль numpy. Он нам понадобится для легкой и высокопроизводительной работы с многомерными массивами. В описании я оставлю ссылку на репозиторий numpy в PyPy. Устанавливается он, как и любой другой модуль в Python, без каких-либо проблем. Теперь в коде начнем с импорта numpy, а затем объявим функцию sigmoid для реализации нашей функции активатора. Уже здесь нам пригождается numpy.

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

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

Но ее легко получить путем увеличения количества нейронов. Давайте попробуем реализовать обучение с тремя нейронами в скрытом слое и одним выходным (выход ведь у нас только один). Чтобы все получилось, создадим массив X и Y, имеющий обучающие данные и саму нейронную сеть:

ЧИТАТЬ ТАКЖЕ:  Как написать искусственный интеллект c

И все это нужно будет повторить, например, 20 тысяч раз. В коде этот алгоритм у нас будет выглядеть следующим образом. Если вы хотите более подробно на математическом уровне узнать о том, как именно устроен данный алгоритм обучения нейросети, то я в описании оставлю ссылку на статью, которая на русском языке понятно объясняет, как это все работает. Ну а теперь мы запустим код, и как видите, после запуска мы получаем результат, больше похожий на правду. И по сути уже сейчас наша нейронная сеть обучена. Она сама научилась выявлять взаимосвязь между входными и выходными данными. Давайте проверим, как она справится в какой-то новой для себя ситуации.

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

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

Какую роль играет искусственный нейрон?

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

Только ленивый не слышал сегодня о существовании и разработке нейронных сетей и такой сфере, как машинное обучение. Для некоторых создание нейросети кажется чем-то очень запутанным, однако на самом деле они создаются не так уж и сложно. Как же их делают? Давайте попробуем самостоятельно создать нейросеть прямого распространения, которую еще называют многослойным перцептроном. В процессе работы будем использовать лишь циклы, массивы и условные операторы. Что означает этот набор данных? Только то, что нам подойдет любой язык программирования, поддерживающий вышеперечисленные возможности. Если же у языка есть библиотеки для векторных и матричных вычислений (вспоминаем NumPy в Python), то реализация с их помощью займет совсем немного времени. Но мы не ищем легких путей и воспользуемся C#, причем полученный код по своей сути будет почти аналогичным и для прочих языков программирования.

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

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

Человеческий мозг состоит из ста миллиардов клеток, которые называются нейронами. Они соединены между собой синапсами. Если через синапсы к нейрону придет достаточное количество нервных импульсов, этот нейрон сработает и передаст нервный импульс дальше. Этот процесс лежит в основе нашего мышления. Мы можем смоделировать это явление, создав нейронную сеть с помощью компьютера. Нам не нужно воссоздавать все сложные биологические процессы, которые происходят в человеческом мозге на молекулярном уровне, нам достаточно знать, что происходит на более высоких уровнях. Для этого мы используем математический инструмент — матрицы, которые представляют собой таблицы чисел. Чтобы сделать все как можно проще, мы смоделируем только один нейрон, к которому поступает входная информация из трех источников и есть только один выход. 3 входных и 1 выходной сигнал Наша задача — научить нейронную сеть решать задачу, которая изображена в ниже. Первые четыре примера будут нашим тренировочным набором. Получилось ли у вас увидеть закономерность? Что должно быть на месте вопросительного знака — 0 или 1?

Один нейрон может превратить в одну точку входной вектор, но по условию мы желаем получить несколько точек, т. к. выходное Y способно иметь произвольную размерность, которая определяется лишь ситуацией (один выход для XOR, десять выходов, чтобы определить принадлежность к одному из десяти классов, и так далее). Каким же образом получить n точек? На деле все просто: для получения n выходных значений, надо задействовать не один нейрон, а n. В результате для каждого элемента выходного Y будет использовано n разных взвешенных сумм от X. В итоге мы придем к следующему соотношению:

ОСТАВЬТЕ ОТВЕТ

Пожалуйста, введите ваш комментарий!
пожалуйста, введите ваше имя здесь