Как создаются нейросети

0
20

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

Тренировка нейронной сети. Функции XOR

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

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

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

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

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

Иными словами, вес синопса не может быть меньше минус 1 и не может быть больше 1. На текущем этапе вам важно понимать то, что веса мы, грубо говоря, взяли с потолка. Это значит, что столь важные для нас веса синапса, выявляющие взаимосвязь между входными данными и результатом, сейчас непригодны к использованию. А значит, мы должны эту ситуацию как-то исправить. Я сейчас говорю о том, чтобы провести нашу нейронку через так называемый процесс обучения нейросети. Это позволит нам приблизить веса к более верным значениям, а значит, правильно выявлять взаимосвязь. В данное время существуется сразу несколько методов обучения нейросети. Например, это знаменитый метод обратного распространения, на английском Backpropagation. Еще есть метод упругого распространения, или же Resilient Propagation.

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

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

Переходим к обучению

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

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

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

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

ЧИТАТЬ ТАКЖЕ:  Как научиться писать нейросети с нуля

Пусть у нас уже есть нейронная сеть, но ведь ее ответы являются случайными, то есть наша нейросеть не обучена. Сейчас она способна лишь по входному вектору input выдавать случайный ответ, но нам нужны ответы, которые удовлетворяют конкретной поставленной задаче. Дабы этого достичь, сеть надо обучить. Здесь потребуется база тренировочных примеров и множество пар X — Y, на которых и будет происходить обучение, причем с использованием известного алгоритма обратного распространения ошибки.

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

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

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

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

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

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

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

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

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

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