библиотека машинного обучения yandex

Путь, который занял 100* лет: встречаем CatBoost 1.0.0

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

Всем привет. Меня зовут Станислав Кириллов, я работаю в команде, которая отвечает за развитие библиотеки машинного обучения CatBoost. Мы впервые поделились ей с сообществом четыре года назад — хотя мы привыкли строить бинарные деревья, поэтому и отсчёт лет предпочитаем вести так же. Это шутка, конечно, но «столетие» — хороший повод для выпуска первой «production ready» версии библиотеки с символичным номером 1.0.0.

Сегодня я кратко отвечу, почему мы считаем выпуск версии 1.0.0 важной вехой, и подсвечу главные изменения (и в новой версии, и в целом за год). А уже завтра выступлю с рассказом на встрече, которая будет целиком и полностью посвящена практике применения CatBoost и противостоянию нейросетей и градиентного бустинга. Если эти слова для вас что-то значат, то добро пожаловать под кат.

CatBoost — это метод машинного обучения, который основан на градиентном бустинге и разработан нами так, чтобы одинаково хорошо работать «из коробки» как с числовыми признаками, так и с категориальными (отсюда и название — ни один котик при разработке не пострадал). Мы изначально создавали его как библиотеку для применения в сервисах Яндекса, отсюда характерные для большой компании требования. К примеру, у наших сервисов всегда высокие нагрузки, поэтому скорость инференса модели критична для CatBoost.

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

Начинали мы с малого. Несколько лет назад даже в Яндексе область применения библиотеки была небольшой. Сейчас CatBoost применяется в большинстве наших сервисов: от ранжирования и рекомендаций музыки до прогнозирования осадков и беспилотных автомобилей. Во внешнем мире мы не только накопили 6 тысяч звёздочек на гитхабе (что тоже немало), но и встречаем CatBoost в проектах сторонних компаний, таких как Авито, Ламода, Сбер, Cloudflare.

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex
Просто снимок главной сцены WWDC 2018

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

Быстрее, ещё быстрее

Все 4 года, что CatBoost находится в открытом доступе, мы не перестаём ускорять обучение. На графике ниже как раз пример такого прогресса за 2,5 года на примере датасета higgs при обучении 100 деревьев в 28 потоков.

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

В релизе 1.0.0 мы ускоряем время обучения в режиме бинарной классификации на CPU от 15% до 35%. Помимо этого, с марта 2020 года до текущего релиза мы ускорили CatBoost в 1,7 раза. Это были как алгоритмические, так и технические ускорения. Например, при помощи команды разработчиков из Intel мы улучшили масштабирование по потокам и тем самым ускорили обучение CatBoost на машинах со 128-ю ядрами почти в 2 раза.

Распределённое обучение на терабайтах данных

Когда мы говорим про обучение на больших данных на кластерах, первая технология, которая приходит на ум, — Apache Spark. На самом деле возможность распределённого обучения была доступна в CatBoost ещё с 2018 года, но пользоваться ей было не очень привычно и удобно. Поэтому возможность запуска распределённого обучения с помощью привычных интерфейсов, таких как Apache Spark, была одной из самых запрашиваемых функций.

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

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

CPU vs GPU

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

В частности, мы поддержали:

Открытая документация

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

Но это ещё не финал. Впереди у нас большая работа по актуализации и внесению неописанных фич.

Multilabel-классификация

Появился режим multilabel-классификации. Представьте, что у ваших объектов есть возможный набор меток, каждому объекту может быть проставлено несколько таких меток, и вам нужно по объекту предсказывать, какие метки ему проставлены. В CatBoost 1.0.0 мы ввели такую фичу — например, она может быть полезна в поведенческом анализе для предсказания возможных характеристик объекта.

R — на полпути в CRAN

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

Сейчас наша цель — появление CatBoost в библиотеке пакетов CRAN. На пути к этому мы уже починили бóльшую часть проблем, но, к сожалению, успели сделать не всё. Здесь мы очень ждём помощи контрибьюторов, которым небезразлична судьба R.

С одной стороны, версия 1.0.0 — важный этап для всего проекта. А с другой, хочется верить, что это лишь начало длинного и интересного пути.

Источник

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

