Сайт о телевидении

Сайт о телевидении

» » Нейронные сети, «вредные» советы. Яндекс открывает технологию машинного обучения CatBoost

Нейронные сети, «вредные» советы. Яндекс открывает технологию машинного обучения CatBoost

Рассмотрим импульсные нейронные сети: особенности, перспективы и преимущества, благодаря которым успешно вытесняется 2-е поколение.

Всякий, кто следит за текущим прогрессом в анализе данных, слышал о применении в машинном обучении искусственных нейронных сетей второго поколения. Эти сети обычно полносвязные, принимающие и выдающие непрерывно изменяющиеся значения. Хотя нейронные сети осуществили прорыв , в биологическом отношении они не вполне соответствуют структуре реальных нейронов и механизмам обработки информации в человеческом мозге.

Импульсные нейронные сети: принцип работы

К природной физиологии ближе импульсные (спайковые) нейронные сети (spiking neural network, SNN). Импульсные нейронные сети преодолевают разрыв между нейронаукой и машинным обучением, используя для обработки информации биологически реалистичные модели нейронов.

Импульсная нейронная сеть принципиально отличается от нейронных сетей второго поколения, используемых аналитиками данных. Такая сеть вместо непрерывно меняющихся во времени значений оперирует дискретными событиями, происходящими в определенные моменты времени. Сеть получает на входы серию импульсов и выдаёт импульсы на выходе.


Пример сигналов на трех нейронах импульсной нейронной сети

В реальном нейроне передача импульса определяется дифференциальными уравнениями, соответствующим биофизическим процессам образования потенциала на мембране нейрона. Как только потенциал достигает определенной величины, нейрон реагирует на это, передавая импульс, а мембрана приобретает исходный потенциал.


Потенциал на мембране нейрона в процессе передачи сигнала

Для описания процесса используются различные модели . Импульсные нейронные сети также отличаются от сетей второго поколения менее связной и более специфичной топологией.

Импульсные нейронные сети: расстояние и время

На первый взгляд, подход SNN может показаться шагом назад – от непрерывной, своего рода аналоговой картины, к импульсной, двоичной. Однако преимущество SNN состоит в том, что импульсный подход позволяет оперировать данными, учитывая расстояния между нейронами и длительность распространения сигнала, то есть в контексте пространства и времени. За счет этого сети SNN гораздо лучше приспособлены для обработки данных от настоящих сенсоров.

Пространственный аспект отражает тот факт, что нейроны в первую очередь соединены с ближайшими соседями, и поэтому фрагменты ввода обрабатываются отдельно.

Временной аспект соответствует тому, что тренировочные импульсы приходят с различными задержками, и та информация, что мы «теряем» при переходе от непрерывного сигнала к импульсному, на самом деле сохраняется в информации о задержке импульсов друг относительно друга. Это позволяет естественным образом обрабатывать временны́е данные без дополнительной сложности. Доказано, что импульсные нейроны являются более мощными вычислительными единицами, чем традиционные искусственные нейроны.

Пр облемы для практического использования

Учитывая, что SNN в теории являются более мощными нейронными сетями, чем сети второго поколения, остается удивляться, почему мы не видим их широкого применения. Основная проблема практического использовании SNN – обучение. Несмотря на наличие методов биологического неконтролируемого обучения (без учителя), таких как Hebbian и STDP , пока неизвестны эффективные методы обучения SNN, обеспечивающие более высокую производительность, чем сети второго поколения.

Ввиду проблем с дифференцированием импульсов, SNN невозможно обучать, используя градиентный спуск, не теряя точную временную информацию об импульсах. Поэтому, чтобы эффективно использовать SNN для реальных задач, необходимо разработать соответствующие методы контролируемого обучения. Это трудная задача – учитывая биологический реализм этих сетей, она предполагает точное понимание того, как учится человеческий мозг.

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

Перспективы развития

Будущее SNN остается неясным. С одной стороны, они являются естественными преемниками современных нейронных сетей. С другой стороны, SNN пока далеки от практических инструментов для большинства задач. Уже существуют реальные приложения SNN для обработки изображений и звука в режиме реального времени, однако литература по практическим применениям остается скудной.

