Построение лучших систем машинного обучения – Глава 3 Моделирование. Пусть начнется веселье

Лучшие системы машинного обучения - Глава 3 Моделирование. Пусть начнется веселье

О базовых значениях, отслеживании экспериментов, правильных тестовых наборах и метриках. О том, как заставить алгоритм работать.

Источник изображения

Привет снова. Рад видеть тебя здесь снова. Я очень ценю твоё желание стать лучшим профессионалом, делать лучшую работу и создавать лучшие системы машинного обучения. Ты молодец, продолжай в том же духе!

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

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

Машинный алгоритм (чёрный ящик в середине) - это всего лишь малая часть системы машинного обучения. Источник изображения

Прежде чем мы продолжим, давайте вспомним, что мы уже узнали.

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

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

Если по какой-то случайности вы пропустили предыдущие посты, я настоятельно рекомендую прочитать их, прежде чем мы продолжим. Я буду ждать вас здесь.

Итак, пусть начнётся веселье.

Как выбрать алгоритм машинного обучения

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

Думайте, обдумывайте, разговаривайте с коллегами, обращайтесь к ChatGPT и затем запишите три подхода, которые вы собираетесь попробовать: 1) что-то очень простое; 2) что-то очень популярное; 3) что-то новое и креативное.

  1. Что-то очень простое. Вся сложность, внесённая в алгоритм, должна быть обоснована. Начните с простого подхода (возможно, даже не использующего машинное обучение), оцените его и используйте его в качестве базового значения для сравнения со всеми остальными моделями.
  2. Что-то очень популярное. Если вы видите, слышите и читаете, что многие люди решают ту же бизнес-задачу с помощью определённого алгоритма – убедитесь, что добавите его в список экспериментов. Используйте коллективный интеллект! Мои ожидания всегда высоки от популярных подходов, и в большинстве случаев они работают очень хорошо.
  3. Что-то новое и креативное. Просто попробуйте. Ваш начальник и компания будут рады, если вы создадите конкурентное преимущество, обыграв типичные популярные подходы.

Слово предостережения: не изобретайте велосипед. Существуют сотни открытых библиотек и репозиториев, которые имеют реализации большинства алгоритмов, стратегий выборки данных или циклов обучения, о которых вы можете подумать. Не пишите свою собственную кластеризацию K-средних — используйте ту, которая есть в scikit-learn. Не пишите ResNet50 с нуля — используйте ту, которая есть в PyTorch. Перед реализацией последней научной статьи, проверьте PapersWithCode, я уверен, что кто-то уже это сделал.

Исследования и изобретение чего-то нового привлекательно. Реализация алгоритмов с нуля, где вы понимаете каждую отдельную строку, заманчива. Однако исследования хорошо вписываются только в университеты и крупные технологические компании. Для стартапов каждый доллар имеет значение, поэтому они просто не могут позволить себе вложиться в то, что имеет маленький шанс на успех (а исследование — это буквально 100 попыток и 1 успех).

Будьте осторожны с “самыми передовыми” технологиями. Представьте, что вы используете YOLOv7 для обнаружения объектов, а затем слышите, что вышла YOLOv8, которая, как ожидается, будет еще лучше. Это значит, что вам нужно обновить все производственные конвейеры для поддержки YOLOv8? Не обязательно.

В большинстве случаев “лучше” означает улучшение на 1–2% на статическом эталонном наборе данных, таком как COCO. Точность модели на ваших данных может быть лучше, незначительно лучше или даже хуже, просто потому что ваши данные и ваша бизнес-проблема отличаются во всех отношениях. Кроме того, как было сказано в главе 2 этой серии, вы должны помнить: улучшение данных приводит к более значительному увеличению точности модели, чем улучшение алгоритма. Придумайте способы очистки тренировочных данных — и вы увидите увеличение точности на 5–10%.

Как разработать алгоритм машинного обучения

Сначала получите базовую точку. Базовая точка — это модель, с которой вы будете соревноваться. Есть два логических выбора для базовой точки:

  1. Существующая модель из производства (если такая у вас есть). Мы хотим улучшить существующую модель, поэтому нам нужно сравниться с ней.
  2. Очень простая модель, которую легко развернуть. Если бизнес-задача может быть решена простым способом, зачем тренировать сложные модели? Потратьте несколько дней на поиск простого решения и его реализацию.

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

