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

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

В наши дни нейронные сети снова в зените славы благодаря изобретению метода предобучения «без учителя» на основе Ограниченных Больцмановских Машин (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.

«Яндекс» внедрил новый алгоритм поиска на основе нейронных сетей. По мнению экспертов, это должно помочь компании увеличить на российском рынке отрыв от основного конкурента - Google

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

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

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

По словам представителей сервиса, нейросеть способна самообучаться, поэтому чем больше пользователи ищут в поисковике, тем точнее будут результаты. Для обкатки будет использоваться открытая краудсорсинговая платформа «​Яндекс.Толока», запущенная в 2014 году. По сути, это сервис, где любой желающий может участвовать в тестировании продуктов «Яндекса», давать им оценки и оставлять замечания. Компании это позволяет улучшать свои услуги, а пользователи получают за это денежные вознаграждения. Сейчас в «Яндекс.Толоке» зарегистрированы более 1 млн пользователей.

«Проблема нейросетей состояла в том, что они очень медленные и их нельзя было использовать в работе с огромными массивами текста в режиме реального времени, — говорит основатель и управляющий партнер компании «Ашманов и партнеры» Игорь Ашманов. — Если «Яндекс» реально смог привлечь нейросети к индексированию всего объема Рунета — это интересно, это довольно серьезный прорыв с технологической точки зрения». Насколько новый алгоритм улучшит качество поиска и улучшит ли его в принципе, еще предстоит проанализировать, отметил Ашманов.

Основной конкурент «Яндекса» Google, по словам главы «Ашманов и партнеры», пока официально не объявляла о внедрении нейросетей в алгоритмы своего поиска. «Google может себе позволить настраивать факторы ранжирования по-другому и дольше экспериментировать в этой области, не внедряя новые технологии в поиск, просто потому, что у компании больше программистов и ресурсов», — отметил эксперт.​


Догнать и перегнать

По словам аналитика «ВТБ Капитала» Владимира Беспалова, новая версия российского поисковика — шаг по удержанию доли «Яндекса» на рынке. «Обновленное мобильное приложение «Поиска», новый алгоритм поисковика — все это должно помочь «Яндексу» стабилизировать и увеличивать свою долю на рынке поиска, — говорит эксперт. — Эффект будет ощутим не сразу, но снижение поисковых запросов в долгосрочной перспективе может менее благоприятно сказаться на будущих показателях. Поиск — главный продукт «Яндекса», основной доход компании — это реклама, которая привязана к поиску».

Удерживать свои позиции в мобильном поиске «Яндексу» может помочь решение ФАС, напоминает Беспалов. В апреле этого года ведомство заключило мировое соглашение с главным конкурентом российской компании на поисковом рынке — Google. Согласно ему американский интернет-гигант пересмотрит соглашения с производителями смартфонов на Android в России и позволит пользователям выбирать в качестве основных на своих устройствах альтернативные Google поисковые сервисы.

По итогам второго квартала этого года доля «Яндекса» на рынке поиска в России составила 54,3%, как сообщала Yandex N.V. (головная компания «Яндекса») в своем финансовом отчете со ссылкой на собственный сервис аналитики «Яндекс.Радар». На 31 июля, по данным «Яндекс.Радар», Google занимал 40,36% среди поисковых систем в России. По данным LiveInternet, в среднем за последние три месяца среди поисковиков «Яндекс» лидировал с долей 51,1%, у Google было 43,9%. Yandex N.V. не раскрывает выручку от поиска, но направление «поиск и портал» принесло компании 20,135 млрд руб., что на 22% больше, чем за аналогичный период 2016 года.

«Предыдущая революционная версия поиска «Матрикснет» позволила «Яндексу» оторваться от Google и нарастить свою долю почти на 10 п.п. за полгода. Это наглядный пример того, как применение прорывных технологий приводит к очевидным бизнес-результатам даже на таком сложном рынке, как поисковый», — считает управляющий партнер онлайн-школы Skyeng и бывший директор по международному развитию «Яндекса» Александр Ларьяновский.

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

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

Шаг 1. Нейроны и метод прямого распространения

Так что же такое «нейронная сеть»? Давайте подождём с этим и сперва разберёмся с одним нейроном.

Нейрон похож на функцию: он принимает на вход несколько значений и возвращает одно.

Круг ниже обозначает искусственный нейрон. Он получает 5 и возвращает 1. Ввод - это сумма трёх соединённых с нейроном синапсов (три стрелки слева).

В левой части картинки мы видим 2 входных значения (зелёного цвета) и смещение (выделено коричневым цветом).

Входные данные могут быть численными представлениями двух разных свойств. Например, при создании спам-фильтра они могли бы означать наличие более чем одного слова, написанного ЗАГЛАВНЫМИ БУКВАМИ, и наличие слова «виагра».

Входные значения умножаются на свои так называемые «веса», 7 и 3 (выделено синим).

Теперь мы складываем полученные значения со смещением и получаем число, в нашем случае 5 (выделено красным). Это - ввод нашего искусственного нейрона.

Потом нейрон производит какое-то вычисление и выдает выходное значение. Мы получили 1, т.к. округлённое значение сигмоиды в точке 5 равно 1 (более подробно об этой функции поговорим позже).

Если бы это был спам-фильтр, факт вывода 1 означал бы то, что текст был помечен нейроном как спам.

Иллюстрация нейронной сети с Википедии.

Если вы объедините эти нейроны, то получите прямо распространяющуюся нейронную сеть - процесс идёт от ввода к выводу, через нейроны, соединённые синапсами, как на картинке слева.

Шаг 2. Сигмоида

После того, как вы посмотрели уроки от Welch Labs, хорошей идеей было бы ознакомиться с четвертой неделей курса по машинному обучению от Coursera , посвящённой нейронным сетям - она поможет разобраться в принципах их работы. Курс сильно углубляется в математику и основан на Octave, а я предпочитаю Python. Из-за этого я пропустил упражнения и почерпнул все необходимые знания из видео.

Сигмоида просто-напросто отображает ваше значение (по горизонтальной оси) на отрезок от 0 до 1.

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

Но на одних видео далеко не уедешь. Для полного понимания я решил закодить её самостоятельно. Поэтому я начал писать реализацию алгоритма логистической регрессии (который использует сигмоиду).

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

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

Шаг 3. Метод обратного распространения ошибки

Понять принцип работы нейронной сети от ввода до вывода не так уж и сложно. Гораздо сложнее понять, как нейронная сеть обучается на наборах данных. Использованный мной принцип называется

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 .

Кручинин Дмитрий, Долотов Евгений, Кустикова Валентина, Дружков Павел, Корняков Кирилл

Введение

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

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

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

В статье представлен краткий обзор инструментов проектирования и обучения нейросетевых моделей. Основное внимание уделено четырем библиотекам: Caffe , Pylearn2 , Torch и Theano . Рассматриваются базовые возможности указанных библиотек, приводятся примеры их использования. Сравнивается качество и скорость работы библиотек при конструировании одинаковых топологий нейросетей для решения задачи классификации рукописных цифр (в качестве обучающей и тестовой выборки используется датасет MNIST). Также делается попытка дать оценку удобства применения рассматриваемых библиотек на практике.

Набор данных MNIST

Далее в качестве исследуемого набора данных будет использоваться база изображений рукописных цифр MNIST (). Изображения в данной базе имеют разрешение 28x28 и хранятся в формате оттенков серого. Цифры отцентрированы на изображении. Вся база разбита на две части: тренировочную, состоящую из 50000 изображений, и тестовую - 10000 изображений.

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

Существует множество программных средств для решения задач глубокого обучения. В можно найти общее сравнение функциональных возможностей наиболее известных, здесь приведем общую информацию о некоторых из них (). Первые шесть программных библиотек реализуют наиболее широкий спектр методов глубокого обучения. Разработчики предоставляют возможности для создания полностью связанных нейросетей (fully connected neural network, FC NN ), сверточных нейронных сетей (convolutional neural network, CNN) , автокодировщиков (autoencoder, AE) и ограниченных машин Больцмана (restricted Boltzmann machine, RBM) . Необходимо обратить внимание на оставшиеся библиотеки. Несмотря на то, что они обладают меньшей функциональностью, в некоторых случаях их простота помогает достичь большей производительности.

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

# Название Язык OC FC NN CNN AE RBM
1 DeepLearnToolbox Matlab Windows, Linux + + + +
2 Theano Python Windows, Linux, Mac + + + +
3 Pylearn2 Python Linux, Vagrant + + + +
4 Deepnet Python Linux + + + +
5 Deepmat Matlab ? + + + +
6 Torch Lua, C Linux, Mac OS X, iOS, Android + + + +
7 Darch R Windows, Linux + - + +
8 Caff e C++, Python, Matlab Linux, OS X + + - -
9 nnForge С++ Linux + + - -
10 CXXNET С++ Linux + + - -
11 Cuda-convnet С++ Linux, Windows + + - -
12 Cuda CNN Matlab Linux, Windows + + - -

Основываясь на приведенной в информации и рекомендациях специалистов, для дальнейшего рассмотрения выбраны четыре библиотеки: , - одни из самых зрелых и функционально полных библиотек, и - широко используемые сообществом. Каждая библиотека рассматривается по следующему плану:
  1. Краткая справочная информация.
  2. Технические особенности (ОС, язык программирования, зависимости).
  3. Функциональные возможности.
  4. Пример формирования сети типа логистическая регрессия.
  5. Обучение и использование построенной модели для классификации.
После рассмотрения перечисленных библиотек проводится их сравнение на ряде тестовых конфигураций сетей.

Библиотека Caffe



Разработка Caffe ведется с сентября 2013 г. Начало разработки положил Yangqing Jia во время его обучения в калифорнийском университете в Беркли. С указанного момента Caffe активно поддерживается Центром Зрения и Обучения Беркли (The Berkeley Vision and Learning Center, BVLC) и сообществом разработчиков на GitHub . Библиотека распространяется под лицензией BSD 2-Clause.

Caffe реализована с использованием языка программирования C++, имеются обертки на Python и MATLAB. Официально поддерживаемые операционные системы - Linux и OS X, также имеется неофициальный порт на Windows . Caffe использует библиотеку BLAS (ATLAS, Intel MKL, OpenBLAS) для векторных и матричных вычислений. Наряду с этим, в число внешних зависимостей входят glog, gflags, OpenCV, protoBuf, boost, leveldb, nappy, hdf5, lmdb. Для ускорения вычислений Caffe может быть запущена на GPU с использованием базовых возможностей технологии CUDA или библиотеки примитивов глубокого обучения cuDNN .

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

  • DATA - определяет слой данных в формате leveldb и lmdb.
  • HDF5_DATA - слой данных в формате hdf5.
  • IMAGE_DATA - простой формат, который предполагает, что в файле приведен список изображений с указанием метки класса.
  • и другие.
Преобразования могут быть заданы с помощью слоев:
  • INNER_PRODUCT - полностью связанный слой.
  • CONVOLUTION - сверточный слой.
  • POOLING - слой пространственного объединения.
  • Local Response Normalization (LRN) - слой локальной нормализации.
Наряду с этим, при формировании преобразований могут использоваться различные функции активации.
  • Положительная часть (Rectified-Linear Unit, ReLU).
  • Сигмоидальная функция (SIGMOID).
  • Гиперболический тангенс (TANH).
  • Абсолютное значение (ABSVAL).
  • Возведение в степень (POWER).
  • Функция биноминального нормального логарифмического правдоподобия (binomial normal log likelihood, BNLL).
Последний слой нейросетевой модели должен содержать функцию ошибки. В библиотеке имеются следующие функции:
  • Среднеквадратичная ошибка (Mean-Square Error, MSE).
  • Краевая ошибка (Hinge loss).
  • Логистическая функция ошибки (Logistic loss).
  • Функция прироста информации (Info gain loss).
  • Сигмоидальная кросс-энтропия (Sigmoid cross entropy loss).
  • Softmax-функция. Обобщает сигмоидальную кросс-энтропию на случай количества классов больше двух.
В процессе обучения моделей применяются различные методы оптимизации. Разработчики Caffe предоставляют реализацию ряда методов:

В библиотеке Caffe топология нейросетей, исходные данные и способ обучения задаются с помощью конфигурационных файлов в формате prototxt. Файл содержит описание входных данных (тренировочных и тестовых) и слоев нейронной сети. Рассмотрим этапы построения таких файлов на примере сети “логистическая регрессия” (). Далее будем считать, что файл называется linear_regression.prototxt, и он размещается в директории examples/mnist.
Рис. 2. Структура нейронной сети

Библиотека Pylearn2


Pylearn2 - библиотека, разрабатываемая в лаборатории LISA в университете Монреаля с февраля 2011 года. Имеет около 100 разработчиков на GitHub . Библиотека распространяется под лицензией BSD 3-Clause.

Pylearn2 реализована на языке Python, в настоящее время поддерживается операционная система Linux, также возможен запуск на любой операционной системе с использованием виртуальной машины, т.к. разработчики предоставляют сконфигурированную обертку виртуальной среды на базе Vagrant. Pylearn2 является надстройкой над библиотекой Theano . Дополнительно требуются PyYAML, PIL. Для ускорения вычислений Pylearn2 и Theano используют Cuda-convnet , которая реализована на C++/CUDA, что дает значительный прирост в скорости.

В Pylearn2 поддерживается возможность создания полностью связанных и сверточных нейросетей, различных видов автокодировщиков (Contractive Auto-Encoders, Denoising Auto-Encoders) и ограниченных машин Больцмана (Gaussian RBM, the spike-and-slab RBM). Предусмотрены несколько функций ошибки: кросс-энтропия (cross-entropy), логарифмическое правдоподобие (log-likelihood). Имеются следующие методы обучения:

  • Пакетный градиентный спуск (Batch Gradient Descent, BGD).
  • Стохастический градиентный спуск (Stochastic Gradient Descent, SGD).
  • Нелинейный метод сопряженных градиентов (Nonlinear conjugate gradient descent, NCG).
В библиотеке Pylearn2 нейросети задаются с помощью их описания в конфигурационном файле в формате YAML. YAML-файлы являются удобным и быстрым способом сериализации объектов, так как она разработана с использованием методов объектно-ориентированного программирования.

Библиотека Torch


Torch - библиотека для научных вычислений с широкой поддержкой алгоритмов машинного обучения. Разрабатывается Idiap Research Institute , New York University и NEC Laboratories America , начиная с 2000г., распространяется под лицензией BSD.

Библиотека реализована на языке Lua с использованием C и CUDA. Быстрый скриптовый язык Lua в совокупности с технологиями SSE, OpenMP, CUDA позволяют Torch показывать неплохую скорость по сравнению с другими библиотеками. На данный момент поддерживаются операционные системы Linux, FreeBSD, Mac OS X. Основные модули также работают и на Windows. В зависимостях Torch находятся пакеты imagemagick, gnuplot, nodejs, npm и другие.

Библиотека состоит из набора модулей, каждый из которых отвечает за различные стадии работы с нейросетями. Так, например, модуль nn обеспечивает конфигурирование нейросети (определению слоев, и их параметров), модуль optim содержит реализации различных методов оптимизации, применяемых для обучения, а gnuplot предоставляет возможность визуализации данных (построение графиков, показ изображений и т.д.). Установка дополнительных модулей позволяет расширить функционал библиотеки.

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

  • Полносвязный слой (Linear).
  • Функции активации: гиперболический тангенс (Tanh), выбор минимального (Min) или максимального (Max), softmax-функция (SoftMax) и другие.
  • Сверточные слои: свертка (Convolution), прореживание (SubSampling), пространственное объединение (MaxPooling, AveragePooling, LPPooling), разностная нормализация (SubtractiveNormalization).
Функции ошибки: средне-квадратичная ошибка (MSE), кросс-энтропия (CrossEntropy) и т.д.

При обучении могут использоваться следующие методы оптимизации:

Рассмотрим процесс конфигурирования нейронной сети в Torch. Сначала необходимо объявить контейнер, затем добавить в него слои. Порядок добавления слоев важен, т.к. выход (n-1)-го слоя будет входом n-го.
regression = nn.Sequential() regression:add(nn.Linear(784,10)) regression:add(nn.SoftMax()) loss = nn.ClassNLLCriterion()
Использование и обучение нейросети:

  1. Загрузка входных данных X. Функция torch.load(path_to_ready_dset) позволяет загрузить подготовленный заранее датасет в текстовом или бинарном формате. Как правило, это Lua-таблица состоящая из трёх полей: размер, данные и метки. В случае если готового датасета нет, можно воспользоваться стандартными функциями языка Lua (например, io.open(filename [, mode])) или функциями из пакетов библиотеки Torch (например, image.loadJPG(filename)).
  2. Определение ответа сети для входных данных X:
    Y = regression:forward(X)
  3. Вычисление функции ошибки E = loss(Y,T), в нашем случае это функция правдоподобия.
    E = loss:forward(Y,T)
  4. Просчет градиентов согласно алгоритму обратного распространения.
    dE_dY = loss:backward(Y,T) regression:backward(X,dE_dY)
Теперь соберем все воедино. Для того чтобы обучить нейросеть в библиотеке Torch, необходимо написать собственный цикл обучения. В нем объявить специальную функцию (замыкание), которая будет вычислять ответ сети, определять величину ошибки и пересчитывать градиенты, и передать это замыкание в функцию градиентного спуска для обновления весов сети.
-- Создаём специальные переменные: веса нейросети и их градиенты w, dE_dw = regression:getParameters() local eval_E = function(w) dE_dw:zero() -- Обновляем градиенты local Y = regression:forward(X) local E = loss:forward(Y,T) local dE_dY = loss:backward(Y,T) regression:backward(X,dE_dY) return E, dE_dw end -- Затем в цикле обучения вызываем optim.sgd(eval_E, w, optimState)
где optimState - параметры градиентного спуска (learningRate, momentum, weightDecay и пр.). Полностью цикл обучения можно посмотреть .

Несложно видеть, что процедура объявления, как и процедура обучения, занимает менее 10 строк кода, что говорит о простоте использования библиотеки. При этом библиотека позволяет работать с нейросетями на достаточно низком уровне.

Сохранение и загрузка натренированной сети осуществляется с помощью специальных функций:
torch.save(path, regression) net = torch.load(path)
После загрузки сеть может быть использована для классификации или дополнительной тренировки. Если необходимо узнать, к какому классу принадлежит элемент sample, то достаточно выполнить проход по сети и вычислить выход:
result = net:forward(sample)
Более сложные примеры можно найти в обучающих материалах к библиотеке .

Библиотека Theano


Theano - это расширение языка Python, позволяющее эффективно вычислять математические выражения, содержащие многомерные массивы. Библиотека получила свое название в честь имени жены древнегреческого философа и математика Пифагора - Феано (или Теано). Theano разработана в лаборатории LISA для поддержки быстрой разработки алгоритмов машинного обучения.

Библиотека реализована на языке Python, поддерживается на операционных системах Windows, Linux и Mac OS. В состав Theano входит компилятор, который переводит математические выражения, написанные на языке Python в эффективный код на C или CUDA.

Theano предоставляет базовый набор инструментов для конфигурации нейросетей и их обучения. Возможна реализация многослойных полностью связанных сетей (Multi-Layer Perceptron), сверточных нейросетей (CNN), рекуррентных нейронных сетей (Recurrent Neural Networks, RNN), автокодировщиков и ограниченных машин Больцмана. Также предусмотрены различные функции активации, в частности, сигмоидальная, softmax-функция, кросс-энтропия. В ходе обучения используется пакетный градиентный спуск (Batch SGD).

Рассмотрим конфигурацию нейросети в Theano. Для удобства реализуем класс LogisticRegression (), в котором будут содержаться переменные - обучаемые параметры W, b и функции для работы с ними - подсчет ответа сети (y = softmax(Wx + b)) и функция ошибки. Затем для тренировки нейросети создаем функцию train_model. Для нее необходимо описать методы, определяющие функцию ошибки, правило вычисления градиентов, способ изменения весов нейросети, размер и местоположение mini-batch выборки (сами изображения и ответы для них). После определения всех параметров функция компилируется и передается в цикл обучения.


Рис. 3. Схема класса для реализации нейронной сети в Theano

Программная реализация класса

class LogisticRegression(object): def __init__(self, input, n_in, n_out): # y = W * x + b # объявляем переменные, определяем тип, количество входов и выходов self.W = theano.shared(# инициализируем начальные веса нулями value=numpy.zeros((n_in, n_out), dtype=theano.config.floatX), name="W", borrow=True) self.b = theano.shared(value=numpy.zeros((n_out,), dtype=theano.config.floatX), name="b", borrow=True) # добавляем функцию активации softmax, выход сети - переменная y_pred self.p_y_given_x = T.nnet.softmax(T.dot(input, self.W) + self.b) self.y_pred = T.argmax(self.p_y_given_x, axis=1) self.params = # определяем функцию ошибки def negative_log_likelihood(self, y): return -T.mean(T.log(self.p_y_given_x)) # x - подается на вход сети # набор изображений (minibatch) располагается по строкам в матрице x # y - ответ сети на каждый семпл x = T.matrix("x") y = T.ivector("y") # создаем модель логистической регрессии каждое MNIST изображение имеет размер 28*28 classifier = LogisticRegression(input=x, n_in=28 * 28, n_out=10) # значение функции ошибки, которое мы пытаемся минимизировать в течение обучения cost = classifier.negative_log_likelihood(y) # чтобы посчитать градиенты, необходимо вызвать функцию Theano - grad g_W = T.grad(cost=cost, wrt=classifier.W) g_b = T.grad(cost=cost, wrt=classifier.b) # определяем правила обновления весов нейросети updates = [(classifier.W, classifier.W - learning_rate * g_W), (classifier.b, classifier.b - learning_rate * g_b)] # компилируем функцию тренировки, в дальнейшем она будет вызываться в цикле обучения train_model = theano.function(inputs=, outputs=cost, updates=updates, givens={ x: train_set_x, y: train_set_y })


Для быстрого сохранения и загрузки параметров нейросети можно использовать функции из пакета cPickle:
import cPickle save_file = open("path", "wb") cPickle.dump(classifier.W.get_value(borrow=True), save_file, -1) cPickle.dump(classifier.b.get_value(borrow=True), save_file, -1) save_file.close() file = open("path") classifier.W.set_value(cPickle.load(save_file), borrow=True) classifier.b.set_value(cPickle.load(save_file), borrow=True)
Несложно видеть, что процесс создания модели и определения ее параметров требует написания объемного и шумного кода. Библиотека является низкоуровневой. Нельзя не отметить ее гибкость, а также наличие возможности реализации и использования собственных компонент. На официальном сайте библиотеки имеется большое количество обучающих материалов на разные темы.

Сравнение библиотек на примере задачи классификации рукописных цифр

Тестовая инфраструктура

В ходе экспериментов по оценке производительности библиотек использована следующая тестовая инфраструктура:
  1. Ubuntu 12.04, Intel Core i5-3210M @ 2.5GHz (CPU эксперименты).
  2. Ubuntu 14.04, Intel Core i5-2430M @ 2.4GHz + NVIDIA GeForce GT 540M (GPU эксперименты).
  3. GCC 4.8, NVCC 6.5.

Топологии сетей и параметры обучения

Вычислительные эксперименты проводились на полносвязной и сверточной нейронных сетях следующей структуры:

Все веса инициализировались случайным образом согласно равномерному закону распределения в диапазоне (−6/(n_in + n_out), 6/(n_in + n_out)), где n_in, n_out – количество нейронов на входе и выходе слоя соответственно. Параметры стохастического градиентного спуска (SGD) выбраны, равными следующим значениям: learning rate - 0.01, momentum - 0.9, weight decay - 5e-4, batch size - 128, максимальное число итераций - 150.

Результаты экспериментов

Время обучения нейронных сетей, описанных ранее ( , ) с помощью четырех рассмотренных библиотек, представлено ниже (

Понравилась статья? Поделиться с друзьями: