Книга ML Design Patterns
Evgenii NikitinНедавно вернул себе старую привычку - чтение книг, чему несказанно рад. Одна из книжек, которую довелось прочитать, хотя в данном случае, скорее, подробно просмотреть - ML Design Patterns.
По сути, книга представляет из себя сборник ML-рецептов, разбитых по разным направлениям - представление данных, формулировка задачи, обучение моделей, сёрвинг, репродуцируемость и “ответственный ML”. Для опытных ML-инженеров и рисёчеров большая часть книги покажется скучноватой, наверняка, большую часть этих рецептов вы уже использовали. Однако, если ваш опыт работы на реальных проектах не очень большой или ограничен какой-то одной областью (например, только CV или только обучение моделек без деплоя), то пару-тройку полезных рецептов вы точно найдёте. Я приведу краткое описание частей книги, чтобы вы смогли понять, есть ли там для вас что-то интересное:
- Представление данных. В этой части книги описываются разные способы работы с категориальными переменными, особенно большой кардинальности. Это хеширование, эмбеддинги и создание комбинаций фичей через feature cross (например, женщина && возраст 40-50). В последней главе рассматривается работа с мультимодальными инпутами и разные способы представления текстов и картинок.
- Формулировка задачи. Часто правильная формулировка задачи - это главный фактор успеха или провала ML-проекта. Эта часть книги рассказывает нам о разных способах формулировки задач, которые могут сильно бустануть метрики и упростить жизнь - трансформация регрессии в классификацию, мультилейбл-задачи, использование специального “нейтрального класса” для ситуаций, когда правильным ответом является любой из определённого подмножества классов. Особенно мне понравилась глава по каскадирование моделей. Я часто видел, как люди пытаются решить задачи end-to-end, тогда как разбиение проблемы на несколько этапов и обучение нескольких, зависящих друг от друга моделей, значительно бы улучшило качество. Многие наши системы в Цельсе состоят из каскада моделей - сегментатор области интереса, детектор областей интереса, классификатор общего риска патологии и так далее.
- Обучение моделей. Рецептов в обучении моделей очень много, выбор конкретно в этой книге далеко не самый очевидный. Описаны “оверфиттинг во благо”, чекйпонтирование и использование “виртуальных эпох”, transfer learning, распределённое обучение и тюнинг гиперпараметров.
- Model serving. Описываются два режима сёрвинга моделей - как stateless function и batch serving. Далее идут рецепты про мониторинг моделей и их дообучение по требованию или расписанию, а также про разделение предсказания на два этапа - например, лёгкая модель на эдж-устройстве почти моментально определяет, есть ли риск инсульта, а тяжёлая облачная уточняет первоначальный диагноз.
- Репродуцируемость. В этой секции тоже есть пара интересных глав. В реальном мире нередко встречается ситуация, когда меняется схема данных - например, какая-то фича становится более детализированной. Мы может знать, курит ли пациент, но внезапно к нам начинает поступать более детализированная информация - сколько сигарет в день он выкуривает. Этот рецепт описывает, как корректно использовать эту новую информацию и не накосячить. Остальные главы - корректное разделение на сплиты в разных ситуациях, stateful модели, контейнеризация ML-пайплайнов, feature store и версионирование моделей.
- Ответственный ML. Небольшая глава, которая рассказывает про важность сравнения моделей с простыми бенчмарками, интерпретируемость ML-моделей и оценку “справедливости” предсказаний и model cards.
Первая часть книги мне показалась значительно более интересной, но думаю, что это сильно зависит от опыта и интересов. В целом рекомендую книгу к пролистыванию и более подробному прочтению заинтересовавших глав. Я бы точно не отказался почитать такую книжку лет шесть назад, это бы немного уменьшило количество набитых шишек =)
Напоследок хочу поделиться парочкой своих любимых рецептов.
1) Использование априорных знаний и дополнительных представлений инпута. Знания о задаче часто помогают облегчить жизнь модельке, особенно в условиях low-data regime. Вот лишь несколько примеров для задач CV:
- если мы знаем, что объект может быть только в конкретной области интереса и есть несложный способ определить эту область - лучше это сделать
- если мы знаем, что какое-то свойство объекта (размер, форма, цвет) напрямую влияет на вероятность его принадлежности к тому или иному классу, можно рассчитать это свойство и присоединить к репрезентации сетки перед финальным предсказанием
- если мы знаем, что у входных данных есть дополнительное интересное, доступное нам представление - к примеру, карта глубины, его можно присоединить к инпуту дополнительным каналом
2) Мониторинг дрифта для картиночных данных.
Большинство инструментов для мониторинга data/concept drift типа Evidently AI разработаны для табличных данных, а что делать тем, кто работает с картинками, текстом или аудио? Одно из решений интуитивное - перевести их в табличную форму =)
Для картинок это могут быть фичи, связанные с распределением пикселей, или фичи, связанные с предсказаниями - сколько объектов, какого класса, какая максимальная и минимальная вероятность, какие размеры и так далее. Такое представление позволяет из коробки использовать все известные инструменты.