Интернет, 18 июля 2017 года. Яндекс разработал новый метод машинного обучения CatBoost. Он позволяет эффективно обучать модели на разнородных данных — таких как местонахождение пользователя, история операций и тип устройства. Библиотека машинного обучения CatBoost выложена в открытый доступ, её могут использовать все желающие.

CatBoost — это наследник метода машинного обучения Матрикcнет, который применяется почти во всех сервисах Яндекса. Как и Матрикснет, CatBoost задействует механизм градиентного бустинга: он хорошо подходит для работы с разнородными данными. Но если Матрикснет обучает модели на числовых данных, то CatBoost учитывает и нечисловые, например виды облаков или типы зданий. Раньше такие данные приходилось переводить на язык цифр, что могло изменить их суть и повлиять на точность работы модели. Теперь их можно использовать в первоначальном виде. Благодаря этому CatBoost показывает более высокое качество обучения, чем аналогичные методы для работы с разнородными данными. Его можно применять в самых разных областях — от банковской сферы до промышленности.

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

Новый метод уже протестировали на сервисах Яндекса. В рамках эксперимента он применялся для улучшения результатов поиска, ранжирования ленты рекомендаций Яндекс.Дзен и для расчёта прогноза погоды в технологии Метеум — и во всех случаях показал себя лучше Матрикснета. В дальнейшем CatBoost будет работать и на других сервисах. Его использует также команда Yandex Data Factory — в своих решениях для промышленности, в частности для оптимизации расхода сырья и предсказания дефектов. Кроме того, CatBoost внедрил Европейский центр ядерных исследований (ЦЕРН): он использует его для объединения данных, полученных с разных частей детектора LHCb.

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

Источник

CatBoost от Яндекса. Разбираемся.

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

CatBoost — открытая программная библиотека разработанная компанией Яндекс и реализующая уникальный патентованный алгоритм построения моделей машинного обучения, использующий одну из оригинальных схем градиентного бустинга (перевод — улучшение). Основное API для работы с библиотекой реализовано для языка Python, также существует реализация для языка программирования R.

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

Матрикcнет

CatBoost

Компания «Яндекс» разработала и первая среди российских компаний открыла для всех пользователей систему машинного обучения CatBoost. Она уже используется для обработки данных Большого адронного коллайдера в рамках сотрудничества с Европейской организацией по ядерным исследованиям (ЦЕРН).

CatBoost доступна для 64-разрядных операционных систем Linux, macOS и Windows. В ОС macOSдля ускорения работы используется оригинальный фреймворк Core ML — созданный Apple для методов машинного обучения.

Применение CatBoost

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

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

«Яндекс» пока не планирует зарабатывать на Catboost, он бесплатен для всех пользователей.

Компании выкладывают свой продукт в открытый доступ для создания сообщества и экосистемы вокруг разработки, авторитета среди разработчиков и популяризации компании. Любое упоминание об использовании Catboost в, например, конкурсах kaggle — плюс к репутации «Яндекса» как технологической компании.

Яндекс.Спеллер использует CatBoost

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

Чтобы обнаруживать ошибки и подбирать замены, Спеллер использует библиотеку машинного обучения CatBoost. Благодаря CatBoost он может расшифровывать искажённые до неузнаваемости слова («адникасниеи» → «одноклассники») и учитывать контекст при поиске опечаток («скучать музыку» → «скачать музыку»). Кроме того, Спеллер не придирается к новым словам, ещё не попавшим в словари.

Что CatBoost значит для SEO?

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

Во-вторых, манипулировать выдачей (читай: продвигать сайт) станет сложнее. CatBoost рассчитан на то, чтобы максимально персонализироваться под интересы конкретного пользователя — а любая персонализация вызывает у веб-мастера приступы головной боли.

«CatBoost» расшифровывается как «категориальный бустинг». Никакокого отношения к котятам название новой технологии не имеет, и в своем блоге Яндекс хорошо дает об этом понять:

Если „Матрикснет“ обучает модели на числовых данных, то CatBoost учитывает и нечисловые, например виды облаков или типы зданий. Раньше такие данные приходилось переводить на язык цифр, что могло изменить их суть и повлиять на точность работы модели. Теперь их можно использовать в первоначальном виде.Благодаря этому CatBoost показывает более высокое качество обучения, чем аналогичные методы для работы с разнородными данными. Его можно применять в самых разных областях — от банковской сферы до промышленности.

CatBoost п ример использования

CatBoost пример кода

