Содержание статьи
Как сделать свою нейросеть за 10 минут на Python
Несколько финальных замечаний
Но нейронные сети — все же не человеческий мозг. Мозг сложнее, объемнее, в нем намного больше нейронов, чем в любой компьютерной нейросети. Поэтому чрезмерное обучение может сделать хуже. Например, переобученная нейросеть может начать распознавать предметы там, где их нет — так люди иногда видят лица в фарах машин и принимают пакеты за котов. А в случае с искусственной нейронной сетью такой эффект еще явнее и заметнее. Если же учить нейросеть на нескольких разнородных данных, скажем, сначала обучить считать числа, а потом — распознавать лица, она просто сломается и начнет работать непредсказуемо. Для таких задач нужны разные нейросети, разные структуры и связи.
В учебных целях очень часто применяют самую простейшую из них, линейную. Ее еще называют единичный скачок или жесткая пороговая функция. Выглядит в коде она следующим образом. Мы же будем применять более адекватную и подходящую функцию активатора, а именно сигмоид.
Все, что сейчас произошло у вас в мозгу, мы называем мышлением. Мозг принял входные данные, увидел выходные, вычислил взаимосвязь и впоследствии научился контролировать как их распознавать? Причем уже без необходимости в повторном вычислении взаимосвязи входных и выходных данных. Ну а нам осталось только воспроизвести этот же процесс в коде, чем мы сейчас и займемся. Но сначала давайте наглядно увидим, как будет выглядеть наш перцептрон. У нас будут входные данные, будет сам нейрон, конечно же результат и синапсы. Как уже понятно, синапсы это некая связь между . входными данными и тем, что попадет в нейрон. Соответственно, у нас есть какие-то входные данные, это будут нолики и единицы, своего рода аналог true и false в булевом типе данных.
Например, на вход поступает картинка. Чтобы нейросеть могла понять, что на ней изображено, она должна выделить разные элементы из картинки, распознать их и подумать, что означает сочетание этих элементов. Примерно так работает зрительная кора в головном мозге. Это несколько задач, их не смогут решить одинаковые нейроны. Поэтому нужно несколько слоев, где каждый делает что-то свое. Для распознавания часто используют так называемые сверточные нейросети. Они состоят из комбинации сверточных и субдискретизирующих слоев, каждый из которых решает свою задачу.
Допустим, передадим ей значение 1.1.0. Как вы помните, во входных тренировочных данных такого значения у нас не было. В коде задействовать нашу уже обученную нейросеть можно также очень просто. Запускаем получившийся код и видим результат. Наша нейронная сеть прекрасно справилась и поняла, что очень большая вероятность того, что на выходе должна быть цифра 1. И то, что мы сейчас с вами запрограммировали, это простейшая нейронная сеть, которая называется Перцептрон. Но даже с такой простой нейронкой уже можно решить решать какие-то более-менее реальные задачи.
Другие методы и формулы. Чтобы нейроны обучались, нужно задать формулу корректировки весов — мы говорили про это выше. Если нейронов много, то формулу нужно как-то распространить на все из них. Для этого используется метод градиентного спуска: рассчитывается градиент по весам, а потом от него делается шаг в меньшую сторону. Звучит сложно, но на самом деле для этого есть специальные формулы и функции.
Иными словами, вес синопса не может быть меньше минус 1 и не может быть больше 1. На текущем этапе вам важно понимать то, что веса мы, грубо говоря, взяли с потолка. Это значит, что столь важные для нас веса синапса, выявляющие взаимосвязь между входными данными и результатом, сейчас непригодны к использованию. А значит, мы должны эту ситуацию как-то исправить. Я сейчас говорю о том, чтобы провести нашу нейронку через так называемый процесс обучения нейросети. Это позволит нам приблизить веса к более верным значениям, а значит, правильно выявлять взаимосвязь. В данное время существуется сразу несколько методов обучения нейросети. Например, это знаменитый метод обратного распространения, на английском Backpropagation. Еще есть метод упругого распространения, или же Resilient Propagation.
И все это нужно будет повторить, например, 20 тысяч раз. В коде этот алгоритм у нас будет выглядеть следующим образом. Если вы хотите более подробно на математическом уровне узнать о том, как именно устроен данный алгоритм обучения нейросети, то я в описании оставлю ссылку на статью, которая на русском языке понятно объясняет, как это все работает. Ну а теперь мы запустим код, и как видите, после запуска мы получаем результат, больше похожий на правду. И по сути уже сейчас наша нейронная сеть обучена. Она сама научилась выявлять взаимосвязь между входными и выходными данными. Давайте проверим, как она справится в какой-то новой для себя ситуации.
Что такое нейросеть
Хауди-хо, друзья! Недавно вы просили меня рассказать, как создать свою собственную нейронную сеть с нуля. Поэтому сегодня мы с вами этим и займемся. Создадим простейшую нейронную сеть, а именно Перцептрон. И на самом деле это не так сложно, как может показаться на первый взгляд. Дело в том, что нейронные сети как таковые базируются на определенных алгоритмах и математических функциях. Здесь можно встретить сигмоиду, линейную регрессию и угродительность. Но как мы знаем, чтобы пользоваться формулами, не обязательно понимать, как они работают.
Из него мы используем метод exp, который нужен для вычисления экспонента и всех элементов входного массива. Но нам это в принципе не важно. Как я ранее говорил, это просто формула, которую мы применяем. И не обязательно быть математиком, чтобы это делать. Затем нам нужно объявить тренировочные данные. С этой целью мы создадим две переменные. Первая это training inputs. Она будет хранить в себе массив 4 на 3 с соответствующими входными данными, которые я наглядно . показывал ранее на табличке.
Больше нейронов. В нашей тренировочной нейросети только один нейрон. Но если нейронов будет больше — каждый из них сможет по-своему реагировать на входные данные, соответственно, на следующие нейроны будут приходить данные с разных синапсов. Значит — больше вариативность, «подумать» и передать сигнал дальше может не один нейрон, а несколько. Можно менять и формулу передачи, и связи между нейронами — так получаются разные виды нейронных сетей.
И, конечно же, не забудем про генетический алгоритм, или же Genetic Algorithm. Тем не менее, основу основ обучения всех нейронок сегодня составляет именно метод обратного распространения. Именно им мы сейчас и воспользуемся. В коде этот метод будет выглядеть следующим образом. Итак, мы помним, что верными решениями для нас являются значения 0110.
Человеческий мозг состоит из ста миллиардов клеток, которые называются нейронами. Они соединены между собой синапсами. Если через синапсы к нейрону придет достаточное количество нервных импульсов, этот нейрон сработает и передаст нервный импульс дальше. Этот процесс лежит в основе нашего мышления. Мы можем смоделировать это явление, создав нейронную сеть с помощью компьютера. Нам не нужно воссоздавать все сложные биологические процессы, которые происходят в человеческом мозге на молекулярном уровне, нам достаточно знать, что происходит на более высоких уровнях. Для этого мы используем математический инструмент — матрицы, которые представляют собой таблицы чисел. Чтобы сделать все как можно проще, мы смоделируем только один нейрон, к которому поступает входная информация из трех источников и есть только один выход. 3 входных и 1 выходной сигнал Наша задача — научить нейронную сеть решать задачу, которая изображена в ниже. Первые четыре примера будут нашим тренировочным набором. Получилось ли у вас увидеть закономерность? Что должно быть на месте вопросительного знака — 0 или 1?
Больше мощностей. Нейронные сети работают с матрицами, так что если нейронов много, вычисления получаются очень ресурсоемкие. Известные нейросети вроде Midjourney или ChatGPT — это сложные и «тяжелые» системы, для их работы нужны сервера с мощным «железом». Так что написать собственный DALL-E на домашнем компьютере не получится. Но есть сервисы для аренды мощностей: ими как раз пользуются инженеры машинного обучения, чтобы создавать, обучать и тестировать модели.