Разработка алгоритма — это итерационный процесс. Изображение автора

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

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

Мой совет здесь: ограничьте время, которое вы тратите на одну идею. Если вы не можете сделать идею работающей в течение N дней (выберите N заранее), завершите ее и перейдите к другой. Если вы действительно хотите достичь успеха, вам придется пройти через множество разных идей, потому что, как я уже сказал ранее, большинство идей, которые вы попробуете, не удастся реализовать.

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

Разделите данные на обучающую, проверочную и тестовую части. Обучайтесь на обучающем наборе, выбирайте гиперпараметры на проверочном наборе и оценивайте на тестовом наборе. Убедитесь, что нет перекрытия или утечки данных между разделами. Подробнее об этом можно прочитать в статье “Разделение обучающего, проверочного и тестового наборов данных для машинного обучения” от Джейкоба Солавеца.

Путь к успеху: возьмите модель с открытым исходным кодом, запустите ее с параметрами по умолчанию и настройте гиперпараметры. Используйте алгоритмы либо из библиотек машинного обучения, таких как scikit-learn, PyTorch, OpenCV, либо из репозитория на GitHub, который имеет много звезд, хорошую readme-инструкцию и лицензию, позволяющую использовать его в коммерческих целях. Обучайте модель с гиперпараметрами по умолчанию на ваших данных и оценивайте результаты. Гиперпараметры алгоритма выбраны таким образом, чтобы максимизировать точность на эталонном наборе данных (ImageNet, COCO), поэтому в большинстве случаев они плохо подходят для ваших данных и задачи. Тщательно изучите, что означает каждый гиперпараметр и как он влияет на обучение/вывод, чтобы вы могли проводить оптимизацию гиперпараметров. Типичные подходы для оптимизации гиперпараметров включают в себя градиентный спуск студента, случайный/сеточный/байесовский поиск и эволюционные алгоритмы. Никогда не говорите, что алгоритм не работает, прежде чем провести оптимизацию гиперпараметров. Чтобы узнать больше, ознакомьтесь с этой статьей Пьера Паоло Ипполито: Оптимизация гиперпараметров.

Работайте с вашими данными еще больше: проводите инженерию признаков и аугментацию данных. Инженерия признаков относится к трансформации существующих признаков и созданию новых. Инженерия признаков является важным навыком, поэтому я рекомендую вам две отличные статьи, где вы можете его освоить: – Фундаментальные техники инженерии признаков для машинного обучения от Эмре Ренсбероглу – 4 совета по продвинутой инженерии признаков и предварительной обработке от Маартена Гротендорста

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

Если вас интересует, как проводится аугментация в обработке естественного языка, прочитайте статью Шахула ЭС: Аугментация данных в NLP: лучшие практики от мастера Kaggle.

Перенос обучения – ваш друг. Обучение без учителя – ваш лучший друг. Перенос обучения – популярная техника, позволяющая повысить точность модели. Практически это означает, что вы берете модель, предварительно обученную на некотором наборе данных, и продолжаете обучение с использованием своих данных (“перенос знаний”). Даже веса, полученные на наборах данных COCO или ImageNet, могут улучшить вашу модель, даже если ваши данные сильно отличаются от изображений COCO/ImageNet.

Обучение без учителя – это алгоритм, который работает с вашими данными без предварительного обучения. Как? Обычно это модель, предварительно обученная на огромном наборе данных из миллиарда примеров. Ваши данные могут выглядеть так, как будто эта модель уже обучалась на них; и модель уже “видела” так много примеров, что может обобщать данные хорошо. Обучение без учителя может показаться мечтой, но существуют некоторые супермодели: Segment Anything, большинство моделей векторных представлений слов, ChatGPT.

Модель разработки чек-листа для вашего удобства. Изображение от автора

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

Отслеживание экспериментов

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

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

