Хотите начать изучать нейронные сети? Самое время! Ведь машинное обучение как-раз вошло в стадию, в которой лет пять назад была веб разработка: порог вхождения уже совсем не требует высшей математики, а совсем скоро станет мейнстримом, настолько доступным программистам, насколько сейчас доступен тот же JavaScript.
Чтобы не быть голословным, объясню вам разницу между двумя подходами к решению той же задачи обучения симуляции автомобиля преодоления гоночной трассы:
youtube.com/watch?v=8V2sX9BhAW8 — посмотрите это короткое видео, оно завораживает. Я пересмотрел его раза три точно.
Первый подход — классическая алгоритмика, когда мы задаем ряд определенных правил, которых придерживается симуляция. Слишком близко к левой стене? Поворачивай направо. Видишь, что перед тобой прямая? Разгоняйся. Впереди поворот? Жми на тормоза. Казалось бы — великолепная стратегия! Стратегия, которая работает только в рамках определенных, можно сказать, лабораторных условий. Меняем трек на бездорожье и приходится заново придумывать ряд правил и алгоритмов, да еще и просчитывать правильные константы разгона или задавать по ним правила тоже. Муторно, долго, слишком много программисто-часов будет израсходовано, и так на каждую трассу.
Поступим иначе, в рамках все той же классической алгоритмики: будем заранее просчитывать всю трассу наперед и заранее подготовимся преодолевать препятствия. Может получиться достаточно годно, но! Увеличим длинну трассы до протяженности того же экватора, добавим случайных препятствий, других гонщиков (роботов или людей) — и вот уже нам недостаточно атомов и жизни вселенной, чтобы рассчитать весь путь.
А теперь перейдем к нейронным сетям: как будут они решать эту задачу? Вы не поверите, но как сложности финальной программы, так и количества кода будет на порядки меньше! Чем же классический подход машинного обучения отличается от алгоритмики? Практически ничем.
Представим, что у нас есть возможность симулировать проезд по этой трассе 1 000 000 раз без последствий, в течение пяти минут. Что будет делать человек, который ни разу не сидел за рулем автомобиля, с учетом невозможности навредить себе или окружению и остановки времени, чтобы он смог за 5 минут проехаться по ней 1 000 000 раз? Он будет учиться на своих ошибках: так, кручу руль влево, едет влево; нажимаю газ, машина едет; нажимаю тормоз — она тормозит; так, еду слегка не в ту сторону — время слегка повернуть руль; так, врезался в столб, столбы лучше объезжать; так, тут меня подрезал другой гонщик, в следующий раз буду осторожнее.
Что делает нейронная сеть? То же самое! Первые ступени обучения самые скучные — нейроны пытаются проверить, какие возможности у них есть. А теперь мы добавляем нейронам не только данные трассы на входе, но и возможность проверить: врезались ли они в препятствие или можно ехать дальше. Попробовали раз, второй, третий — не получается. Нужно что-то менять.
Но как сеть понимает, что именно нужно менять? От чего она только слегка поворачивает руль и объезжает столб, а не разворачивается в обратном или случайном направлении? Вариаций ведь масса! Ответ простой: нейронка сама создает себе список правил, которых нужно придерживаться, имея возможность понять, насколько сильно она ошиблась в этой итерации. И именно здесь и кроется вся магия: научить сеть понимать, насколько сильно она ошиблась.
А, когда она знает, насколько сильно ошибается, она может и скорректировать свои правила, потом попробовать еще раз, зафиксировать, уменьшилась ли ошибка или увеличилась. Дальше — скорректировать действия.
Представим себе другую задачу: поиск иголки в стоге сена. Берем стандартные алгоритмы поиска, и они, в буквальном смысле, проверяют каждый возможный путь до иголки, пока ее не найдут. Что делает нейронка? Проверяет один путь, смотрит, насколько она ошиблась, и корректирует свое движение слегка, все ближе и ближе к правильному пути.