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

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

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

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

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

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

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

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

А теперь давайте начнем веселье.

Как выбрать алгоритм ML

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

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

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

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

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

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

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

Как разработать алгоритм ML

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ниже приведены отличные посты Шервина Минаи о метриках для различных задач и областей:
- 20 популярных метрик машинного обучения. Часть 1: Метрики классификации и регрессионной оценки
- 20 популярных метрик машинного обучения. Часть 2: Рейтинг и статистические показатели

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

Еще один способ избежать скандала (на этот раз новая система кредитного скоринга банка ABC дискриминирует незамужних женщин) — использовать поведенческие тесты. В замечательной статье За пределами точности: поведенческое тестирование моделей НЛП с помощью контрольного списка в дополнение к числовым метрикам предлагается использовать тесты минимальной функциональности, инвариантности и направленного ожидания. Несмотря на то, что в статье основное внимание уделяется обработке естественного языка, эти типы тестов можно легко применить к табличным данным и изображениям.

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

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

Заключение

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

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

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