13

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

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

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

P.S Я очень мотивирован после просмотра разных тем с ИИ, но все таки боялся задавать этот вопрос, зная, что его заминусуют из-за слишком общей темы.*

UPD 0: Каким образом преподают этот предмет в университетах? Там хоть как-то задевают написание кода или сугубо теория с очень низким количеством практики?
UPD 1: Нашёл что-то такое, но не совсем ясна суть происходящего.
UPD 2: Ещё один пример.
UPD 4: Вот пример структуры нейронной сети. Из этого выходит несколько вопросов:

  • Что мы подаём (или можем подать) на входные нейроны и что мы получим?
  • Что такое "веса"?
  • И в общем, вопрос не касающийся этого блока, как мне хранить уже обученную сеть (те же веса и т.д.), если я работаю с консольным вариантом программы? В файле?

Нейронная сеть

entithat
  • 13,090
  • 2
    Нейронка это же по сути просто набор автоматически подстраивающихся коэффицентов. Язык программирования и подход (ООП или функциональный) не важны – Komdosh Nov 02 '17 at 18:44
  • Есть фундаментальная книга на русском - Каллан Р. Основные концепции нейронных сетей – Alexander du Sautoy Nov 02 '17 at 20:03
  • @AlexanderduSautoy конечно, для начала хорошо иметь стартовый набор теоретических знаний, но он мало имеет отношение к практике создания существующих нейронных сетей. – Dmitrii Maslennikov Nov 02 '17 at 20:04
  • куда делся UPD 3? – Danis Dec 21 '20 at 15:22
  • @Danis, was overridden by update 4 – entithat Dec 21 '20 at 15:22

2 Answers2

3

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

Например, если говорить про распознавание изображений - это сверточные нейронные сети (InceptionV3, VGG16). Чтобы собрать работающий сервер вам также потребуются библиотеки (TensorFlow, Theano) и фреймворки (Keras) для машинного обучения. В качестве стартового языка для разработки лучше используйте Python (для нейронных сетей этот язык - как PHP для web-разработки). В целом для ИНН (искусственный нейронных сетей) подходит любой язык, который быстро перемножает матрицы больших размеров.

  • Для начала я бы хотел просто уточнить для чего они нужны. К тому же, в разных примерах входные данные дробные числа (допустим 0.9, 0.1, 0 - это проценты или я что-то неверно понимаю? Выходные кстати тоже. И я так понял, это вероятность чего-то, ведь так? – entithat Nov 02 '17 at 19:51
  • 1
    @entithat это называется нормализацией данных. если на входы в математическую модель подавать абсолютные величины, выйдет ерунда (доминировать в этом случае будут переменные с наибольшими значениями). – Dmitrii Maslennikov Nov 02 '17 at 19:52
  • 3
    @entithat да, на выходе у нас тоже будет процентная вероятность. нейронная сеть не может со 100% вероятностью предсказать результат (как и человек), на выходе всегда процентная вероятность возможных вариантов ответа. – Dmitrii Maslennikov Nov 02 '17 at 19:53
  • 1
    @entithat если говорить про чего они нужны, то это классификация данных, распознавание образов, прогнозирование, моделирование событий, поиск оптимального решения. – Dmitrii Maslennikov Nov 02 '17 at 19:55
  • 1
    @entithat совет на будущее - не заморачивайтесь сильно с теорией, возьмите один из мануалов с тем как установить и настроить нейронную сеть и сделайте это на практике, сразу многое станет понятно – Dmitrii Maslennikov Nov 02 '17 at 19:56
  • @ Dmitry Maslennikov, полезные слова! Просто мне сложно сформулировать правильно мысль, не зная ничего наверняка точно. С какой задачи я могу начать свои первые шаги в этом? (Задача вроде: идти гулять, если будет дождь и друзья.. и т.д.)? – entithat Nov 02 '17 at 19:57
  • 3
    @entithat вбейте в поиске "создаем/настраиваем простую нейронную сеть". еще лучше смотрите примеры по этому запросу на youtube (только там большинство актуальных видео на английском). – Dmitrii Maslennikov Nov 02 '17 at 19:59
  • @entithat также если хотите в этой области сделать что-то серьезное - совсем не помешают навыки системного администрирования. для работы, а особенно для обучения нормальной нейронной сети требуются хорошие вычислительные ресурсы. здесь даже обычный VDS не сильно поможет. в основном используют облачные вычисления (тот же AWS). если используете вычисления по графике, то желательны специальные инстансы с GPU (обучение будет идти раз в 20 быстрее, чем только с CPU). – Dmitrii Maslennikov Nov 02 '17 at 20:02
  • Это уже чересчур:) Мне хоть бы базовые навыки понять.. – entithat Nov 02 '17 at 20:03
  • @entithat пройдите для начала все этапы по работе с нейронной сеть - инициализация сети, подготовка обучающих данных и само обучение, а также взаимодействие с уже обученной сетью – Dmitrii Maslennikov Nov 02 '17 at 20:06
2

В общем, спустя 4 года, я получил некоторые знания, которые мне помогли понять что такое нейронная сеть (далее НС) и как с ними работать. Ответ не претендует на супер-профессиональную литературу и написан новичком для новичков. Надеюсь кому-то он будет полезным.

Коротко, НС - это набор функций, которые трансформируют данные с одного формата в другой.

Слои НС

НС состоит обычно из нескольких слоев: входной (input), скрытый (hidden) и выходной (output). Всегда есть входной слой данных (иначе как без них?) и что-то, что мы получаем на выходе. Суть НС в том, чтобы подобрать количество слоев таким образом, чтобы НС не переобучалась, но и выдавала какой-то адекватный результат.

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

Нейроны

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

Кстати, входные данные принято нормализировать, чтобы НС обучалась правильно.

Примеры функций активации:

  • ReLU (используют чаще всего)
  • Sigmoid
  • Линейная
  • и другие

Каждая такая функция более выгодна в определенных случаях. Более подробно о популярных.

NN

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

Зачем нужны веса? Если коротко, то они указывают на “полезность” входного значения.


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

Как написать НС?

Если вы только хотите внедриться в сферу Data Science, то используйте tensorflow. Я когда-то пытался писать НС с нуля, так и забил, потому что оно стало слишком сложно держать всю математику в голове. А с такими библиотеками как tensroflow буквально пару строк и НС готова.

По сути Вам ничего не мешает написать НС в экселе. Просто надо терпение :)


Полезные каналы

P.S. Не хотел писать слишком много конкретной информации, чтобы не делать ответ еще длиннее, поэтому уложился общими терминами и понятиями. Если у Вас есть предложения о дополнении ответа - смело предлагайте правку.

P.S. Хранить обученную НС можно как угодно. Зависимо от того, как Вы потом будете считывать обратно записанные данные. Но в целом достаточно хранить только веса и общую конфигурацию сети (кол-во слоев, нейронов).

P.S. На счет обучения в универе, то сначала идет обучение фундаментальных алгоритмов, линейных, логистических регрессий, SVM, Random Forest, KNN и тд. И под конец учёбы на 6-7 семестре будет что-то более приближенное к НС. Довольно интересно, но не всегда легко.

entithat
  • 13,090