Большинство публикаций по SNN являются либо теоретическими, либо демонстрируют неудовлетворительную для современных задач производительность. В виду чрезвычайной перспективности этого направления над решением указанных задач работают многие научные группы.

  • Python ,
  • Машинное обучение ,
  • Поисковые технологии
  • Сегодня Яндекс выложил в open source собственную библиотеку CatBoost, разработанную с учетом многолетнего опыта компании в области машинного обучения. С ее помощью можно эффективно обучать модели на разнородных данных, в том числе таких, которые трудно представить в виде чисел (например, виды облаков или категории товаров). Исходный код, документация, бенчмарки и необходимые инструменты уже опубликованы на GitHub под лицензией Apache 2.0.

    CatBoost – это новый метод машинного обучения, основанный на градиентном бустинге. Он внедряется в Яндексе для решения задач ранжирования, предсказания и построения рекомендаций. Более того, он уже применяется в рамках сотрудничества с Европейской организацией по ядерным исследованиям (CERN) и промышленными клиентами Yandex Data Factory. Так чем же CatBoost отличается от других открытых аналогов? Почему бустинг, а не метод нейронных сетей? Как эта технология связана с уже известным Матрикснетом? И причем здесь котики? Сегодня мы ответим на все эти вопросы.

    Термин «машинное обучение» появился еще в 50-х годах. Этот термин обозначает попытку научить компьютер решать задачи, которые легко даются человеку, но формализовать путь их решения сложно. В результате машинного обучения компьютер может демонстрировать поведение, которое в него не было явно заложено. В современном мире мы сталкиваемся с плодами машинного обучения ежедневно по многу раз, многие из нас сами того не подозревая. Оно используется для построения лент в социальных сетях, списков «похожих товаров» в интернет-магазинах, при выдаче кредитов в банках и определении стоимости страховки. На технологиях машинного обучения работает поиск лиц на фотографиях или многочисленные фотофильтры. Для последних, кстати, обычно используются нейронные сети, и о них пишут так часто, что может сложиться ошибочное мнение, будто бы это «серебряная пуля» для решения задач любой сложности. Но это не так.

    Нейросети или градиентный бустинг

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

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

    Например, если вам нужен точный прогноз погоды, где учитывается огромное количество факторов (температура, влажность, данные с радаров, наблюдения пользователей и многие другие). Или если вам нужно качественно ранжировать поисковую выдачу – именно это в свое время и подтолкнуло Яндекс к разработке собственного метода машинного обучения.

    Матрикснет

    Первые поисковые системы были не такими сложными, как сейчас. Фактически сначала был просто поиск слов – сайтов было так мало, что особой конкуренции между ними не было. Потом страниц стало больше, их стало нужно ранжировать. Начали учитываться разные усложнения - частота слов, tf-idf . Затем страниц стало слишком много на любую тему, произошёл первый важный прорыв - начали учитывать ссылки.

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

    Лет десять назад человеческого разума перестало хватать на то, чтобы придумывать, как ранжировать документы. Вы, наверное, замечали, что количество найденного почти по любому запросу огромно: сотни тысяч, часто - миллионы результатов. Большая часть из них неинтересные, бесполезные, лишь случайно упоминают слова запроса или вообще являются спамом. Для ответа на ваш запрос нужно мгновенно отобрать из всех найденных результатов десятку лучших. Написать программу, которая делает это с приемлемым качеством, стало не под силу программисту-человеку. Произошёл следующий переход - поисковики стали активно использовать машинное обучение.

    Яндекс еще в 2009 году внедрили собственный метод Матрикснет, основанный на градиентном бустинге. Можно сказать, что ранжированию помогает коллективный разум пользователей и «мудрость толпы ». Информация о сайтах и поведении людей преобразуется во множество факторов, каждый из которых используется Матрикснетом для построения формулы ранжирования. Фактически, формулу ранжирования теперь пишет машина. Кстати, в качестве отдельных факторов мы в том числе используем результаты работы нейронных сетей (к примеру, так работает алгоритм Палех, о котором в прошлом году).

    Важная особенность Матрикснета в том, что он устойчив к переобучению. Это позволяет учитывать очень много факторов ранжирования и при этом обучаться на относительно небольшом количестве данных, не опасаясь, что машина найдет несуществующие закономерности. Другие методы машинного обучения позволяют либо строить более простые формулы с меньшим количеством факторов, либо нуждаются в большей обучающей выборке.

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

    Именно Матрикснет и его достоинства легли в основу CatBoost. Но зачем нам вообще понадобилось изобретать что-то новое?

    Практически любой современный метод на основе градиентного бустинга работает с числами. Даже если у вас на входе жанры музыки, типы облаков или цвета, то эти данные все равно нужно описать на языке цифр. Это приводит к искажению их сути и потенциальному снижению точности работы модели.

    Продемонстрируем это на примитивном примере с каталогом товаров в магазине. Товары мало связаны между собой, и не существует такой закономерности между ними, которая позволила бы упорядочить их и присвоить осмысленный номер каждому продукту. Поэтому в этой ситуации каждому товару просто присваивают порядковый id (к примеру, в соответствии с программой учета в магазине). Порядок этих чисел ничего не значит, однако алгоритм будет этот порядок использовать и делать из него ложные выводы.

    Опытный специалист, работающий с машинным обучением, может придумать более интеллектуальный способ превращения категориальных признаков в числовые, однако такая предварительная предобработка приведет к потере части информации и приведет к ухудшению качества итогового решения.

    Именно поэтому было важно научить машину работать не только с числами, но и с категориями напрямую, закономерности между которыми она будет выявлять самостоятельно, без нашей ручной «помощи». И CatBoost разработан нами так, чтобы одинаково хорошо работать «из коробки» как с числовыми признаками, так и с категориальными. Благодаря этому он показывает более высокое качество обучения при работе с разнородными данными, чем альтернативные решения. Его можно применять в самых разных областях - от банковской сферы до промышленности.

    Кстати, название технологии происходит как раз от Categorical Boosting (категориальный бустинг). И ни один кот при разработке не пострадал.

    Бенчмарки

    Можно долго говорить о теоретических отличиях библиотеки, но лучше один раз показать на практике. Для наглядности мы сравнили работу библиотеки CatBoost с открытыми аналогами XGBoost, LightGBM и H20 на наборе публичных датасетов. И вот результаты (чем меньше, тем лучше): https://catboost.yandex/#benchmark

    Не хотим быть голословными, поэтому вместе с библиотекой в open source выложены описание процесса сравнения, код для запуска сравнения методов и контейнер с использованными версиями всех библиотек. Любой пользователь может повторить эксперимент у себя или на своих данных.

    CatBoost на практике

    Новый метод уже протестировали на сервисах Яндекса. Он применялся для улучшения результатов поиска, ранжирования ленты рекомендаций Яндекс.Дзен и для расчета прогноза погоды в технологии Метеум - и во всех случаях показал себя лучше Матрикснета. В дальнейшем CatBoost будет работать и на других сервисах. Не будем здесь останавливаться – лучше сразу расскажем про Большой адронный коллайдер (БАК).

    CatBoost успел найти себе применение и в рамках сотрудничества с Европейской организацией по ядерным исследованиям. В БАК работает детектор LHCb, используемый для исследования асимметрии материи и антиматерии во взаимодействиях тяжёлых прелестных кварков. Чтобы точно отслеживать разные частицы, регистрируемые в эксперименте, в детекторе существуют несколько специфических частей, каждая из которых определяет специальные свойства частиц. Наиболее сложной задачей при этом является объединение информации с различных частей детектора в максимально точное, агрегированное знание о частице. Здесь и приходит на помощь машинное обучение. Используя для комбинирования данных CatBoost, учёным удалось добиться улучшения качественных характеристик финального решения. Результаты CatBoost оказались лучше результатов, получаемых с использованием других методов.

    Как начать использовать CatBoost?

    Для работы с CatBoost достаточно установить его на свой компьютер. Библиотека поддерживает операционные системы Linux, Windows и macOS и доступна на языках программирования Python и R. Яндекс разработал также программу визуализации

    Всем привет!

    В этой статье я расскажу о новом комфортном способе программировать на Python.

    Это больше похоже не на программирование, а на создание статей (отчетов/демонстраций/исследований/примеров): среди блоков кода на Python можно вставлять обычный поясняющий текст. Результатом выполнения кода является не только числа и текст (как в случае с консолью при стандартной работе с Python), но еще и графики, диаграммы, картинки…

    Примеры документов, которые вы сможете создавать:

    Выглядит классно? Хотите создавать такие же документы? Тогда данная статья для вас!

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

    Материал рассчитан на людей, не знакомых с языками программирования.

    Для начала Python надо установить. Затем нужно поставить удобную среду для написания программ на Python. Этим двум шагам посвящена на портале.

    Если все установлено и настроено, можно начинать.

    Нейронные сети надо писать на каком-то языке программирования. Их великое множество, но я рекомендую (и использую в учебнике и статьях) именно язык Python. Почему?

    1. Он очень прост в изучении
    2. Большое количество готовых библиотек
    3. Когда смотришь на программу, сразу видишь алгоритм, который она реализует
    4. Большая часть специалистов в машинном обучении используют Python и большая часть библиотек тоже создается именно под этот язык программирования

    В предыдущей части мы учились рассчитывать изменения сигнала при проходе по нейросети. Мы познакомились с матрицами, их произведением и вывели простые формулы для расчетов.

    В 6 части перевода выкладываю сразу 4 раздела книги. Все они посвящены одной из самых важных тем в области нейросетей - методу обратного распространения ошибки. Вы научитесь рассчитывать погрешность всех нейронов нейросети основываясь только на итоговой погрешности сети и весах связей.

    Материал сложный, так что смело задавайте свои вопросы на форуме.

    Вы можете перевода.

    Приятного чтения!

    В 5 части перевода привожу сразу 3 связанных по смыслу раздела.

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

    Вы можете перевода.

    Приятного чтения!

    4 часть перевода готова!

    Заканчиваем ходить вокруг да около и переходим непосредственно к теме книги - нейросетям.

    В этой части перевода мы рассмотрим биологические нейронные сети и сравним их с традиционными компьютерами. Затем мы построим модель искусственного нейрона и в итоге перейдем непосредственно к искусственным нейросетям.

    Вы можете перевода.

    Приятного чтения!

    Третья часть перевода!

    Статья не очень большая. Она охватывает только один раздел книги. Цель - показать, что у каждого метода есть свои ограничения. В статье рассматривается ограничения линейного классификатора. Также вводятся понятия логических функций и проблемы XOR.

    Вы можете перевода.

    Приятного чтения!

    В этой статье я расскажу об интересном генераторе музыки, который работает на нейронных сетях. Генератор называется Amper . С его помощью любой человек, даже весьма далекий от сочинения композиций может самостоятельно создать уникальную мелодию и использовать ее в своих целях.

    Вот, например, что нейросеть разработала для меня.

    18.07.2017, ВТ, 15:53, Мск, Текст: Владимир Бахур

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

    Гибкое использование числовых и нечисловых данных

    «Яндекс» представил новый метод машинного обучения CatBoost и выложил в открытый доступ для всех желающих библиотеку CatBoost на GitHub по лицензии Apache License 2.0. Методика позволяет эффективно обучать модели на разнородных данных - таких как местонахождение пользователя, история операций и тип устройства.

    Согласно заявлениям самого «Яндекса», библиотеки CatBoost представляют собой альтернативу нейронным сетям, которые подходят далеко не для всех типов задач реального производства. В таких условиях алгоритм CatBoost обеспечивает более высокую производительность и более устойчивый результат в процессе переобучения и высокую предсказуемость с точки зрения качества конечного результата.

    «Яндекс много лет занимается машинным обучением, и CatBoost создавали лучшие специалисты в этой области. Выкладывая библиотеку CatBoost в открытый доступ, мы хотим внести свой вклад в развитие машинного обучения, - сказал Михаил Биленко , руководитель управления машинного интеллекта и исследований «Яндекса». - Надо сказать, что CatBoost - первый российский метод машинного обучения, который стал доступен в Open Source. Надеемся, что сообщество специалистов оценит его по достоинству и поможет сделать ещё лучше».

    Как пояснили CNews в «Яндексе», методика CatBoost является наследником метода машинного обучения «Матрикcнет», который применяется почти во всех сервисах «Яндекса». По аналогии с «Матрикснет», CatBoost задействует механизм градиентного бустинга, который хорошо подходит для работы с разнородными данными.

    Методика CatBoost интересна сокращенным временем переобучения благодаря применению патентованного алгоритма построения моделей, который, в свою очередь, отличается от стандартной схемы градиентного бустинга.

    Логотип проекта CatBoost

    В отличие от «Матрикснета», обучающего модели на числовых данных, CatBoost учитывает и нечисловые, например, виды облаков или типы зданий. Раньше такие данные приходилось переводить на язык цифр, что могло изменить их суть и повлиять на точность работы модели.

    Теперь такие данные можно использовать в первоначальном виде, благодаря чему CatBoost показывает более высокое качество обучения, чем аналогичные методы для работы с разнородными данными. Его можно применять в самых разных областях - от банковской сферы до промышленности.

    CatBoost можно запустить прямо из командной строки или воспользоваться удобным для пользователя API для Python или R с инструментами для анализа формул и визуализации обучения.

    Как пояснили CNews в пресс-службе «Яндекса», CatBoost - результат долгой работы лучших специалистов компании, который вобрал в себя многолетний опыт компании в разработке ведущих решений в машинном обучении, таких как «Матрикснет». Выкладывая технологию в открытый доступ, «Яндекс» намерен обеспечить серьезный вклад в развитие машинного обучения и рассчитывает, что сообщество специалистов оценит алгоритм по достоинству и поможет сделать его еще лучше.

    В «Яндексе» планируют обеспечивать постоянную поддержку проекта. Как пояснили в компании, поддержка будет выражаться в постоянном улучшении алгоритма, а также работе с отзывами пользователей технологии.

    Сравнение алгоритмов машинного обучения (GitHub)

    Разработчики также планируют развивать технологию внутри компании: сейчас над ней работает отдельная команда, которые занимается улучшением и внедрением в большее количество сервисов. С течением времени библиотека применений CatBoost будет расти. Поскольку технология выложена в открытый доступ, весь прогресс будет сразу же доступен всем пользователям. Учитывая количество и качество сервисов «Яндекса» и нетривиальные задачи, которые в них решаются, в компании уверены, что технология останется лидирующей в своем классе еще долгое время.

    Сегодня в мире существуют разные способы работы с категориальными факторами. Они заключаются в изначальной предобработке и превращении их в числа, пояснили в «Яндексе».

    Наиболее эффективный с практической точки зрения способ - это подсчет «счетчиков», его активно используют соревнующиеся на Kaggle, и этот способ используется в победных решениях. В существующих открытых решениях такой способ не используется, а используются более простые методы, такие как one-hot-encoding, они работают обычно хуже. Например, такую предобработку можно использовать в алгоритме lightgbm.

    В CatBoost используется более интеллектуальная работа с категориальными факторами, где статистики по ним подсчитываются не заранее, а во время обучения, причем выбираются самые полезные статистики по данным и их комбинациям. One-hot encoding в CatBoost, конечно, тоже поддержан; для характеристик, у которых мало значений иногда такой способ дает плюс в качестве, пояснили в «Яндексе».

    Особенность библиотек CatBoost заключается в том, что даже сейчас, в эпоху повсеместного внедрения технологий Deep Learning, для реального производства нейронные сети подходят далеко не для всех типов задач, и в таких условиях градиент бустинг CatBoost обеспечивает более высокую производительность, устойчивость и предсказуемость с точки зрения качества конечного результата.

    Практические приложения

    CatBoost уже протестировали на сервисах «Яндекса». В рамках эксперимента он применялся для улучшения результатов поиска, ранжирования ленты рекомендаций «Яндекс.Дзен» и для расчета прогноза погоды в технологии «Метеум». Во всех случаях технология показала себя лучше «Матрикснета».

    В дальнейшем CatBoost будет работать и на других сервисах, отмечают в «Яндексе». Его использует также команда Yandex Data Factory - в своих решениях для промышленности, в частности для оптимизации расхода сырья и предсказания дефектов.

    CatBoost уже имеет опыт международного использования: этот метод машинного обучения был внедрен Европейским центром ядерных исследований (ЦЕРН) для объединения данных, полученных с разных частей детектора LHCb.

    Данные, собранные в ходе эксперимента, обрабатываются для индивидуальных столкновений с помощью CatBoost со скоростью 40 миллионов в секунду.

    Доступность CatBoost

    Для работы с CatBoost достаточно установить его на свой компьютер. Библиотека поддерживает операционные системы Linux, Windows и macOS и доступна на языках программирования Python и R.

    «Яндекс» разработал также программу визуализации CatBoost Viewer, которая позволяет следить за процессом обучения на графиках. Скачать CatBoost и CatBoost Viewer можно на GitHub .

    Исторически, искусственные нейронные сети за свою уже более чем полувековую историю испытывали как периоды стремительных взлетов и повышенного внимания общества, так и сменявшие их периоды скепсиса и равнодушия. В хорошие времена ученым и инженерам кажется, что наконец-то найдена универсальная технология, способная заменить человека в любых когнитивных задачах. Как грибы после дождя, появляются различные новые модели нейронных сетей, между их авторами, профессиональными учеными-математиками, идут напряженные споры о большей или меньшей степени биологичности предложенных ими моделей. Профессиональные ученые-биологи наблюдают эти дискуссии со стороны, периодически срываясь и восклицая «Да такого же в реальной природе не бывает!» – и без особого эффекта, поскольку нейросетевики-математики слушают биологов, как правило, только тогда, когда факты биологов согласуются с их собственными теориями. Однако, с течением времени, постепенно накапливается пул задач, на которых нейронные сети работают откровенно плохо и энтузиазм людей остывает.

    В наши дни нейронные сети снова в зените славы благодаря изобретению метода предобучения «без учителя» на основе Ограниченных Больцмановских Машин (Restricted Bolzmann Machines, RBM), что позволяет обучать глубокие нейронные сети (т.е. с экстра-большим, порядка десятков тысяч, количеством нейронов) и успехам глубоких нейронных сетей в практических задачах распознавания устной речи и изображений . К примеру, распознавание речи в Android реализовано именно на глубоких нейронных сетях. Как долго это продлится и насколько сильно глубокие нейронные сети оправдают возложенные на них ожидания – неизвестно.
    Между тем, параллельно всем научным спорам, течениям и тенденциям, отчетливо выделяется сообщество пользователей нейронных сетей – инженеров-программистов-практиков, которых интересует прикладной аспект нейросетей, их способность обучаться на собранных данных и решать задачи распознавания. Со многими практическими задачами классификации и прогнозирования великолепно справляются хорошо проработанные, относительно небольшие модели многослойных персептронов (Multilayer Perceptron, MLP) и сети радиальных базисных функций (Radial Basis Function network, RBF). Эти нейронные сети многократно описаны, я бы посоветовать следующие книжки, в порядке моей личной симпатии к ним: Осовский , Бишоп , Хайкин ; также есть хорошие курсы на Coursera и подобных ресурсах.

    Однако, что касается общего подхода использования нейронных сетей на практике, он кардинально отличается от обычного детерминированного девелоперского подхода «запрограммировал, работает – значит, работает всегда». Нейронные сети по своей природе являются вероятностными моделями, и подход к ним должен быть совершенно иной. К сожалению, многие программисты-новички технологий машинного обучения вообще и нейронных сетей в частности делают системные ошибки при работе с ними, разочаровываются и забрасывают это дело. Идея написания настоящего трактата на Хабр возникла после общения с такими разочарованными пользователями нейронных сетей – отличными, опытными, уверенными в себе программистами.

    Вот мой список правил и типичных ошибок использования нейронных сетей.

    1. Если есть возможность не использовать нейронные сети – не используйте их.
    Нейронные сети позволяют решить задачу в случае, если предложить алгоритм путем многократного (или очень многократного) просмотра данных глазами невозможно. Например, если данных много, они нелинейные, зашумленные и/или большой размерности.

    2. Сложность нейронных сетей должна быть адекватна сложности задачи.
    Современные персональные компьютеры (к примеру, Core i5, 8 GB RAM) позволяют за комфортное время обучать нейронные сети на выборках объемом в десятки тысяч примеров, с размерностью входных данных до сотни. Большие выборки – задача для упомянутых выше глубоких нейронных сетей, которые обучают на многопроцессорных GPU. Эти модели очень интересны, но находятся вне фокуса внимания настоящей хабр-статьи.

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

    4. Перемешивайте выборку.
    После того, как входные и выходные векторы данных собраны, если измерения независимы между собой – поменяйте порядок следования векторов произвольным образом. Это критично для корректного разделения выборки на Train/Test/Validation и всех методов обучения типа «пример-за-примером» («sample-by-sample»).

    5. Нормируйте и центрируйте данные.
    Для многослойных персептронов, и для многих других моделей значения входных данных должны лежать в пределах [-1;1]. Перед тем, как подавать их на нейросеть, вычтите из данных среднее и поделите все значения на максимальное значение.

    6. Делите выборку на Train, Test и Validation.
    Основная ошибка новичков – обеспечить минимальную ошибку работы нейросети на обучающей выборке, попутно адски ее переобучив и затем желать такого же хорошего качества на новых реальных данных. Это особенно легко сделать, если данных мало (или они все «из одного куска»). Результат может очень расстроить: нейросеть максимально подстроится под выборку и потеряет работоспособность на реальных данных. Для того, чтобы контролировать обобщающие способности вашей модели – разделите все данные на три выборки соотношении 70: 20: 10. Обучайтесь на Train, периодически проверяя качество модели на Test. Для финальной непредвзятой оценки – Validation.
    Техника кросс-валидации, когда Train и Test несколько раз формируется по очереди произвольным способом из одних и тех же данных, может проявить коварство и дать ложное впечатление о хорошем качестве работы системы – например, если данные взяты из разных источников и это критично. Используйте правильный Validation!

    7. Применяйте регуляризацию.
    Регуляризация – это техника, которая позволяет избежать переобучения нейросети во время обучения, даже если данных мало. Если вы обнаружили галочку с таким словом, обязательно ее ставьте. Признак переобучившейся нейросети – большие значения весов, порядка сотен и тысяч, такая нейросеть не будет нормально работать на новых, не виденных ранее, данных

    8. Не нужно дообучать нейронную сеть в режиме он-лайн.
    Идея дообучать нейросеть перманентно все время на новых поступающих данных – сама по себе правильная, в реальных биологических системах все именно так и происходит. Мы учимся каждый день и редко сходим с ума. Тем не менее, для обычных искусственных нейронных сетей на современном этапе технического развития такая практика является рискованной: сеть может переобучиться или подстроиться под самые последние поступившие данные данные – и потеряет свои обобщающие способности. Для того, чтобы систему можно было использовать на практике, нейросеть нужно: 1) обучить, 2) протестировать качество на тестовых и валидационных выборках, 3) выбрать удачный вариант сети, зафиксировать ее веса и 4) использовать обученную нейросеть на практике, веса в процессе использования не менять.

    9. Используйте новые алгоритмы обучения: Левенберга-Марквардта, BFGS, Conjugate Gradients и др.
    Я глубоко убежден, что реализовать обучение методом обратного распространения ошибки (backpropagation) – святой долг каждого, кто работает с нейронными сетями. Этот метод самый простой, относительно легко программируется и позволяет хорошо изучить процесс обучения нейронных сетей. Между тем, backpropagation был изобретен в начале 70-х и стал популярен в середине 80-х годов прошлого столетия, с тех пор появились более продвинутые методы, которые могут в разы улучшить качество обучения. Лучше используйте их.

    10. Обучайте нейронные сети в MATLAB и подобных дружественных средах.
    Если вы не ученый, разрабатывающий новые методы обучения нейронных сетей, а программист-практик, я бы не рекомендовал кодировать процедуру обучения нейронных сетей самостоятельно. Существует большое количество программных пакетов, в основном на MATLAB и Python, которые позволяют обучать нейронные сети, при этом контролировать процесс обучения и тестирования, используя удобные средства визуализации и отладки. Пользуйтесь наследием человечества! Мне лично нравится подход «обучение в MATLAB хорошей библиотекой – реализация обученной модели руками», он достаточно мощный и гибкий. Исключение – пакет STATISTICA, который содержит продвинутые методы обучения нейросетей и позволяет генерировать их в виде программного кода на С, удобного для иплементации.

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

    Желаю удачи!

    Литература

    Hinton G., Deng L., Yu D., Dahl G., Mohamed A., Jaitly N., Senior A., Vanhoucke V., Nguyen P., Sainath T. and Kingsbury B. Deep Neural Networks for Acoustic Modeling in Speech Recognition, IEEE Signal Processing Magazine, Vol. 29, No. 6, 2012, pp. 82 – 97.
    Ciresan D., Meier U., Masci J and Schmidhuber J. Multi-column Deep Neural Network for Traffic Sign Classification. Neural Networks, Vol. 34, August 2012, pp. 333 – 338
    С. Осовский. Нейронные сети для обработки информации – пер. с польского. М.: Финансы и статистика, 2002. – 344с.
    Bishop C.M. Pattern Recognition and Machine Learning. Springer, 2006 – 738 p.
    С. Хайкин. Нейронные сети: полный курс. Вильямс, 2006.