Создаем свою нейронку

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

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

Для начала стоит понимать, что создание ИИ и нейросетей это не тренд 23 года. Еще в далеких 50-х годах прошлого века люди задумывались (и даже реализовывали) первые вариации искусственного интеллекта. Например, написание простого ИИ для решения задач судоку. Это не занимало много времени, ведь эта игра сама по себе содержит статистические данные, а её правила никак не меняются. Но этот пример нельзя назвать даже Машинным обучением, не говоря уже о Deep learning.

Разница первого метода и последних заключается в том, что он не использует обучающие данные, а выполняет лишь заранее запрограммированные правила.

Поговорим немного о ML (машинное обучение) и DL (глубокое изучение). Первый метод позволит вам обучать систему решать проблему своими силами, не прибегая к строгому коду. Возьмем прошлый пример с судоку. Вместо того, чтобы описать вашему интеллекту правила игры и подробное решение в каждой ситуации, вы, грубо говоря, бросаете его в реку, а он должен научиться плавать в процессе. Первые решения скорее всего будут неправильными, но в ходе такого обучения вы постепенно начинаете “кормить” ваш ИИ правильными примерами с успешным решением задачи. В этот момент она запоминает принцип решение и с каждой последующей попыткой будет решать судоку все точнее и точнее.

DL же является разновидностью ML на основе нейронных сетей. Процесс такого обучения называется глубоким именно потому, что структура искусственных нейронных сетей состоит из нескольких входных, выходных и скрытых слоев. Каждый такой слой содержит определенные значения, их он в дальнейшем он начинает преобразовывать в сведения, которые в свою очередь помогают решить задачу с большей вероятностью. Благодаря DL ваш код может обучаться быстрее, используя уже не внешние данные, а собственные.

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

После базового понимания DL и ML можно приступать к основам нейронных сетей. Что же это такое на самом деле?

Это система, которая учиться делать свои прогнозы, выполняя строгий цикл шагов:

  • Получение входных данных
  • Составлением своего прогноза
  • Сравнение прогноза с желаемым результатом
  • Выявление и исправление ошибок для правильного прогнозирования в следующий раз.

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

(вход-выход)

Сегодня мы для простоты повествования будем разбирать работу нейросети по задаче “классификация”. Разберем три варианта классификации от самого простого к самому трудному.

Выше мы уже поняли, что существует “вход и выход”, что же нам делать с этим? Все просто. На входе мы должны вписать числовые данные. Рассмотрим самый первый и простой пример. На вход впишем три значения 36.6, 36,9 и 38. И попросим ответить нашу нейронку “Повышена ли температура у этого человека?”.

Предварительно прописав ей, что человек с температурой больше 36.6 вероятнее всего болен, она с точностью ответит на наш вопрос.

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

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

x1*w1+x2*w2+x3*w3

Для того, чтобы ваш код смог сделать определенный вывод ему нужно сравнить получившиеся число с тем, которое вы предоставили ему изначально. Но чаще всего в эту формулу добавляют новую переменную b (значение смещения) и сравнивают всю сумму с нулем. На этом этапе мы должны выбрать вид функции, исходя из которого сеть будет принимать решение. Если мы возьмем тип Threshold, а получившиеся число больше 0, ответ автоматически будет рассматриваться как “Да”, если меньше, то как “Нет”. Однако, мы можем взять более мягкую функцию, которая выбирает не строгий вариант, а вероятность того или иного исхода. Например, Sigmoid или ReLu.

И теперь самое интересное. Данный пример соответствует тому, что происходит в одном нейроне некоторой нейронной сети. Другими словами - однослойная нейронная сеть. И не смотря на то, что это всего лишь “нейрон”, при помощи данного кода вы в действительности сможете решать простые классификационные задачи.

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

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

Вернемся к первому виду сети. Функция, которую мы использовали в первом нейроне называется функцией активации. И её главное свойство - нелинейность. Важно выбирать функции таким образом, чтобы ваша система всегда строилась на этой нелинейности. Иначе, если вы решите расширить сеть дополнительными нейронами, это не принесет никакого результата. Выше уже упоминалась функция ReLu и её главный плюс - трактовка значений. Все, что меньше 0 она отрезает, а все, что больше оставляет.

Надеюсь, вы не прогуливали алгебру во время школьных дней. А ведь она все думала, когда же вы появитесь. Для того, чтобы узнать взвешенную сумму в одном нейроне, нужно использовать скалярное произведение вектора X (входные данные) и вектора W (вес). Но не все так просто. Так как мы использовали несколько нейронов в одном слое и на выходе у нас отдельный вектор выходных значений (h), то получается, что каждый вход связан с каким-то выходом. Таким образом мы получаем матрицу Весов. В нашем примере 3(x) входа и 4(h) выхода. Нам нужно перемножить эти значения и мы получаем 12(W).

Не забываем, что для каждого нейрона у нас также было свое значение смещения (b).

Таким образом, вычисление одного слоя нейронной сети равно F(Wx+b).

Теперь предположим, что у нас есть обученная нейронная сеть, как же теперь применить её для классификации некоторого объекта? Кстати, обучение нейросети это также отдельный процесс, о котором в данной статье мы говорить не будем. Допустим, что наш объект характеризуется А числами и C классов. У нас есть нное количество слоев, в каждом из которых входной вектор нужно умножить на матрицу весов и прибавить вектор смещения, а также взять поэлементно функцию активации. В последнем слое функцию активации не используем, передаем значения в SoftMax и получаем финальное распределение вероятности по классам. Затем смотрим на значения и удивляемся тому, как именно нейросеть смогла правильно ответить на наш вопрос. Голова уже начинает болеть, не так ли?

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

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

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

0
8 комментариев
Написать комментарий...
Shape

Прочитав статью, я понял для себя одно - до нейронок моему мозгу далековато🥲. Видимо пока что максимум на что он способен это на огромный набор if, else if. Но, могу сказать, что сам принцип работы был довольно понятно расписан, спасибо за статью)

Ответить
Развернуть ветку
DESIRE
Автор

Спасибо! Обещаем больше интересных статей)

Ответить
Развернуть ветку
Alex K

Спасибо за статью! Интересно! Немного запутался на моменте с x1*w1+x2*w2+x3*w3, и дальнейшими возможными функциями.
Может быть можно этап с перемножение входных данных с весами и векторами описать еще проще? Или более наглядно?
Спасибо!

Ответить
Развернуть ветку
DESIRE
Автор

Конечно! Сделаем отельную статью.

Ответить
Развернуть ветку
Alex K

Спасибо!

Ответить
Развернуть ветку
Open Space

С удовольствием прочел бы продолжение темы, надеюсь на новые статьи 🙂

Ответить
Развернуть ветку
DESIRE
Автор

Благодарим!

Ответить
Развернуть ветку
Ivan Presnyakov

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

Ответить
Развернуть ветку
5 комментариев
Раскрывать всегда