Что с помощью нейронных сетей можете сделать Вы?
На Хабре есть большое количество статей о нейронных сетях, в которых присутствует картинка нейрона в виде кружочка с входящими стрелочками, картинка с линиями нейронов и обязательная формула суммы произведения весов на признаки. Эти статьи часто вызывают негодование уважаемой публики своей очевидностью и схожестью с обучением рисования совы. В этой статье я пойду ещё дальше — здесь не будет даже этого. Ни математики, ни сравнений с мозгом. Вы вряд ли научитесь по этой статье чему-то практическому и есть большая вероятность, что всё изложенное покажется Вам слишком очевидным. Цель этой статьи — вопрос: что можете с помощью нейронных сетей сделать Вы. Не Яндекс, не Google, не Facebook, а именно Вы — с Вашим пятилетним стажем работы веб-разработчиком и трехлетним ноутбуком.
Вокруг нейронных сетей (далее — НС) сейчас много шума. Вот и я решил сделать какой-нибудь продукт на их основе. И спросил себя: что мне нужно для этого? И ответил себе (да, я люблю поговорить с умным человеком): нужны три вещи — знания в области нейронных сетей, данные для обучения и железо, на котором обучать нейронную сеть. К слову, уже после я слышал, как во многих роликах на youtube докладчики говорили о том, что причиной ренессанса НС являются как раз эти вещи: улучшенные алгоритмы (знания), доступность огромного количества данных и возможности современных компьютеров (железо). Такое совпадение моих мыслей и слов экспертов обнадеживает, поэтому далее я буду говорить именно об этих трех вещах: данные, знания и железо.
Данные
Характер и тип данных зависит от той области, в которой Вы хотите применить НС.
Современные НС стали решать такие крутые задачи, как распознавание объектов на изображениях, лиц, распознавание речи, смогли сами играть в видеоигры и победили в го.
НС кроме прочего окутаны ореолом таинственности — никто не понимает, как именно они выполняют свою работу: набор нелинейных функций, многочисленных матриц весов, загадочных слагаемых и множителей — всё это выглядит как чан ведьмы, куда она бросает всякие корешки, крылья нетопырей и кровь дракона. Но вернемся к вопросу статьи.
Для обучения НС нужно очень много данных — сотни тысяч, миллионы примеров. Сможете, используя Ваш самописный граббер интернета, найти и скачать такую кучу? Я думаю, да. Но есть несколько проблем:
- Для обучения с учителем данные должны быть маркированными. Кто-то должен эти данные разметить, отнести их к разным классам, дать численную оценку. Если этого изначально по какой-то причине нет (например, у вас только аудио, а стенограммы нет), то это требует огромных трудозатрат. Конечно, существует обучение без учителя, с подкреплением и прочее, но они решают иные задачи (упрощенно, не классификацию и регрессию (по сути — определение значения неизвестной функции), а кластеризацию или выбор наилучших действий). Я в виду ограниченного объема статьи не стану касаться этого вопроса.
- Данные должны быть равномерно распределены, что бы это ни значило. А значит это, что если у Вас есть даже миллионы данных, которые содержат сведения о bmw и dodge, но почти нет о Ford и Mazda, то НС никогда не сможет адекватно обобщить данные, хуже того, она будет завышать цены или рисовать круглые фары и агрессивный вид.
- Вы должны знать многое о характере данных, чтобы быть способны выделить важные признаки и, возможно, наложить некоторые ограничения на НС. Да, многослойная НС — это универсальный аппроксиматор любых непрерывных функций, но никто не говорил, что это будет быстро. Как ни странно это покажется, но чем больше ограничений, тем быстрее НС сможет обучаться. Почему НС стали так хороши в обработке изображений? Потому что умные ребята заложили в саму архитектуру этих сетей сведения, касающиеся изображений. Они создали отдельный класс сетей — сверточные сети, которые берут данные от группы пикселей, сжимают изображение в разных вариантах, проводят математические преобразования, цель которых нивелировать влияние сдвигов, трансформаций, разных ракурсов камеры. Подойдёт ли это для других типов данных? Вряд ли. Подойдёт ли для картинок, где ракурсы несут в себе важную информацию? Кто знает?
Знания
В НС чертовски много гиперпараметров, которые сильно влияют как на скорость работы, так и на сходимость в принципе. Вы можете переобучиться, застрять в локальном максимуме, растянуть обучение на недели и прочее. Знания архитектур НС, принципов работы Вы приобретёте, Вы же программист. Существует огромное количество фреймворков для машинного обучения — theano, tensorflow и прочие. Но вот настройка таких параметров как скорость обучения, выбор момента, выбор регуляризации и её параметров, выбор функции активации и ещё множества других — это экспериментальный процесс, отнимающий много времени. Из-за отсутствия точной стратегии и необходимости для каждой задачи настраивать и подбирать параметры вручную многие называют процесс обучения НС искусством.
Ресурсы
Вам нужно миллионы примеров обрабатывать многократно, большое количество раз: Вы дали примеры, НС немного поднастроила веса, Вы снова дали те же примеры, НС снова поднастроила веса — и так много «эпох». Если Вы используете перекрестную проверку, то данные Вы ещё и даёте при разных разбиениях на обучающую и валидационную выборку для того, чтобы НС не переобучилась на одних и тех же данных.
Какие приблизительно ресурсы Вы можете себе позволить? Я хотел купить себе топовый компьютер на базе Kaby Lake 7700K (или Razen 1800X) с двумя видеокартами NVidia GTX 1080, работающими совместно, используя SLI. И мне грела душу мысль о том, что его производительность равна производительности суперкомпьютеров десятилетней давности из списка Top500. Сколько времени займет обучение НС на нём? Это, конечно, зависит от архитектуры сети (количества слоёв, количества нейронов в слоях, связей), от количества примеров для обучения, от гиперпараметров. Но что меня поразило — я потратил несколько часов на сайте playground.tensorflow.org для того, чтобы маленькая сеть смогла правильно классифицировать точки в спирали в двумерном пространстве. Всего два измерения, не так много данных, а столько времени. Победитель конкурса ImageNet потратил в своё время неделю на обучение сети, используя две видеокарты, а уж он знал толк в подборе гиперпараметров. Вряд ли купите даже десяток серверов. Хватит ли у Вас терпения на обучение НС?
Резюме: мне кажется, что в домашних условиях Вы сможете решать некоторые задачи с помощью НС.
- Размер обучающей выборки может быть равен сотням тысяч примеров
- Вы сможете добиться точности порядка 80–90%
- Обучение НС может занять у Вас дни
Это моё интуитивное мнение и очень приблизительная оценка, оно может быть ошибочным, я буду рад, если кто-нибудь в комментариях напишет о задачах, которые он решал в домашних условиях, какой был объем данных и характеристики железа.
Спасибо за внимание!