На Хабре есть большое количество статей о нейронных сетях, в которых присутствует картинка нейрона в виде кружочка с входящими стрелочками, картинка с линиями нейронов и обязательная формула суммы произведения весов на признаки. Эти статьи часто вызывают негодование уважаемой публики своей очевидностью и схожестью с обучением рисования совы. В этой статье я пойду ещё дальше – здесь не будет даже этого. Ни математики, ни сравнений с мозгом. Вы вряд ли научитесь по этой статье чему-то практическому и есть большая вероятность, что всё изложенное покажется Вам слишком очевидным. Цель этой статьи — вопрос: что можете с помощью нейронных сетей сделать Вы. Не Яндекс, не Google, не Facebook, а именно Вы – с Вашим пятилетним стажем работы веб-разработчиком и трехлетним ноутбуком.

image

Вокруг нейронных сетей (далее — НС) сейчас много шума. Вот и я решил сделать какой-нибудь продукт на их основе. И спросил себя: что мне нужно для этого? И ответил себе (да, я люблю поговорить с умным человеком): нужны три вещи – знания в области нейронных сетей, данные для обучения и железо, на котором обучать нейронную сеть. К слову, уже после я слышал, как во многих роликах на youtube докладчики говорили о том, что причиной ренессанса НС являются как раз эти вещи: улучшенные алгоритмы (знания), доступность огромного количества данных и возможности современных компьютеров (железо). Такое совпадение моих мыслей и слов экспертов обнадеживает, поэтому далее я буду говорить именно об этих трех вещах: данные, знания и железо.

Данные


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

Лирическое отступление
Конечно, во многом этот хайп и пузырь вокруг НС – это влияние моды, вирусности, романтичного названия, аналогий с мозгом и мечтой о сильном ИИ. Ведь согласитесь, что если бы эти техники назывались «Перемножение матриц и оптимизация параметров методом градиентного спуска», всё это звучало бы менее эффектно и, возможно, не привлекло бы так много внимания. Некоторые возразят, что мол, чёрт с ним, с названием, не только из-за названия они так популярны, они же вызывают вау-эффект — посмотрите, что эти сети делают, они же выиграли в го! Хорошо, но когда ИИ выиграл в шахматы, ведь мало кто стал боготворить поиск в глубину и журналисты не писали о том, что A-star захватит мир, а программисты не стали его массово изучать.

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

Для обучения НС нужно очень много данных – сотни тысяч, миллионы примеров. Сможете, используя Ваш самописный граббер интернета, найти и скачать такую кучу? Я думаю, да. Но есть несколько проблем:

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

  2. Данные должны быть равномерно распределены, что бы это ни значило. А значит это, что если у Вас есть даже миллионы данных, которые содержат сведения о bmw и dodge, но почти нет о Ford и Mazda, то НС никогда не сможет адекватно обобщить данные, хуже того, она будет завышать цены или рисовать круглые фары и агрессивный вид.

  3. Вы должны знать многое о характере данных, чтобы быть способны выделить важные признаки и, возможно, наложить некоторые ограничения на НС. Да, многослойная НС – это универсальный аппроксиматор любых непрерывных функций, но никто не говорил, что это будет быстро. Как ни странно это покажется, но чем больше ограничений, тем быстрее НС сможет обучаться. Почему НС стали так хороши в обработке изображений? Потому что умные ребята заложили в саму архитектуру этих сетей сведения, касающиеся изображений. Они создали отдельный класс сетей – сверточные сети, которые берут данные от группы пикселей, сжимают изображение в разных вариантах, проводят математические преобразования, цель которых нивелировать влияние сдвигов, трансформаций, разных ракурсов камеры. Подойдёт ли это для других типов данных? Вряд ли. Подойдёт ли для картинок, где ракурсы несут в себе важную информацию? Кто знает?

Знания


