На какие грабли я наступил при решении задач машинного обучения

Как можно избежать ошибки, которые непосредственно влияют на компанию и ее прибыль?

Не понимать проблемы бизнеса, а решать лишь локальные технические задачи

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

Что сработало для меня?

  1. Понять, что в моем красивом коде и SOTA модели нет никакой ценности, если они не приносят достаточно денег.
  2. Больше общаться с конечными заказчиками/клиентами, чтобы понимать их боли лучше.
  3. Узнать про базовый продакт-менеджмент. Например, мне нравится GoPractice.

Пытаться сделать лучшее решение сразу

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

На выходе они получают тысячи потраченных человеко-часов и слабый результат.

Что сработало для меня?

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

Не заботиться о данных слишком хорошо

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

Что сработало для меня?

  1. Придерживаться правила – data first. Нужно получить как можно раньше от заказчика данные, на которых он хочет в конечном счете видеть результат. В идеале, это, конечно, должны быть размеченные данные, поэтому стоит изучить технологии разметки данных. На данный момент самая известная платформа для этого – Яндекс.Толока.
  2. Выделять больше времени на исследование данных, поиск паттернов, которые могут подсказать как лучше представить их для модели. Чтобы даже базовая модель смогла выбить классный результат.
  3. Постоянно делать бэкапы и не сильно надеяться на то, что это сделают другие. Я портил базы несколько раз и, поверьте, вы не захотите испытать это чувство, особенно когда эти данные собирались неделями. Так же важно валидировать бэкапы. То, что у вас создался какой-то файл с названием «backup» не значит, что он валидный.
  4. Хранить максимально сырые данные, без какой-либо обработки. Почему важно хранить пайплайн обработки данных? Если модель тренировалась на данных, обработанными одним образом, а предсказывалась на данных, обработанными другим образом, то скорее всего случится коллизия. И модель будет работать заметно хуже и понять почему не получится, так как в коде не будет ошибок. Я, например, когда занимался извлечением ключевых слов, не понимал почему на продакшене так плохо составляются фразы. А на самом деле все просто – я удалял знаки препинания, что не делал при обучении модели. Из-за я этого потратил день на выяснение причины.
  5. Использовать инструменты для версионирования данных. Они как раз поможет, если данные поломаны и изменения уже закоммичены. Можно будет откатиться и восстановить их. Одним из лучших инструментов является DVC, он работает в связке с git. Если не знакомы с git можно пройти классную игру, которая покрывает все, что надо разработчику в повседневной жизни – learngitbranching.js.org

Заключение

Этот небольшой набор советов может сэкономить вам недели дебага и сохранить последние нервные клетки. Но скорее всего вы запомните их только тогда, когда сами обожжетесь.

33
Начать дискуссию