Вокруг нейронных сетей (далее — НС) сейчас много шума. Вот и я решил сделать какой-нибудь продукт на их основе. И спросил себя: что мне нужно для этого? И ответил себе (да, я люблю поговорить с умным человеком): нужны три вещи – знания в области нейронных сетей, данные для обучения и железо, на котором обучать нейронную сеть. К слову, уже после я слышал, как во многих роликах на youtube докладчики говорили о том, что причиной ренессанса НС являются как раз эти вещи: улучшенные алгоритмы (знания), доступность огромного количества данных и возможности современных компьютеров (железо). Такое совпадение моих мыслей и слов экспертов обнадеживает, поэтому далее я буду говорить именно об этих трех вещах: данные, знания и железо.
Данные
Характер и тип данных зависит от той области, в которой Вы хотите применить НС.
Современные НС стали решать такие крутые задачи, как распознавание объектов на изображениях, лиц, распознавание речи, смогли сами играть в видеоигры и победили в го.
НС кроме прочего окутаны ореолом таинственности — никто не понимает, как именно они выполняют свою работу: набор нелинейных функций, многочисленных матриц весов, загадочных слагаемых и множителей — всё это выглядит как чан ведьмы, куда она бросает всякие корешки, крылья нетопырей и кровь дракона. Но вернемся к вопросу статьи.
Для обучения НС нужно очень много данных – сотни тысяч, миллионы примеров. Сможете, используя Ваш самописный граббер интернета, найти и скачать такую кучу? Я думаю, да. Но есть несколько проблем:
- Для обучения с учителем данные должны быть маркированными. Кто-то должен эти данные разметить, отнести их к разным классам, дать численную оценку. Если этого изначально по какой-то причине нет (например, у вас только аудио, а стенограммы нет), то это требует огромных трудозатрат. Конечно, существует обучение без учителя, с подкреплением и прочее, но они решают иные задачи (упрощенно, не классификацию и регрессию (по сути — определение значения неизвестной функции), а кластеризацию или выбор наилучших действий). Я в виду ограниченного объема статьи не стану касаться этого вопроса.
- Данные должны быть равномерно распределены, что бы это ни значило. А значит это, что если у Вас есть даже миллионы данных, которые содержат сведения о bmw и dodge, но почти нет о Ford и Mazda, то НС никогда не сможет адекватно обобщить данные, хуже того, она будет завышать цены или рисовать круглые фары и агрессивный вид.
- Вы должны знать многое о характере данных, чтобы быть способны выделить важные признаки и, возможно, наложить некоторые ограничения на НС. Да, многослойная НС – это универсальный аппроксиматор любых непрерывных функций, но никто не говорил, что это будет быстро. Как ни странно это покажется, но чем больше ограничений, тем быстрее НС сможет обучаться. Почему НС стали так хороши в обработке изображений? Потому что умные ребята заложили в саму архитектуру этих сетей сведения, касающиеся изображений. Они создали отдельный класс сетей – сверточные сети, которые берут данные от группы пикселей, сжимают изображение в разных вариантах, проводят математические преобразования, цель которых нивелировать влияние сдвигов, трансформаций, разных ракурсов камеры. Подойдёт ли это для других типов данных? Вряд ли. Подойдёт ли для картинок, где ракурсы несут в себе важную информацию? Кто знает?
Знания
В НС чертовски много гиперпараметров, которые сильно влияют как на скорость работы, так и на сходимость в принципе. Вы можете переобучиться, застрять в локальном максимуме, растянуть обучение на недели и прочее. Знания архитектур НС, принципов работы Вы приобретёте, Вы же программист. Существует огромное количество фреймворков для машинного обучения – theano, tensorflow и прочие. Но вот настройка таких параметров как скорость обучения, выбор момента, выбор регуляризации и её параметров, выбор функции активации и ещё множества других – это экспериментальный процесс, отнимающий много времени. Из-за отсутствия точной стратегии и необходимости для каждой задачи настраивать и подбирать параметры вручную многие называют процесс обучения НС искусством.
Ресурсы
Вам нужно миллионы примеров обрабатывать многократно, большое количество раз: Вы дали примеры, НС немного поднастроила веса, Вы снова дали те же примеры, НС снова поднастроила веса — и так много «эпох». Если Вы используете перекрестную проверку, то данные Вы ещё и даёте при разных разбиениях на обучающую и валидационную выборку для того, чтобы НС не переобучилась на одних и тех же данных.
Какие приблизительно ресурсы Вы можете себе позволить? Я хотел купить себе топовый компьютер на базе Kaby Lake 7700K (или Razen 1800X) с двумя видеокартами NVidia GTX 1080, работающими совместно, используя SLI. И мне грела душу мысль о том, что его производительность равна производительности суперкомпьютеров десятилетней давности из списка Top500. Сколько времени займет обучение НС на нём? Это, конечно, зависит от архитектуры сети (количества слоёв, количества нейронов в слоях, связей), от количества примеров для обучения, от гиперпараметров. Но что меня поразило – я потратил несколько часов на сайте playground.tensorflow.org для того, чтобы маленькая сеть смогла правильно классифицировать точки в спирали в двумерном пространстве. Всего два измерения, не так много данных, а столько времени. Победитель конкурса ImageNet потратил в своё время неделю на обучение сети, используя две видеокарты, а уж он знал толк в подборе гиперпараметров. Вряд ли купите даже десяток серверов. Хватит ли у Вас терпения на обучение НС?
Резюме: мне кажется, что в домашних условиях Вы сможете решать некоторые задачи с помощью НС.
- Размер обучающей выборки может быть равен сотням тысяч примеров.
- Вы сможете добиться точности порядка 80-90%.
- Обучение НС может занять у Вас дни.
Это моё интуитивное мнение и очень приблизительная оценка, оно может быть ошибочным, я буду рад, если кто-нибудь в комментариях напишет о задачах, которые он решал в домашних условиях, какой был объем данных и характеристики железа.
Спасибо за внимание!
Комментарии (16)
Andrey_Dolg
07.03.2017 15:34Спасибо! Отлично написано. Хотелось бы увидеть в таком изложении статью об обучении без учителя. =)
Quiensabe
07.03.2017 15:59Интересно, а «мало», это сколько? Каков минимальный размер сети позволяющий распознать спираль?
Это мало, или нет?
holyhope
07.03.2017 16:13Минимальный размер сети зависит от первоначально выбранных признаков. Самая маленькая возможная сеть — однослойный персептрон, который по сути состоит из всего одного нейрона и может разделять классы точек только с помощью прямой линий. Но при этом если Вы выберете признаки так, что изначально нелинейное распределение точек превратится в линейное, то даже персептрон сможет правильно выполнить его разделение. Это называется «спрямление пространства».
Например, на картинке Вы в качестве признаков выбрали квадраты x1 и x2, а также их произведение. Вы преобразовали пространство признаков из x1 и x2 в другое пространство, где признаков у Вас пять. И поэтому даже «маленькие» сети могут разделять его достаточно быстро.
Отвечая на Ваш вопрос: минимальный размер сети, позволяющий распознать спираль или что угодно — один нейрон, но только если Вы предварительно «спрямите» (преобразуете) пространство признаков в линейно разделимое.
Если Вы дадите только исходные признаки, то многослойная НС может сама с помощью скрытых слоёв это сделать, но для этого ей нужно время.
holyhope
07.03.2017 16:28Вообще, известный ученый Джеффри Хинтон советовал выбирать НС с количеством скрытых слоёв в районе 3-5 штук. Но сейчас для распознавания объектов на картинках и в текстовых задачах, насколько мне известно, используются очень глубокие (глубина — количество слоёв) сети, с десятками скрытых слоёв. Каждый последующий слой как бы обобщает результаты предыдущего: первый слой распознаёт черточки, второй из черточек — скругления, третий — нос и глаза, четвертый — лицо. Извините, за набивший оскомину пример.
bertmsk
07.03.2017 17:10Тут важно понимать контекст «глубины НС». 3-5 скрытых слоя относится скорее к обычным (generic) сетям. В них количество скрытых слоев особо не влияет на качество результата, а вот на скорость обучения очень даже. Плюс с глубокой сетью еще есть такая проблема как исчезающий градиент.
А десятки и даже сотни слоев используются в сверточных. Там другая методология, оптимизаторы и вот это всё.
SpyDeX
07.03.2017 16:30+5Простите, но как заголовок «Что с помощью нейронных сетей можете сделать Вы?» соответствует содержанию статьи?
Сразу во втором абзаце вопрос подменён на «И спросил себя: что мне нужно для этого?»
Зашёл за списком новых интересных задач, а наткнулся на одну из «На Хабре есть большое количество статей о нейронных сетях, в которых присутствует картинка нейрона в виде кружочка с входящими стрелочками».
holyhope
07.03.2017 16:34-6Я честно предупредил, что, возможно, Вы не узнаете из статьи ничего практического. Заголовок несёт следующий смысл: насколько сложные задачи можно решать в домашних условиях. То есть цель статьи была не привести список возможных задач, а подумать о возможном масштабе задач, которые могут быть решены дома.
SpyDeX
07.03.2017 20:22+2Я прочитал то, что написали вы, и взамен ещё раз прошу прочитать, что написал я.
Вы завлекли людей обманом (надеюсь неумышленно) — «вот что вы можете решить с помощью НС», и пришёл по заголовку.
А зайдя внутрь статьи, я не нашёл ответа «что можно решить?». Есть только описание, «КАК нужно обучать сеть», и снова абстрактно и безотносительно к какой-то конкретно задачи.
Содержимое статьи не соответствует тому, чем вы завлекли читателей в свою статью, я именно на это обратил внимание.
Я абсолютно не против того, что вы описали, там всё достаточно расплывчато и общо описано, чтобы можно было с чем-то не согласится, но будьте честны к своим читателям, если называете статью о сферах применения НС, то опишите эти новые примеры.
Столько уже было понаписано об областях применения НС, что я прочитав заголовок был очень заинтригован, какая же область применения осталась незамеченой.
// и тут я вспомнил анекдот «как заинтриговать идиота»holyhope
07.03.2017 22:45Понял Вас. Во искупление я напишу сегодня статью об областях применения НС.
Без всякой связи с анекдотом, если что :)
doktr
07.03.2017 23:59+1На ноутбуке с 4-мя ядрами и 6Гб оперативки у меня получалось натренировать сеть для распознования фотографий с дорожными знаками с точностью 93% на тесте. Процесс обучения занимал около 40 минут. Использовал TensorFlow. Но конечно вместо не очень мощного ноутбука предпочел бы использовать машины с AWS с графическим процессором, но тогда не было к ним доступа.
darkfelex
Не могли бы Вы поделиться ссылкой на сайт с КДПВ?
holyhope
TensorFlow
На КДПВ я задал слишком большую скорость обучения — Learning Rate, поэтому на графике потерь так скачут значения.
holyhope
К слову, TensorFlow — фреймворк для создания НС. Его разрабатывает Google. И даже круче — его разрабатывает легенда — Jeff Dean.