Так зачем же нам нужно отслеживать эксперименты?

  • Для сравнения различных экспериментов между собой. Когда вы разрабатываете модель, вы обучаете и оцениваете множество разных алгоритмов, пробуете различные техники предварительной обработки данных, используете разные гиперпараметры и придумываете различные творческие трюки. В конечном итоге вы хотите увидеть, что вы попробовали, что сработало и что дало лучшую точность. Возможно, позже вам захочется вернуться к какому-то эксперименту и ознакомиться с его результатами с чистым взглядом. Разработка модели может занимать недели или даже месяцы, поэтому без правильного отслеживания экспериментов вы просто забудете, что делали, и придется проводить эксперименты заново.
  • Для воспроизведения экспериментов. Если вы не можете воспроизвести эксперимент, он не имеет значения. Проверьте себя: можете ли вы вернуться к вашему наиболее успешному эксперименту, перезапустить его и получить ту же точность? Если ответ “НЕТ”, это может быть связано с тем, что вы не контролируете версии кода и данных, не сохраняете все гиперпараметры или не устанавливаете случайное зерно. Важность установки случайного зерна хорошо объяснена в статье Цилии Шао: Правильная установка случайного зерна в экспериментах по машинному обучению. Не так просто, как кажется.
  • Для отладки эксперимента. Иногда эксперимент не работает: алгоритм не сходится, предсказания выглядят странно, точность близка к случайной. Без сохраненной информации об эксперименте практически невозможно понять, почему он не удался. Сохраненный список гиперпараметров, визуализация образцов и аугментаций, графики потерь и т. д. могут дать вам некоторые подсказки о причинах проблемы.

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

Существует десятки бесплатных и платных инструментов для отслеживания экспериментов, выберите что-то, что соответствует вашим требованиям и бюджету. Вероятно, самым популярным является Weights&Biases; Я много работал с ним и он хорош. Для обзора некоторых других инструментов, ознакомьтесь с 15 лучшими инструментами для отслеживания и управления экспериментами машинного обучения, составленными Патрицией Дженкнер.

Эксперимент машинного обучения состоит из данных, кода и гиперпараметров. Убедитесь, что вы используете инструменты контроля версий для кода, такие как Github или Gitlab, и фиксируйте все изменения во время разработки. Важно иметь возможность вернуться к более старым версиям кода для повторного запуска более старых экспериментов. Версионируйте свои данные. Самый простой и популярный способ – создать новую папку или новый файл на диске (лучше всего в облачном хранилище, таком как Amazon S3 или Google Cloud Storage) для каждой новой версии набора данных. Некоторые люди используют инструмент под названием Data Version Control (DVC).

Эксперимент машинного обучения состоит из данных, кода и гиперпараметров. Изображение автора

Что именно следует отслеживать в эксперименте? Что ж, не плохая идея отслеживать все, что можно 🙂 Большую часть времени вы не будете использовать всю эту информацию, если только эксперимент не провалится совершенно и навсегда.

Вот список вещей, которые вы можете рассмотреть для отслеживания:

  • Хеш коммита Git
  • Ссылка на наборы данных для обучения, проверки и тестирования
  • Гиперпараметры и их изменение со временем (архитектура модели, скорость обучения, размер пакета, аугментация данных и т.д.)
  • Графики потерь на обучающем и проверочном наборах данных
  • Графики метрик на обучающем и проверочном наборах данных
  • Метрики на тестовом наборе данных
  • Визуализация обучающих примеров с метками (с применением аугментации и без нее)
  • Визуализация ошибок на тестовом наборе данных
  • Окружение (ОС, версия CUDA, версии пакетов, переменные среды)
  • Скорость обучения, использование памяти, загрузка процессора/графического ускорителя

Настройте отслеживание эксперимента один раз и наслаждайтесь его преимуществами навсегда.

Оценка модели

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

Для проведения оффлайн-оценки нам нужны метрика и набор данных.

Модель оценивается на тестовом наборе данных, который вы отложили во время обучения и настройки гиперпараметров. Предполагается, что 1) тестовый набор данных достаточно большой и чистый; 2) модель никогда не видела тестовые данные; 3) тестовые данные представляют продакшн-данные. Если одно из предположений нарушено, оценка проводится неправильно, и существует высокий риск получить чрезмерно оптимистичную метрику и развернуть плохую модель.

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

