Кирилл @inforetriever недавно в подкасте затронул тему сравнения нейросетевого ранжирования со старым добрым градиентным бустингом. Я когда-то тоже хотел про это написать.
Речь, конечно, не про использование нейросетей в ранжировании в принципе, а именно в качестве основной модели верхнего уровня.
К концу моей работы в Яндексе наша команда была в ситуации, когда по офлайн-метрикам мы смогли сравнять качество несложной нейросети и CatBoost на одном и том же датасете. В онлайн, правда, не решились запускать, потому что для этого нужны были инфраструктурные изменения. Но у меня было предчувствие, что когда-нибудь надо будет переходить на нейросети полностью и забыть про родной Катбуст. Я тогда для себя выделил 4 критерия для этого:
- Качество модели
- Скорость обучения
- Скорость (и стоимость) инференса
- Тулинг (feature importance, feature selection, etc.)
И если по качеству мы смогли хотя бы догнать Катбуст (на одном датасете), то с остальными критериями было пока не так радужно. Так что ко всей этой затее я относился довольно осторожно, со сдержанным оптимизмом.
Затем в Майкрософте я застал попытку замены GBDT (LightGBM) на нейросети. Но делали это настолько странно, с некорректными сравнениями и без хорошего бейзлайна, что смысла в этом было мало. Не удивлюсь, если в итоге они всё равно это так и внедрили. Но оптимизма это не прибавило.
А затем я перешёл в X, и тут уже всё полностью на нейросетях. И GBDT уже не может их догнать.
Так что теперь могу сравнить эти два мира, побывав и там, и там.
- Качество модели. Допустим, мы сравниваем в одной и той же постановке: одинаковые фичи, одинаковые таргеты и лоссы. По предыдущему опыту, бустинг насыщается примерно на десятках или сотнях миллионов сэмплов (наверно, это зависит от числа фичей и чего-то ещё). А нейросети — нет. И если у вас есть больше, скажем, миллиарда сэмплов в обучении, то нейросети уже оказываются лучше. А если нет, то лучше действительно оставаться на бустинге, наверно.
- Но если вспомнить, что нейросети более «нативно» поддерживают спарс-фичи и их можно учить end-to-end (а не отдельно матричную факторизацию, которую потом вставлять фичами в бустинг), то они ещё сильнее вырываются вперед по качеству.
- Часто в задаче нужно предсказывать несколько таргетов: клики, конверсии, лайки и т.д. В нейросетях можно применить multi-task learning, который тоже может улучшить качество.
- Скорость обучения. Да, на фиксированном датасете обучить модель с нуля для нейросетей дольше — несколько дней против нескольких часов в бустинге. Но в реальной жизни мы же делаем постоянное дообучение. Для бустинга (из-за full batch optimization) для этого нужно каждый раз собирать большой датасет и заново обучать на нем. А нейросети можно дообучать только на новых данных — небольшой дельте. И тут бустинг начинает уже проигрывать.
- Отдельно стоит упомянуть возможность обучения в реальном времени. Впрочем, без end-to-end обучения и спарс-фичей (user_id и item_id) это и не особо важно.
- Скорость и стоимость инференса. Тут бустинг выигрывает. Но не катастрофически. Всё равно часто в продакшене какие-то нейросети в онлайне применяют (хотя бы user tower для генерации кандидатов). И ещё иногда (если у компании много денег) можно разменять скорость на стоимость и перейти на GPU inference.
- Тулинг. Тут всё похуже, не так удобно, как с Катбустом. А некоторые вещи вообще не понятно, как делать за вменяемое время (например, feature evaluation).
- В целом, нейросети более гибкие. Есть много примеров, что в них дополнительно можно делать и при этом нельзя (или совсем не тривиально) делать в бустинге. Например, разный debiasing через представление модели в виде суммы двух, совместно обучаемых.
Если суммировать, то для масштабного сервиса явный выигрыш за нейросетями.
В общем, я рад, что мне можно уже не тратить много времени на аккуратное сравнение и совершение большого перехода. Я сразу оказался в том будущем, к которому относился с осторожностью.
Речь, конечно, не про использование нейросетей в ранжировании в принципе, а именно в качестве основной модели верхнего уровня.
К концу моей работы в Яндексе наша команда была в ситуации, когда по офлайн-метрикам мы смогли сравнять качество несложной нейросети и CatBoost на одном и том же датасете. В онлайн, правда, не решились запускать, потому что для этого нужны были инфраструктурные изменения. Но у меня было предчувствие, что когда-нибудь надо будет переходить на нейросети полностью и забыть про родной Катбуст. Я тогда для себя выделил 4 критерия для этого:
- Качество модели
- Скорость обучения
- Скорость (и стоимость) инференса
- Тулинг (feature importance, feature selection, etc.)
И если по качеству мы смогли хотя бы догнать Катбуст (на одном датасете), то с остальными критериями было пока не так радужно. Так что ко всей этой затее я относился довольно осторожно, со сдержанным оптимизмом.
Затем в Майкрософте я застал попытку замены GBDT (LightGBM) на нейросети. Но делали это настолько странно, с некорректными сравнениями и без хорошего бейзлайна, что смысла в этом было мало. Не удивлюсь, если в итоге они всё равно это так и внедрили. Но оптимизма это не прибавило.
А затем я перешёл в X, и тут уже всё полностью на нейросетях. И GBDT уже не может их догнать.
Так что теперь могу сравнить эти два мира, побывав и там, и там.
- Качество модели. Допустим, мы сравниваем в одной и той же постановке: одинаковые фичи, одинаковые таргеты и лоссы. По предыдущему опыту, бустинг насыщается примерно на десятках или сотнях миллионов сэмплов (наверно, это зависит от числа фичей и чего-то ещё). А нейросети — нет. И если у вас есть больше, скажем, миллиарда сэмплов в обучении, то нейросети уже оказываются лучше. А если нет, то лучше действительно оставаться на бустинге, наверно.
- Но если вспомнить, что нейросети более «нативно» поддерживают спарс-фичи и их можно учить end-to-end (а не отдельно матричную факторизацию, которую потом вставлять фичами в бустинг), то они ещё сильнее вырываются вперед по качеству.
- Часто в задаче нужно предсказывать несколько таргетов: клики, конверсии, лайки и т.д. В нейросетях можно применить multi-task learning, который тоже может улучшить качество.
- Скорость обучения. Да, на фиксированном датасете обучить модель с нуля для нейросетей дольше — несколько дней против нескольких часов в бустинге. Но в реальной жизни мы же делаем постоянное дообучение. Для бустинга (из-за full batch optimization) для этого нужно каждый раз собирать большой датасет и заново обучать на нем. А нейросети можно дообучать только на новых данных — небольшой дельте. И тут бустинг начинает уже проигрывать.
- Отдельно стоит упомянуть возможность обучения в реальном времени. Впрочем, без end-to-end обучения и спарс-фичей (user_id и item_id) это и не особо важно.
- Скорость и стоимость инференса. Тут бустинг выигрывает. Но не катастрофически. Всё равно часто в продакшене какие-то нейросети в онлайне применяют (хотя бы user tower для генерации кандидатов). И ещё иногда (если у компании много денег) можно разменять скорость на стоимость и перейти на GPU inference.
- Тулинг. Тут всё похуже, не так удобно, как с Катбустом. А некоторые вещи вообще не понятно, как делать за вменяемое время (например, feature evaluation).
- В целом, нейросети более гибкие. Есть много примеров, что в них дополнительно можно делать и при этом нельзя (или совсем не тривиально) делать в бустинге. Например, разный debiasing через представление модели в виде суммы двух, совместно обучаемых.
Если суммировать, то для масштабного сервиса явный выигрыш за нейросетями.
В общем, я рад, что мне можно уже не тратить много времени на аккуратное сравнение и совершение большого перехода. Я сразу оказался в том будущем, к которому относился с осторожностью.