Больше примеров кода можно найти на сайте библиотеки CatBoost.

Источник

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

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

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

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. Яндекс разработал также программу визуализации CatBoost Viewer, которая позволяет следить за процессом обучения на графиках.

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

Более подробно все описано в нашей документации.

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

Источник

Введение в разработку CatBoost. Доклад Яндекса

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

— CatBoost у нас живет на GitHub под лицензией Apache 2.0, то есть открыт и бесплатен для всех. Проект активно развивается, сейчас у нашего репозитория больше четырех тысяч звездочек. CatBoost написан на C++, это библиотека для градиентного бустинга на деревьях решений. В ней поддержано несколько видов деревьев, в том числе так называемые «симметричные» деревья, которые используются в библиотеке по умолчанию.

В чем профит наших oblivious-деревьев? Они быстро учатся, быстро применяются и помогают обучению быть более устойчивым к изменению параметров с точки зрения изменений итогового качества модели, что сильно уменьшает необходимость в подборе параметров. Наша библиотека — про то, чтобы было удобно использовать в продакшене, быстро учиться и сразу получать хорошее качество.

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

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

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

Как происходит процесс обучения в CatBoost? Расскажу, как это устроено с точки зрения кода. Сначала мы парсим параметры обучения, которые передает пользователь, валидируем их и дальше смотрим, нужно ли нам загружать данные. Потому что данные уже могут быть загружены — например, в Python или R. Далее мы загружаем данные и строим сетку из бордеров с целью квантизовать численные фичи. Это нужно, чтобы делать обучение быстрым.

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

Дальше мы запускаем непосредственно training loop — главный цикл нашего машинного обучения, где мы итеративно строим деревья. После этого цикла происходит экспорт модели.

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

Сам цикл обучения состоит из четырех пунктов. Первый — мы пытаемся построить одно дерево. Дальше смотрим, какой прирост или убыль качества оно дает. Потом проверяем, не сработал ли наш детектор переобучения. Далее мы, если пришло время, сохраняем снэпшот.

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

Обучение одного дерева — это цикл по уровням дерева. В самом начале мы случайным образом выбираем перестановку данных, если у нас используется ordered boosting или имеются категориальные фичи. Затем мы подсчитываем на этой перестановке счетчики. Дальше мы пытаемся жадным образом подобрать хорошие сплиты в этом дереве. Под сплитами мы понимаем просто некие бинарные условия: такая-то числовая фича больше такого-то значения, либо такой-то счетчик по категориальной фиче больше такого-то значения.

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

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

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

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

Очень сложно выделить какое-то одно место, в котором происходит обучение, так что на этом слайде — его можно использовать как некоторую точку входа — перечислены основные файлы, которые у нас применяются для обучения. Это greedy_tensor_search, в котором у нас живет сама процедура жадного подбора сплитов. Это train.cpp, где у нас находится главная фабрика CPU-обучения. Это aprox_calcer, где лежат функции обновления значений в листьях. А также score_calcer — функция оценки какого-то кандидата.

Не менее важные части — catboost.pyx и core.py. Это код питоновской обертки, скорее всего, многие из вас будут внедрять какие-то вещи в питоновскую обертку. Наша питоновская обертка написана на Cython, Cython транслируется в C++, так что этот код должен быть быстрым.

Наша R-обертка лежит в папке R-package. Возможно, кому-то придется добавлять или исправлять какие-то опции, для опций у нас есть отдельная библиотека — catboost/libs/options.

Мы пришли из Arcadia в GitHub, поэтому у нас есть много интересных артефактов, с которыми вам придется столкнуться.

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

Начнем со структуры репозитория. У нас есть папка util, где лежат базовые примитивы: вектора, мапы, файловые системы, работа со строками, потоки.

У нас есть library, где лежат библиотеки общего пользования, которыми пользуются в Яндексе, — многие, не только CatBoost.

Папка CatBoost и contrib — это код сторонних библиотек, с которыми мы линкуемся.

Давайте теперь поговорим про примитивы C++, с которыми вам придется столкнуться. Первое — умные указатели. В Яндексе у нас со времен std::unique_ptr используется THolder, а вместо std::make_unique используется MakeHolder.

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