В НС чертовски много гиперпараметров, которые сильно влияют как на скорость работы, так и на сходимость в принципе. Вы можете переобучиться, застрять в локальном максимуме, растянуть обучение на недели и прочее. Знания архитектур НС, принципов работы Вы приобретёте, Вы же программист. Существует огромное количество фреймворков для машинного обучения – theano, tensorflow и прочие. Но вот настройка таких параметров как скорость обучения, выбор момента, выбор регуляризации и её параметров, выбор функции активации и ещё множества других – это экспериментальный процесс, отнимающий много времени. Из-за отсутствия точной стратегии и необходимости для каждой задачи настраивать и подбирать параметры вручную многие называют процесс обучения НС искусством.

Ресурсы


Вам нужно миллионы примеров обрабатывать многократно, большое количество раз: Вы дали примеры, НС немного поднастроила веса, Вы снова дали те же примеры, НС снова поднастроила веса — и так много «эпох». Если Вы используете перекрестную проверку, то данные Вы ещё и даёте при разных разбиениях на обучающую и валидационную выборку для того, чтобы НС не переобучилась на одних и тех же данных.

Какие приблизительно ресурсы Вы можете себе позволить? Я хотел купить себе топовый компьютер на базе Kaby Lake 7700K (или Razen 1800X) с двумя видеокартами NVidia GTX 1080, работающими совместно, используя SLI. И мне грела душу мысль о том, что его производительность равна производительности суперкомпьютеров десятилетней давности из списка Top500. Сколько времени займет обучение НС на нём? Это, конечно, зависит от архитектуры сети (количества слоёв, количества нейронов в слоях, связей), от количества примеров для обучения, от гиперпараметров. Но что меня поразило – я потратил несколько часов на сайте playground.tensorflow.org для того, чтобы маленькая сеть смогла правильно классифицировать точки в спирали в двумерном пространстве. Всего два измерения, не так много данных, а столько времени. Победитель конкурса ImageNet потратил в своё время неделю на обучение сети, используя две видеокарты, а уж он знал толк в подборе гиперпараметров. Вряд ли купите даже десяток серверов. Хватит ли у Вас терпения на обучение НС?

Резюме: мне кажется, что в домашних условиях Вы сможете решать некоторые задачи с помощью НС.

  • Размер обучающей выборки может быть равен сотням тысяч примеров.
  • Вы сможете добиться точности порядка 80-90%.
  • Обучение НС может занять у Вас дни.

Это моё интуитивное мнение и очень приблизительная оценка, оно может быть ошибочным, я буду рад, если кто-нибудь в комментариях напишет о задачах, которые он решал в домашних условиях, какой был объем данных и характеристики железа.

Спасибо за внимание!
Поделиться с друзьями
-->