Убедитесь, что ваша модель не “видела” тестовые данные. Всегда удаляйте дубликаты, чтобы один и тот же пример не попал и в обучающий, и в тестовый наборы данных. Не разделяйте данные случайным образом, используйте разделение по времени или по пользователям. Разделение по времени означает помещение более старых данных в обучающий набор и более новых – в тестовый набор. Разделение по пользователям означает наличие всех данных от одного и того же пользователя в одном и том же разбиении. И будьте очень осторожны с утечками данных, больше подробностей об этом можно найти в статье Prerna Singh “Утечка данных в машинном обучении: как ее обнаружить и минимизировать риски”.

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

Ниже приведены отличные публикации Шервина Минаи о метриках для различных задач и областей:

  • 20 популярных метрик машинного обучения. Часть 1: метрики оценки классификации и регрессии.
  • 20 популярных метрик машинного обучения. Часть 2: метрики ранжирования и статистические метрики.

Используйте метрики, основанные на срезах, и оценивайте свою модель для каждого сегмента данных, о котором вы можете подумать (если вы не хотите попасть в скандал, подобный “Функция виртуального фона Zoom не предназначена для черных лиц”). Например, системы обнаружения лиц должны оцениваться отдельно для людей различных рас, полов и возрастов. Модели электронной коммерции также стоит оценивать для настольных компьютеров и мобильных устройств, разных стран и браузеров. Убедитесь, что каждый сегмент хорошо представлен в тестовом наборе данных. Метрики, основанные на срезах, также помогают справиться с дисбалансом классов: анализ точности и полноты для каждого класса отдельно гораздо полезнее, чем общая точность/полнота.

Еще один способ избежать скандала (на этот раз “Новая система кредитного скоринга Банка ABC дискриминирует незамужних женщин”) – использовать поведенческие тесты. Великолепная статья “Beyond Accuracy: Behavioral Testing of NLP Models with CheckList” предлагает использовать тесты на минимальную функциональность, инвариантность и направленные ожидания в дополнение к числовым метрикам. Несмотря на то, что статья фокусируется на обработке естественного языка, эти типы тестов легко могут быть применены к табличным данным и изображениям.

В случае с примером “Новая система кредитного скоринга Банка ABC дискриминирует незамужних женщин” тест на инвариантность помог бы много. Оставьте все признаки неизменными, но измените семейное положение и пол и проверьте, изменились ли предсказания модели. Если вы видите значительную разницу в предсказаниях (когда она должна быть “инвариантной”), вероятно, ваша модель усвоила предвзятость в обучающих данных; это нужно исправить, например, путем полного удаления чувствительных (приводящих к дискриминации) признаков из входных данных модели.

И, наконец, визуализируйте ошибки. Найдите примеры в тестовом наборе данных, для которых модель допустила ошибку; визуализируйте их и проанализируйте, почему это произошло. Это связано с тем, что тестовый набор данных все еще содержит ошибки? В тренировочном наборе достаточно похожих примеров? Есть ли какой-либо шаблон для ошибок модели? Этот анализ помогает обнаружить возможные ошибки разметки в тестовом наборе данных и ошибки во время обучения, а также придумать идеи, как еще улучшить производительность модели.

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

Заключение

В этой главе мы узнали, как разрабатывать модели с учетом того, что алгоритм машинного обучения – только ЧАСТЬ системы машинного обучения. Разработка модели начинается с создания простой базовой модели и продолжается с итеративных улучшений над ней. Мы подходим к наиболее эффективному пути: берем открытую модель и проводим эксперименты вокруг нее, вместо того, чтобы изобретать велосипед или погружаться в исследовательскую яму. Мы обсудили ловушки “новейших” алгоритмов и преимущества аугментации данных и передачи обучения. Мы согласились на важность отслеживания экспериментов и научились настраивать его. И, наконец, мы говорили об оффлайн-оценке – выборе метрик, правильных тестовых наборах данных, оценке на основе срезов и поведенческих тестах.

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

Финал будет доступен скоро. Подпишитесь, чтобы быть в курсе.