По работе мне было необходимо изучить вопрос нейронных сетей более менее глубоко. Но в интернете в доступной форме я в основном находил скорее рассказы про достижения, про классификацию и рисование картинок, про то, какие библиотеки применяются и поверхностное описание. А вот что происходит и почему на самом базовом уровне, почему-то упускалось. Как истинный самоучка, я понимаю, что пробелы именно в самых основах - это корневая проблема при изучении любой новой для себя области. Потому я постараюсь сам понять это всё и предлагаю сделать это вместе со мной.
Во-первых, хочу сказать, что искусственный интеллект в реальности - это не то, что мы видим в фильмах про терминатора и тому подобных. Ни о каком реальном интеллекте речи пока не идёт. Потому паниковать о надвигающемся восстании машин ещё совсем рано. Мы ставим перед некоторым программным обеспечением задачу. Настраиваем программу, чтобы она на статистических данных подбирала всевозможные параметры преобразования входящих данных в выходящие с допустимым уровнем точности. И всё. Какую задачу поставили, такую она и решает. Конечно, если кто-то попробует сделать нейронную сеть, которая будет обязана ухудшить жизнь людей в какой-то конкретной области, а этот человек ещё и будет обладать властью и ресурсами, чтобы эту нейронную сеть применить, то всякое возможно. Но это сценарий мягко говоря слабо реализуем. Кроме того проще всё это делать и без нейронных сетей.
Во-вторых, любая нейронная сеть принимает на вход какие-то данные. В первую очередь они числовые. Т.е. даже если мы распознаём картинки, мы всё равно переводим картинку в пиксели. Каждый пиксель - это одно или несколько чисел. И вот весь этот набор именно чисел получает на вход нейронная сеть. Затем она их как-то математически обрабатывает, получая на выходе тоже числовой результат, который мы уже каким-либо образом пытаемся интерпретировать. Результат мы можем толковать, как угодно. Есть множество реализаций нейронных сетей, которые, например, дают нам описание того, что изображено на картинке. Т.е. мы можем даже перевести картинку в текст. Можно также получить на вход текст на одном языке, а на выходе получить текст на другом языке, чем активно занимается Яндекс.Переводчик. Есть всевозможные скоринговые модели, которые принимают на вход большое количество данных клиента, выдавая нам вероятность его хорошего кредитного поведения. Другими словами, фактически мы можем решить любую задачу. Но в основе этого всё равно будет переработка некоторого набора входящих числовых параметров в выходящие числовые параметры.
Третье: Это может быть несколько не интуитивно и не естественно, но любая нейронная сеть просто напросто оптимизирует некоторую математическую зависимость от многих переменных. Когда сеть многослойная (а обычно это так), мы лишь увеличиваем вложенность этих преобразований. При однослойной же нейронной сети, где все входящие данные просто суммируются с некоторыми весами, мы по факту реальную ситуацию пытаемся описать некоторой прямой линией в многих измерениях. Если параметр всего один, то это можно изобразить так:
Видно, что наша линия довольно далека от точек. И, вообще говоря, невозможно построить такую прямую, которая бы все эти точки содержала. Отсюда мы делаем простой вывод о том, что не любая нейронная сеть принципиально может решить некоторую задачу. Если мы сделаем двухслойную нейронную сеть, то ситуация никак не изменится. Получается, что один слой складывает с некоторыми весами входящие параметры и получает некоторое число. А затем уже второй слой получает на вход то, что выдаёт первый слой, а затем снова складывает полученные значения с некоторыми весами. И мы получаем всё ту же линейную функцию. Именно поэтому необходимо в первую очередь вводить всевозможные нелинейности. Это можно делать разными способами. И во многом именно в этом заключается искусство создания успешных нейронных сетей.
Далее, что особенно важно, нужно каким-то образом научить машину подбирать подходящие параметры. Вообще вопрос так называемого обучения нейронной сети - это, пожалуй, самый важный вопрос в этом направлении. Есть наиболее простой и действенный способ - это взять случайные параметры, посмотреть, как сильно расходится результат вычислений программы с тем, что имеется в реальности, а затем в зависимости от этого немного менять параметры. Если результат улучшился, запоминаем новые параметры и идём дальше. Статистически на достаточно большом объёме данных мы получим очень хороший результат, если справились с предыдущим пунктом, где обеспечили принципиальную возможность решения задачи конкретной нейронной сетью.
Теоретически теперь вы можете сами написать нейронную сеть, которая будет решать любую задачу. Но это дело не тривиальное. Конечно, я не рассказал о разных типах нейронных сетей и многих-многих нюансах. Но в целом и общем всё так. В следующий же раз я по шагам распишу, как всё это дело можно реализовать в простом excel файле для некоторых простейших случаев.