Комментарии (16)


  1. darkfelex
    07.03.2017 15:13

    Не могли бы Вы поделиться ссылкой на сайт с КДПВ?


    1. holyhope
      07.03.2017 15:14

      TensorFlow
      На КДПВ я задал слишком большую скорость обучения — Learning Rate, поэтому на графике потерь так скачут значения.


      1. holyhope
        07.03.2017 15:20

        К слову, TensorFlow — фреймворк для создания НС. Его разрабатывает Google. И даже круче — его разрабатывает легенда — Jeff Dean.


  1. Andrey_Dolg
    07.03.2017 15:34

    Спасибо! Отлично написано. Хотелось бы увидеть в таком изложении статью об обучении без учителя. =)


  1. Quiensabe
    07.03.2017 15:59

    Интересно, а «мало», это сколько? Каков минимальный размер сети позволяющий распознать спираль?

    Это мало, или нет?


    1. holyhope
      07.03.2017 16:13

      Минимальный размер сети зависит от первоначально выбранных признаков. Самая маленькая возможная сеть — однослойный персептрон, который по сути состоит из всего одного нейрона и может разделять классы точек только с помощью прямой линий. Но при этом если Вы выберете признаки так, что изначально нелинейное распределение точек превратится в линейное, то даже персептрон сможет правильно выполнить его разделение. Это называется «спрямление пространства».
      Например, на картинке Вы в качестве признаков выбрали квадраты x1 и x2, а также их произведение. Вы преобразовали пространство признаков из x1 и x2 в другое пространство, где признаков у Вас пять. И поэтому даже «маленькие» сети могут разделять его достаточно быстро.
      Отвечая на Ваш вопрос: минимальный размер сети, позволяющий распознать спираль или что угодно — один нейрон, но только если Вы предварительно «спрямите» (преобразуете) пространство признаков в линейно разделимое.
      Если Вы дадите только исходные признаки, то многослойная НС может сама с помощью скрытых слоёв это сделать, но для этого ей нужно время.


    1. holyhope
      07.03.2017 16:28

      Вообще, известный ученый Джеффри Хинтон советовал выбирать НС с количеством скрытых слоёв в районе 3-5 штук. Но сейчас для распознавания объектов на картинках и в текстовых задачах, насколько мне известно, используются очень глубокие (глубина — количество слоёв) сети, с десятками скрытых слоёв. Каждый последующий слой как бы обобщает результаты предыдущего: первый слой распознаёт черточки, второй из черточек — скругления, третий — нос и глаза, четвертый — лицо. Извините, за набивший оскомину пример.


      1. bertmsk
        07.03.2017 17:10

        Тут важно понимать контекст «глубины НС». 3-5 скрытых слоя относится скорее к обычным (generic) сетям. В них количество скрытых слоев особо не влияет на качество результата, а вот на скорость обучения очень даже. Плюс с глубокой сетью еще есть такая проблема как исчезающий градиент.

        А десятки и даже сотни слоев используются в сверточных. Там другая методология, оптимизаторы и вот это всё.


  1. SpyDeX
    07.03.2017 16:30
    +5

    Простите, но как заголовок «Что с помощью нейронных сетей можете сделать Вы?» соответствует содержанию статьи?
    Сразу во втором абзаце вопрос подменён на «И спросил себя: что мне нужно для этого?»

    Зашёл за списком новых интересных задач, а наткнулся на одну из «На Хабре есть большое количество статей о нейронных сетях, в которых присутствует картинка нейрона в виде кружочка с входящими стрелочками».


    1. holyhope
      07.03.2017 16:34
      -6

      Я честно предупредил, что, возможно, Вы не узнаете из статьи ничего практического. Заголовок несёт следующий смысл: насколько сложные задачи можно решать в домашних условиях. То есть цель статьи была не привести список возможных задач, а подумать о возможном масштабе задач, которые могут быть решены дома.


      1. SpyDeX
        07.03.2017 20:22
        +2

        Я прочитал то, что написали вы, и взамен ещё раз прошу прочитать, что написал я.
        Вы завлекли людей обманом (надеюсь неумышленно) — «вот что вы можете решить с помощью НС», и пришёл по заголовку.

        А зайдя внутрь статьи, я не нашёл ответа «что можно решить?». Есть только описание, «КАК нужно обучать сеть», и снова абстрактно и безотносительно к какой-то конкретно задачи.

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

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

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

        // и тут я вспомнил анекдот «как заинтриговать идиота»


        1. holyhope
          07.03.2017 22:45

          Понял Вас. Во искупление я напишу сегодня статью об областях применения НС.
          Без всякой связи с анекдотом, если что :)


        1. holyhope
          07.03.2017 22:56

          Заголовок изменил тоже


  1. doktr
    07.03.2017 23:59
    +1

    На ноутбуке с 4-мя ядрами и 6Гб оперативки у меня получалось натренировать сеть для распознования фотографий с дорожными знаками с точностью 93% на тесте. Процесс обучения занимал около 40 минут. Использовал TensorFlow. Но конечно вместо не очень мощного ноутбука предпочел бы использовать машины с AWS с графическим процессором, но тогда не было к ним доступа.


    1. holyhope
      08.03.2017 00:01

      Спасибо, когда я писал статью, я хотел, чтобы были именно такие комментарии. А сколько у Вас было всего фотографий?


      1. doktr
        08.03.2017 01:20
        +1

        35 тысяч