Интервью с разработчиками Яндекса об искусственном интеллекте и алгоритме CatBoost
За последние несколько лет мы уже привыкли, что машинное обучение идет рука об руку с развитием искусственных нейронных сетей — настолько впечатляющие результаты различные типы нейросетей успели продемонстрировать в этой области. Однако вы наверняка слышали, что обучение машин не сводится к одним лишь нейросетям. Вот, например, во вторник Яндекс официально презентовал новый универсальный алгоритм CatBoost, построенный на градиентном бустинге над решающими деревьями.
Вместе с Анной Вероникой Дорогуш, руководителем группы разработчиков СatBoost, Александром Крайновым, руководителем группы компьютерного зрения, и Михаилом Биленко, руководителем управления искусственного интеллекта и исследований Яндекса, мы поговорили о разнообразии методов машинного обучения, особой роли градиентного бустинга и специфике алгоритма СatBoost, который в ближайшее время заменит хорошо известный Матрикснет в качестве основного инструмента Яндекса.
N+1: Как так вышло, что искусственные нейросети на сегодняшний день затмили все прочие методы машинного обучения, которых на самом деле, даже судя по Википедии, очень и очень много?
Михаил: Можно привести простую аналогию: машинное обучение — это многоконфессиональная религия. В ней всегда были разные тренды, более или менее популярные подходы. Но в последние пять лет возник протестантизм, который так сильно «взорвался», что сложилось впечатление, будто кроме него ничего больше не существует. И если есть какие-то отдельные деревни староверов, то может показаться, что они отстали. Но на самом деле такое в истории машинного обучения происходило всегда — какие-то подходы были наиболее модными и доминирующими, как минимум в научной среде. Текущую ситуацию отличает лишь то, что нейросети оказались популярны в научной среде и одновременно выстрелили публично. А из-за того, что как раз в это же время появились мощные видеокарты, созрели большие массивы данных, получилось так, что именно приложения стали работать очень хорошо, и это дополнительно повысило популярность нейросетей.
N+1: То есть сочетание нескольких факторов и удачные иллюстрации в виде публичных проектов, вроде AlphaGo, DeepDream, — в этом все дело?
Михаил: И это тоже, но они скорее были следствием. Просто у больших лабораторий, которые занимались сетями, сразу же появились еще бóльшие бюджеты, то есть появился некий маховик, и на этом маховике возник DeepMind, который на свой отдельный бюджет от Google сумел сделать AlphaGo. Не то чтобы все эти вещи были революционными, просто они с разных сторон выстреливают, поэтому создается впечатление, что происходит какой-то фейерверк.
Александр
: У каждого метода машинного обучения есть свои преимущества. Нейронная сеть показывает свое преимущество в end-to-end обучении, то есть когда мы берем сырые данные и нам не нужно, что называется, feature-инжинирить (
). А значит, не нужно быть специалистом в предметной области. Для того чтобы обучить нейронную сеть играть в го, вообще-то даже не обязательно знать правила го. Поэтому можно очень быстро что-то сделать в той области, которой раньше рука машинного обучения даже не касалась, не будучи в ней специалистом. Поэтому мы видим очень много ярких, красивых проектов, какие-то стартапы, какие-то неожиданные свершения, все это выглядит фантастически и эффектно. Например, нейронная сеть пишет музыку, а люди, которые написали эту нейронную сеть, не разбираются в нотах, но им это нисколько не мешает.
Хором
: Они
живы.
Анна Вероника
: Если мы говорим об обучении с учителем, есть, во-первых,
. Они нужны, например, если вам важно получить интерпретируемый результат после обучения. Скажем, в медицине очень важно понимать, что же именно модель строит. В таком случае линейную модель очень удобно использовать, потому что веса очень легко интерпретировать, понимать, насколько значим тот или иной фактор, а в зависимости от знака, с плюсом или с минусом, — в какую сторону он значим.
Михаил
: Да, но что интересно: несмотря на всю простоту линейных моделей, в этой сфере непрерывно появляются новые методы и новые результаты, особенно в среде теоретиков машинного обучения. Опять же, многие приемы, которые в итоге нашли применение в нейронных сетях, изначально пришли из линейных методов. То, что надо подбирать веса по одному, настраивать скорость обучения и так далее — сначала это все было сделано в линейных методах, а потом заимствовано для обучения сетей. Казалось бы, что линейные методы — это уже что-то устаревшее и позабытое. Но на самом деле там все очень интересно.
Анна Вероника
: У нас в Яндексе линейные модели тоже очень активно используются, в рекламе, например, это вполне живые методы. Есть и другие подходы, конечно. Скажем, есть группа методов
. Тоже, казалось бы, очень простые методы, но широко используются. Кстати, часто в сочетании с нейросетями.
Александр
: Объясняя простым языком, можно сказать, что оптимальный выбор метода машинного обучения диктуют исходные данные, их тип и количество. И для каждого набора данных есть свой подходящий метод, поэтому прямой конкуренции между методами нет. Не так часто возникает ситуация, когда на одних и тех же данных можно с одинаковой эффективностью использовать разные методы.
Анна Вероника
: В большинстве случаев имеет смысл использовать какие-то комбинации методов. Эти вещи можно часто встретить на Kaggle
. Там есть такое понятие как «стакинг», когда ты обучаешь много разных сложных методов и для уменьшения ошибки суммируешь их, получая лучший результат.
Михаил
: И в больших соревнованиях очень часто выигрывают команды, которые ближе к финалу, если приз большой, а результаты команд близки, просто сливаются вместе и обучают ансамбль. Я это называют «франкенсамбль» потому что получается ужасная, неповоротливая штука, которая никогда не использовалась бы в реальных приложениях, но для того, чтобы на соревновании выжать как можно большую точность, она подходит. Вообще же для оценки работы алгоритма надо учитывать как минимум четыре оси: помимо точности есть еще скорость, потому что если модель слишком тяжелая, то ее для больших нагрузок не применить. Есть простота — то, насколько легко «нажать кнопку» и получить относительно хороший результат. И есть еще требования по памяти и по другим ресурсам. И в этом смысле на практике всегда существуют какие-то ограничения, и на самом деле точность, как правило, не является доминирующим показателем.
Анна Вероника
: У градиентного бустинга есть важные достоинства. Прежде всего, он дает очень хорошие результаты. Если у вас есть большая выборка, можно обучить модель и получить ответ с лучшей точностью в сравнении с такими методами, как «случайный лес» или
. К тому же у градиентного бустинга есть свои особенности обучения и применения. Например, нам принципиально важно, особенно в поиске, чтобы применение модели работало быстро, чтобы пользователь быстро получал ответ. Вот градиентный бустинг как раз можно быстро применить, а тот же самый метод ближайших соседей, например, нет.
Михаил
: Ведь эта модель — это просто ансамбль деревьев, и неважно, сделан он при помощи случайного леса или бустинга, это просто куча правил, ответов на простые вопросы. И это хорошо тем, что это параллелится
. Кстати, есть одна вещь, которая уникальна для Матрикснета, это то, что исторически называется oblivious trees, или симметричные деревья.
Александр
: Еще одна причина, по который Матрикснет работает в Яндексе: ведь исторически Яндекс — это поиск. Конечно, это еще много, много всего, но если говорить именно о поиске, то в нем используются огромные данные разной природы, накопленные за годы и продолжающие копиться. Это ситуация, которая идеальна для решающих деревьев. Но это касается не только Яндекса, почти все поисковые системы работают на деревьях.
Михаил
: Да, бустинговые деревья на самом деле везде доминируют. Точно так же и больше половины кагглеров
перешли на
.
Анна Вероника
: Кстати, если говорить про нейросети, то они у нас используются для подготовки признаков для градиентного бустинга. И не только у нас.
Михаил
: На большой рабочей сцене всегда присутствуют многие компоненты: линейные, сетевые, какие угодно, какие-то старые подходы к деревьям. Но обычно основные «сливатели» всего — это градиентные бустинги.
Михаил
:
Ну, это скорее из разряда «Почему в этом году Audi выиграла у BMW на Нюрбургринге? (
)»
Анна Вероника
: Мы постоянно смотрим на другие алгоритмы, как они работают, читаем код, «препарируем их». Если получается, что на каких-то данных другой алгоритм дает лучшие результаты, мы делаем из этого выводы, чтобы у себя тоже что-то изменить.
Анна Вероника
: Матрикснет — это огромный проект, очень сильно оптимизированный, с десятилетним прошлым, он есть на CPU, GPU, в нем есть распределенное обучение с очень сложной схемой пересылки данных... Это большой и сложный проект. А CatBoost начинался как экспериментальный проект, который родился из определенного вопроса: вот есть числовые признаки, а есть категориальные — что с ними делать?
Михаил
: Еще не все, потому что Матрикснет пророс везде, а еще — его многие для себя модифицировали. Для нас это будет большая борьба, чтобы выкорчевывать Матрикснет и требовать от всех переезда. Но это такая обычная дилемма при переезде на новую платформу: или бесконечно поддерживать старое, или немного потерпеть, но начать использовать новое.
Анна Вероника
: Но надо сказать, что мы начинаем применять CatBoost на новых проектах и более-менее стабильно получаем выигрыш в несколько процентов по сравнению с Матрикснетом. И в общем-то сложности при внедрении заключаются в том, что CatBoost пока что еще не во всю инфраструктуру вшит.
Александр
: Да, у нас очень много автоматических процессов настроено на Матрикснет, и люди даже не до конца понимают, что там под капотом — ведь все налажено. Заменить все это аккуратно в большой, сложной, годами настраиваемой системе, чтобы это все не развалилось, конечно, очень сложно.
Михаил
: Да.
Анна
: Представим себе категориальную переменную, например, тип облаков, которые могут быть кучевые, перистые и так далее. Каждый из этих типов мы хотим каким-то образом заменить на число. Как это можно сделать? Мы можем использовать простые счетчики, но на самом деле они не очень хорошо работают, потому что приводят к переобучению: происходит утечка данных и модель «запоминает» свою обучающую выборку, свой пример. Давайте не будем его ей показывать! Сделаем leave-one-out: для расчета счетчика на каждом объекте обучающей выборки не будем использовать его самого, будем смотреть только на все остальные примеры. Так утечка информации будет меньше, но в конце концов это тоже не работает: рано или поздно модель все равно запомнит свою обучающую выборку и переобучится. Еще, конечно, можно делать leave-bucket-out. Это такое обобщение leave-one-out, когда мы смотрим на все, кроме некоторой группы. К сожалению, это тоже работает не лучшим образом, и опять по тем же причинам.
И тогда мы придумали вот что: давайте скажем, что у нас есть некоторый аналог «времени», как в физике, и расставим данные «по времени». И для каждого объекта обучающей выборки будем рассчитывать наш счетчик так, чтобы модель обучалась только по «прошлым» данным, не подглядывая «в будущие». Вот тогда наша модель сработает, будет происходить гораздо меньше утечек, модель меньше переобучится. А дальше мы будем улучшать это решение: будем делать эту случайную перестановку и упорядочивание по времени не один раз, на подготовительном этапе (так, кстати, сейчас делает кагглеры), а сколько-то раз в течение всего обучения. Или мы можем попробовать считать счетчики не по одному признаку, а по нескольким... Ну и много еще тонких приемов есть. Или вот, что делать, если у нас не задача классификации, а задача регрессии, или ранжирования, или мультиклассификации. Мы попробовали много разных подходов, выбрали из них хорошо работающие, внедрили в алгоритм, и теперь регрессия у тебя, или классификация, или мультиклассификация — ты просто отдаешь свои категориальные признаки, а алгоритм сам за тебя их считает наилучшим способом. То есть мы не просто выбрали или придумали лучшие на сегодняшний день подходы, но и автоматизировали их применение. Какая бы задача ни была у пользователя, CatBoost сам выберет наилучший метод.
N+1: Что же тогда остается для пользователя?
Анна: Для пользователя при желании все еще остается подбор гиперпараметров (Параметры, которые не подстраиваются автоматически в ходе обучения, а задаются извне. — Прим. N+1). Все открытые реализации градиентного бустинга требуют аккуратной настройки параметров. Если запустить многие популярные алгоритмы с исходными параметрами, а потом подобрать их поточнее и посмотреть, что получилось, то разница будет огромной. А вот у Матрикснет и CatBoost такой проблемы нет, в них дефолтные параметры подобраны так, что с ними уже получается очень хороший результат. Но на некоторые параметры смотреть все еще нужно. Обязательно нужно выбирать правильное число деревьев, для этого надо использовать тестовые данные и выбирать итерацию, на которой на них перестает падать ошибка. В CatBoost для этого есть детектор переобучения — он сам за тебя поймет, что ты переобучился, и сохранит тебе модель на лучшей итерации.Что касается дефолтных параметров, то у нас есть несколько «волшебных» значений, которые работают лучше всего, это learning rate 0,03 (Шаг обучения — с какой скоростью алгоритм будет уменьшать ошибку на каждой итерации. — Прим. N+1) и глубина дерева 6.Бывает и так, что на каких-то наборах данных нужно менять значения этих параметров, например, на некоторых физических данных нужно увеличивать глубину.
N+1: Я правильно понимаю, что CatBoost будет открытый?
Анна Вероника: Да. Мы, кстати, недавно выложили на arXiv статью с описанием еще одной особенности алгоритма — схемы обучения, благодаря которой уменьшается утечка.
Михаил: Решение сделать релиз открытым объясняется довольно просто. На практике ведь весь CatBoost — это разные трюки, и каждый из них довольно глубокий, специализированный. Можно по каждому из этих трюков сделать отдельную публикацию, но фокус тогда будет не на всей системе. А Open-source хорош тем, что можно всю систему подать. И к тому же, если есть некоторые вещи, в которых академические трюки не так интересны, но в практике их комбинация как раз и выстреливает, то это хорошо.
N+1: Понятно. Получается, будет совсем открытая имплементация, как у того же XGBoost, когда можно скачать питоновскую библиотеку?
Михаил: Прямо так и будет, в момент релиза. Можно будет брать и играться.
Беседовал Тарас Молотилин