Всем привет! Меня зовут Константин Берлинский, я фуллстек-разработчик в компании БКС. Недавно я самостоятельно изучал нейросети и по итогам написал книгу. Ниже я расскажу как устроена простейшая нейросеть.



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

При этом вы потыкались в обучающие статьи. Всё было непонятно. С первых же страниц начали грузить интегралами и градиентными спусками. Вы решили пойти на курсы. Там ещё хуже. Курс занимал 4-12 месяцев. А стоил как крыло самолета: 100-200 тыс руб. Ну, небольшое такое крыло. Да и мотивация ниже плинтуса без волшебных пинков от учителя.

Всё что вы хотели — получить HelloWorld, но для нейросетей. То бишь простейшее приложение демонстрирующее основные принципы работы. Вуаля! Вы на верном пути!

Немного теории. Нейросеть — это граф.

Но в отличие от Монте-Кристо у него есть входной S-слой (сенсорный). Туда мы подаем числа в промежутке [0..1]. Например, картинка с котиком. Берём каждую точку, преобразуем в градации серого и записываем во входной узел по правилу, где 0 — белый цвет, а чем ближе к 1, тем более тёмные мысли у нашей точки.

Далее промежуточные — A-ассоциативные слои. Они также содержат значения [0..1]. Они соединяются ребрами с предыдущими и последующими слоями. Веса рёбер находятся в пределах [0..1], задаваемые произвольно. Значение узла А-слоя — это сумма произведений весов нейронов на веса рёбер. Полученная сумма может получиться больше 1, поэтому её «нормализуют», чтобы она попала в интервал [0..1]. Для этого используют функции активации.

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

Получился вот такой парень, а точнее, перцептрон:



Итак. Мы подаем на вход нейросети циферки. Далее от входа до выхода просчитываем значения с учетом поданных сигналов на узлы, веса рёбер и функции активации слоев. На выходе получаем значения. Допустим, у нас 1 выходной узел и его значение 0.5. А мы бы хотели, чтобы его значение было 1. Потому что мы условились, что 1 на узле означает, что на фото кошка. Как же изменить веса рёбер, чтобы на выходе получить 1?

Для этого используется особо сильное колдунство — Метод обратного распространения ошибки. Смысл в том, чтобы справа налево (от R-слоев к S-слоям) поменять веса рёбер так, чтобы на выходе получить нужные значения. Если проделать так много раз для разных картинок, то постепенно, нейросеть «научится» распознавать тот образ, который мы хотим. Подробнее читайте вики и оригинальную статью «A Step by Step Backpropagation Example» от Matt Mazur. Кстати, картинку с примером реализации на вики выложил тоже я.

Вот, кстати, и она:

Ну и, в принципе, всё! Можете считать себя Junior Data Science и на зарплату, меньшую чем 300 тыс руб не соглашайтесь! Конечно, есть ещё много вещей, которые полезно знать:

  1. Надо ли каждый раз писать с нуля такой граф? Конечно, нет! Есть множество библиотек, помогающих создать нейросеть в 1 клик: Keras, TensorFlow, PyTorch, тысячи их! Выберите исходя из функционала, популярности и знакомого языка программирования.
  2. Где брать датасеты для нейросетей? Ну, поищите их на Kaggle, Вики, Хабре, соберите сами, в конце концов! Подсказка — смартфон собирает тучи данных о вас через мобильные приложения, включённый микрофон и GPS-сенсор.
  3. Как обрабатывать входные данные для нейросети? Да как угодно! На любом языке программирования — C#, Java, Javascript… Особо упоротые используют Python.
  4. Как подобрать архитектуру графа — число слоёв, узлов, ребер, функции активации и ошибки, библиотеку для обработки? Арргх! В этом и заключается работа датасаенса!
  5. Я сделаю ИИ-приложение и инвесторы дадут мне 100 лямов, заберут в долину, позвонит Цукерберг? Лол, нет! Нейросети — лишь инструмент для определенного класса задач. Решайте реальную проблему, а не как в прошлый раз. Совсем огонь если попадёте в тренд.

Что же насчет обещанного HelloWorld? Их есть у меня!


Ну и, пожалуй, хватит. Ещё больше примеров есть в книге. А в гугле вообще завались!