У нас есть свой SharedPtr. Причем он существует в двух ипостасях, SimpleSharedPtr и AtomicSharedPtr, которые отличаются типом счетчика. В одном случае он атомарный, это значит, что объектом могут владеть как будто бы несколько потоков. Так будет безопасно с точки зрения передачи между потоками.

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

Также у нас своя система для ввода и вывода. IInputStream и IOutputStream — это интерфейсы для ввода и вывода. У них есть полезные методы, такие как ReadTo, ReadLine, ReadAll, в общем, всё, что можно ожидать от InputStreams. И у нас есть реализации этих стримов для работы с консолью: Cin, Cout, Cerr и отдельно Endl, который похож на std::endl, то есть он флашит поток.

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

Еще у нас есть свои реализации интерфейсов для файлов: TInputFile, TOutputFile. Это буферизованное чтение. Они реализуют буферизованное чтение и буферизованную запись в файл, поэтому можно ими пользоваться.

У util/system/fs.h есть методы NFs::Exists и NFs::Copy, если вдруг вам что-то понадобится скопировать или проверить, что какой-то файл действительно существует.

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

У нас свои контейнеры. Они довольно давно переехали на использование std::vector, то есть они просто наследуются от std::vector, std::set и std::map, но у нас есть и свои THashMap и THashSet, у которых отчасти интерфейсы совместимы с unordered_map и unordered_set. Но для некоторых задач они оказались быстрее, поэтому они у нас до сих пор используются.

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

Ссылки на массивы — аналог std::span из C++. Правда, появился он у нас не в двадцатом году, а сильно раньше. Мы его активно используем, чтобы передавать ссылки на массивы, как будто бы аллоцированные на больших буферах, чтобы не аллоцировать временные буферы каждый раз. Допустим, для подсчета производных или каких-то аппроксов мы можем выделять память на каком-то предаллоцированном большом буфере и передавать функцию подсчета только TArrayRef. Это очень удобно, и мы много где это используем.

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

В Arcadia применяется свой набор классов для работы со строками. Это, во-первых, TStingBuf — аналог str::string_view из C++17.

TString — совсем не std::sting, это CopyOnWrite-строка, поэтому нужно с ней работать довольно аккуратно. Кроме того, TUtf16String — такая же TString, только у нее базовый тип — не char, а 16-битный wchar.

И у нас есть инструменты для преобразования из строк и в строку. Это ToString, который является аналогом std::to_string и FromString в паре с TryFromString, которые позволяют превратить строку в необходимый вам тип.

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

У нас есть своя структура исключений, базовым исключением в аркадийных библиотеках является yexception, который наследуется от std::exception. У нас есть макрос ythrow, который добавляет информацию о месте, откуда бросилось исключение в yexception, это просто удобная обертка.

Есть свой аналог std::current_exception — CurrentExceptionMessage, эта функция выводит текущее исключение в виде строки.

Есть свои макросы для asserts и verifies — это Y_ASSERT и Y_VERIFY.

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

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

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

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

Также у нас есть свой аналог boost_optional или std::optional — TMaybe. Аналог std::variant — TVariant. Нужно пользоваться ими.

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

Есть и некое соглашение, что внутри CatBoost-кода мы вместо yexception бросаем TCatBoostException. Это тот же самый yexception, только в нем всегда при бросании добавляется stack trace.

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

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

Ссылки со слайда: первая, вторая

Обязательно перед началом работы рекомендуем ознакомиться с code style, он состоит из двух частей. Первая — общеаркадийный code style, который лежит прямо в корне репозитория в файле CPP_STYLE_GUIDE.md. Также в корне репозитория лежит отдельный гайд для нашей команды: catboost_command_style_guide_extension.md.

Python-код мы стараемся оформлять по PEP8. Не всегда получается, потому что для Cython кода у нас не работает линтер, и иногда там что-то разъезжается с PEP8.

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

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

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

Если вдруг вам захочется добавить какую-то библиотеку, программу или еще что-то, можно, во-первых, просто посмотреть в соседних ya.make-файлах, а во-вторых, воспользоваться этим примером. Здесь у нас перечислены самые важные элементы ya.make. В самом начале файла мы говорим о том, что хотим объявить библиотеку, дальше перечисляем единицы компиляции, которые хотим в эту библиотеку поместить. Здесь могут быть как cpp-файлы, так и, например, pyx-файлы, для которых автоматически запустится Cython, а потом компилятор. Зависимости библиотеки перечисляются через макрос PEERDIR. Здесь просто пишутся пути до папки с library либо с другим артефактом внутри, относительно корня репозитория.

Есть полезная штука, GENERATE_ENUM_SERIALIZATION, необходимая для того, чтобы сгенерировать ToString, FromString методы для enum classes и enums, описанных в каком-то заголовочном файле, который вы передаете в этот макрос.

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

Для сборки Python я здесь сразу же указал флаги, которые могут быть полезны. Речь идет про сборку с системным Python, в данном случае с Python 3. Если вдруг на вашем ноутбуке или разработческой машине есть установленный CUDA Toolkit, то для более быстрой сборки рекомендуем указывать флаг –d have_cuda no. CUDA собирается довольно долго, особенно на 4-ядерных системах.

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

Еще уже должна работать ya ide. Это инструмент, который сгенерирует для вас clion либо qt solution. И для тех, кто пришел с Windows, у нас есть Microsoft Visual Studio solution, который лежит в папке msvs.

Слушатель:
— А у вас все тесты через Python-обертку?

Стас:
— Нет, у нас отдельно есть тесты, которые лежат в папке pytest. Это тесты нашего CLI-интерфейса, то есть нашего приложения. Правда, они работают через pytest, то есть это Python-функции, в которых мы делаем subprocess check call и проверяем то, что программа не падает и правильно работает при каких-то параметрах.

Слушатель:
— А юнит-тесты на C++?

Стас:
— Юнит-тесты на C++ у нас тоже есть. Они обычно лежат в папке lib в подпапках ut. И они так и пишутся — unit test либо unit test for. Там есть примеры. Есть специальные макросы для того, чтобы объявить класс с юнит-тестами, и отдельные регистры для функции юнит-тестов.

Слушатель:
— Для проверки того, что ничего не сломалось, лучше запускать и те, и те?

Стас:
— Да. Единственное, наши тесты в опенсорсе зеленые только на Linux. Поэтому если вы компилируетесь, например, под Mac, если там пять тестов будет падать — ничего страшного. Из-за разной реализации экспоненты на разных платформах или еще каких-то мелких различий результаты могут сильно разъезжаться.

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

Для примера возьмем задачку. Хочется показать какой-то пример. У нас есть файлик с задачками — open_problems.md. Решим задачку №4 из open_problems.md. Она формулируется так: если пользователь задал learning rate нулевым, то мы должны падать с TCatBoostException. Нужно добавить валидацию опций.

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

Для начала мы должны создать веточку, склонировать себе свой fork, склонировать origin, запулить origin, запушить origin в свой fork и дальше создать веточку и начать в ней работать.

Как вообще происходит парсинг опций? Как я уже сказал, у нас есть важная папка catboost/libs/options, где хранится парсинг всех опций.

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

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

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

Мы каким-то образом узнали — например, поискав грепом или прочитав код, — что learning rate у нас находится в TBoostingOptions. Попробуем написать код, который просто добавляет CB_ENSURE, что наш learning rate больше чем std::numeric_limits::epsilon, что пользователь ввел нечто более-менее разумное.

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

Мы здесь как раз воспользовались макросом CB_ENSURE, написали какой-то код и теперь хотим добавить тесты.

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

В данном случае мы добавляем тест на Command Line Interface. В папке pytest у нас лежит скрипт test.py, где уже есть довольно много примеров тестов и можно просто подобрать похожий на вашу задачу, скопировать его и поменять параметры так, чтобы он начал падать либо не падать — в зависимости от переданных вами параметров. В данном случае мы просто берем и создаем простой пул из двух строчек. (Пулами мы в Яндексе называем датасет. Такая у нас особенность.) И дальше проверяем то, что наш бинарник правда падает, если передать learning rate 0.0.

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

Также мы добавляем в python-package тест, который находится в сatBoost/python-package/ut/medium. У нас есть еще large, большие тесты, которые связаны с тестами на сборку python wheel-пакетов.

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

библиотека машинного обучения yandex. Смотреть фото библиотека машинного обучения yandex. Смотреть картинку библиотека машинного обучения yandex. Картинка про библиотека машинного обучения yandex. Фото библиотека машинного обучения yandex

Дальше коммитим наши изменения и пушим их в наш форкнутый репозиторий. Публикуем пул-реквест. Он уже влился, всё хорошо.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *