Понимание регрессионного тестирования через опыт:

Сегодня мы с новым блогом. В этой серии из трех частей мы узнаем о фреймворках для тестирования в машинном обучении, которое является быстро развивающейся областью. В первой части блога мы узнаем о том, зачем нужны фреймворки для тестирования, а затем методы модульного тестирования. Мы рассмотрим большинство библиотек/пакетов для тестирования в различных средах, начиная с TensorFlow, PyCaret, DeepDiff и многих других. Во второй части блога мы расскажем о методах тестирования градиентов с использованием JAX, Theano и многих других. Мы также рассмотрим некоторые среды тестирования, такие как Nose, и некоторые другие методы тестирования, такие как дымовые тесты, A / B-тестирование, развертывание Canary, развертывание Blue-Green и многие другие в AI / ML. В заключительной и третьей частях блога мы рассмотрим несколько интересных исследовательских работ, опубликованных в области тестирования AI/ML, а также некоторые стартапы и интересную работу, которую они проделали в этой области. Итак, приступим!

Большинство команд сегодня не имеют возможности следовать этим передовым методам при развертывании модели в рабочей среде или во время подготовки или построения модели. В этом блоге я поделюсь некоторым своим опытом из прошлого, когда ощущалась потребность в этих фреймворках/методах/библиотеках и как они развивались с течением времени. Итак, приступим к рассказу!

Модульное тестирование и дополнительные методы тестирования:

Это было в 2018 году, когда один из членов моей команды, опытный разработчик программного обеспечения, обратился ко мне с искренним вопросом. Он спросил: «Хитеш, у меня есть один вопрос, который мне нужно знать. Сегодня у нас есть так много сред тестирования в разработке программного обеспечения, таких как разработка, основанная на тестировании и поведении, разделение эквивалентности, анализ граничных значений, покрытие кода, имитация и заглушка и многое другое. Не могли бы вы помочь мне понять полный список тестов, которые мы используем сегодня для тестирования нашего программного кода/конвейеров и т. д.?» Мы пошли в один из конференц-залов и обсудили ряд тестов, которые мы используем сегодня, включая регрессионное тестирование, тестирование производительности и многие другие. Затем один из членов моей команды спросил меня: "Если мы рассматриваем регрессионное тестирование, как нам реализовать его в моделях AI/ML?"

Это был хороший вопрос, который помог связать опыт тестирования программного обеспечения с опытом тестирования AI/ML. В конце концов, я считаю, что «успешный продукт — это не тот продукт, в котором используются модные технологии, а тот, который отвечает потребностям пользователей и успешно протестирован для обеспечения его надежности и эффективности».

Теперь у всех вас может возникнуть вопрос о том, что произойдет, если мы продолжим совершенствоваться, и модель обобщает эти данные. Здесь мы не просто сохраняем 50 000 выборок постоянными, а продолжаем добавлять выборки к нашим данным и медленно переобучаем модели, масштабируясь до большего набора данных. Кроме того, мы не нарушаем вывод набора тестов, а скорее собираем наборы тестов, где модель пытается понять/не может предсказать по причинам. Например, если вы используете модель анализа настроений с более чем 8 чувствами в ваших данных, представьте себе «гнев» и «ненависть», насколько близкими будут чувства? В таких прогнозах даже восклицательные знаки, смайлики и стоп-слова могут оказаться дорогостоящими из-за неправильных прогнозов, поэтому я бы сказал, что один из ваших тестовых наборов должен был бы проверить, как эти 2 класса работают для кураторского тестового набора смайликов, стоп-слов, и восклицания.

Преимущество этого подхода заключается в том, что всегда легче понять поведение вашей модели на ограниченном наборе данных, чем слепо брать миллионы строк, выполнять очистку, разработку функций и получение метрик. В заключение можно сказать, что модели AI/ML сложны, и для их тестирования требуются специализированные платформы и методы, выходящие за рамки традиционного тестирования программного обеспечения. Такие методы, как RCA и наборы тестов, могут помочь повысить точность и надежность моделей AI/ML. Поскольку мы продолжаем разрабатывать и развертывать модели AI/ML в различных приложениях, важно иметь полное представление о средах тестирования и передовых методах, чтобы обеспечить успех этих моделей.

Теперь давайте продолжим обсуждение изменений в экосистеме тестирования для AI/ML. Давайте начнем.

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

Модули TensorFlow tf.test.TestCase и tf.test.mock

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

Точно так же при разработке модели машинного обучения необходимо убедиться, что каждая часть кода работает правильно. Итак, вы берете небольшую выборку данных, называемую «модульным тестом», и проверяете, дает ли модель ожидаемый результат. Если модульный тест пройден, вы можете быть уверены, что остальная часть модели тоже работает.

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

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

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

В этом примере мы используем модули TensorFlow tf.test.TestCase и tf.test.mock для выполнения трех различных типов модульных тестов в модели глубокого обучения: >проверка сводки модели, проверка количества обучаемых весов и проверка правильности печати журналов тренировок.

Модуль unittest.TestCase от PyTorch

В этом примере мы тестируем ту же модель CNN (MyModel), используя модуль PyTorch unittest.TestCase. Мы выполняем те же два модульных теста, что и в предыдущем примере:

Метод Keras Model.fit()

В этом примере мы используем метод Keras Model.fit() для обучения модели глубокого обучения, а затем выполняем модульный тест для проверки точности модели после обучения.

  • test_loss_function: этот тест проверяет правильность градиентов параметров модели по отношению к функции потерь.
  • Теперь позвольте мне поделиться примером, который я объяснил ему, о том, как можно проводить регрессионное тестирование в сценариях AI/ML. В 2018 году я работал над вариантом использования NLP, который оказался одним из самых сложных для меня на сегодняшний день. Это включало не только наличие помеченного набора данных с входными абзацами и выходными классами, но также извлечение определенного набора абзацев и их маркировку на основе классификации наших экспертов. Позвольте мне немного перемотать вперед и перейти к окончательному набору данных. У меня было около 1 миллиона строк данных в первом разрезе с 4 классами, так как это была мультиклассовая модель классификации. Я попросил свою команду взять всего 50 000 строк данных через мыслительный процесс стратифицированной выборки, то есть для начала взять равные распределения их классов, а не случайную выборку. Мой подход всегда заключался в мыслительном процессе «начать с простого», что означает, что тогда я начинал с базового ансамбля n-грамм, метаплотных функций, разрабатываемых с помощью функциональной инженерии, и запуска классического машинного обучения. модели в наборе данных. Предполагая, что вся очистка была сделана в качестве первого шага, я всегда следовал вышеперечисленным. Очистка требует большого понимания и заключается не только в удалении стоп-слов, знаков препинания и т. Д. Члены моей команды уже знали бы о некоторых грубых ошибках из-за их удаления😀. После того, как эти традиционные методы/модели были созданы, я получил хороший эталон того, как работают эти вероятностные и основанные на правилах методы. Моим следующим шагом было не переходить к подходам, основанным на глубоком обучении, а скорее переходить к RCA (анализу первопричин) моих результатов. Раньше я просил свою команду создать простой файл Excel с входными и выходными данными их полного набора данных, объединенных, обучающих, оценивающих и тестирующих, и приходить ко мне после завершения. Вся моя команда и я часами сидели, изучая неправильно классифицированные образцы и какие были типы этих образцов. Выход мультикласса представлял собой вероятность суммирования значений до 100%. Я помню, как начал с оценки F1 всего 18%, чтобы закрыть окончательный набор моделей с F1 ~ 85%. Я чувствовал, что все члены моей команды устают от аналитики в Excel, но RCA доставил нам массу проблем. Раньше мы изучали неправильно предсказанные классы и понимали, насколько мы были близки к предсказанию фактического класса. Если мы не предсказываем фактический класс, можем ли мы даже предсказать следующий лучший класс (например, старый предсказывается как очень старый), что сбивает модель с толку, или предсказания прямо противоположны (например, старый предсказывается как очень новый)? RCA вообще заслуживает отдельного блога. Я пытаюсь сказать здесь, что важно исправить ошибки, которые делает модель, а затем проверить тот же набор моделей на этих данных, чтобы увидеть, какие из них работают лучше. Я бы не назвал это в точности регрессионным тестированием, но представьте наши наблюдения RCA в виде набора тестов, где мы проверяем, как наша модель работает на этих наборах тестов. Если есть различия, мы снова исследуем первопричину и повторно запускаем модели.

функция assert_allclose() из sci-kit-learn

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

assert_allclose() — это функция в библиотеке scikit-learn, которая проверяет, равны ли два массива или фрейма данных в пределах допуска.

Модуль mlflow.pytest_plugin MLflow:

Функция принимает два входных параметра: первый — это ожидаемый результат или «истинные» значения, а второй — фактический результат или «прогнозируемые» значения. Затем функция сравнивает эти два входа поэлементно и проверяет, меньше ли абсолютная разница между ними заданного уровня допуска.

Если разница превышает указанный уровень допуска, то assert_allclose() вызывает ошибку утверждения, указывающую на то, что тест не пройден.

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

Плагин pytest от MLflow — это метод модульного тестирования, используемый в машинном обучении. Он позволяет тестировать модели машинного обучения, обучающий код и код предварительной обработки воспроизводимым и автоматизированным способом. Плагин предоставляет набор фикстур pytest, которые вы можете использовать для настройки своих тестов, таких как загрузка данных и моделей, а также предоставляет набор утверждений, которые вы можете использовать для проверки точности и поведения ваших моделей. Используя подключаемый модуль pytest MLflow, вы можете убедиться, что ваши модели машинного обучения работают должным образом, и своевременно обнаруживать регрессии.

Класс DeepDiff

DeepDiff — это пакет Python, предоставляющий удобный способ сравнения сложных объектов Python, таких как словари, списки, наборы и кортежи. Класс DeepDiff особенно полезен при модульном тестировании в ML, поскольку он позволяет разработчикам быстро выявлять различия между ожидаемыми и фактическими выходными данными модели.

Класс VisualAssert от Yellowbrick

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

Класс DeepDiff предоставляет различные методы сравнения, такие как assert_diff и assert_same_structure, которые можно использовать для выполнения различных типов сравнений между объектами. Он также предоставляет полезные методы, такие как "to_dict" и "from_dict", для преобразования объектов в словари и из словарей для сравнения.

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

Yellowbrick — это библиотека Python для визуализации машинного обучения.

Плагин pytest для Hugging Face:

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

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

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

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

Функция tfp.test_util.assert_near() в TensorFlow Probability

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

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

В этом примере мы сначала импортируем модуль pytest и функцию конвейера из библиотеки трансформеров Hugging Face. Затем мы определяем простой конвейер задачи классификации текста, используя модель предварительно обученный distilbert-base-uncased-finetuned-sst-2-english.

Затем мы определяем тестовый пример с помощью декоратора @pytest.mark.parametrize. Этот тестовый пример принимает два входа — образец текста и ожидаемую метку для этого образца. Для каждого набора входных данных, указанного в декораторе, тестовый пример выполняет вывод с использованием конвейера и проверяет, соответствует ли предсказанная метка ожидаемой метке, используя оператор assert.

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

Функция tfp.test_util.assert_near() в TensorFlow Probability используется в модульном тестировании для сравнения двух тензоров и утверждения, что они почти равны (в пределах определенного допуска). Это полезно при тестировании статистических моделей, где результат может быть неточным из-за случайности.

Функция mx.test_utils.assert_almost_equal() от Mxnet

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

Аналогично другим функциям фреймворка.

Класс LightningTestCase PyTorch Lightning

LightningTestCase — это класс в библиотеке PyTorch Lightning, который расширяет класс unittest.TestCase и предоставляет некоторые дополнительные функции для тестирования моделей PyTorch Lightning. Этот класс помогает писать тестовые примеры для моделей PyTorch Lightning более эффективным и простым способом.

Функция assert_model_performance() PyCaret

Класс LightningTestCase предоставляет некоторые вспомогательные функции для тестирования различных аспектов модели PyTorch Lightning. Например, он предоставляет функцию run_model_test, которая проверяет, может ли модель работать должным образом без каких-либо ошибок, и другую функцию assert_checkpoint_and_resume, чтобы проверить, можно ли правильно сохранить и возобновить работу модели.

В этом примере мы определяем простую модель линейной регрессии (SimpleModel), а затем создаем тестовый набор (TestSimpleModel), наследуемый от LightningTestCase. Мы определяем единый тестовый метод test_checkpoint_and_resume, который обучает модель в течение одной эпохи, а затем использует метод assert_checkpoint_and_resume для проверки того, что модель может быть проверена и возобновлена ​​без ошибок.

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

Класс test_case.AllennlpTestCase от Allennlp:

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

Функция assert_allclose() TorchIO:

Подобно другим функциям утверждений других библиотек.

Класс NeuralNetClassifier Скорча:

Это не совсем библиотека для тестирования, а скорее класс-оболочка. Skorch — это библиотека Python, которая позволяет использовать модели PyTorch с помощью scikit-learn. Класс NeuralNetClassifier — это совместимая с scikit-learn оболочка для нейронных сетей PyTorch.

ДВК

Когда вы создаете объект NeuralNetClassifier, вы определяете архитектуру своей нейронной сети с помощью PyTorch. Вы также можете указать гиперпараметры, такие как скорость обучения, количество эпох и размер пакета.

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

В целом, класс NeuralNetClassifier позволяет использовать возможности PyTorch для создания и обучения нейронных сетей, сохраняя при этом удобство и совместимость scikit-learn.

DVC (Data Version Control) — это библиотека с открытым исходным кодом, которая помогает вам управлять моделями и данными машинного обучения и управлять ими. Он предоставляет простой и эффективный способ отслеживать изменения в вашем коде, данных и экспериментах, а также сотрудничать с членами вашей команды.

Есть еще несколько из фреймворка TensorFlow Extended (TFX). Не стесняйтесь исследовать это.

Одной из ключевых особенностей DVC является его способность создавать версии больших наборов данных без сохранения их в Git, который может быстро раздуваться и замедляться. Вместо этого DVC использует Git для отслеживания изменений ваших данных и метаданных, сохраняя при этом фактические данные в службе удаленного хранения, такой как Amazon S3 или Google Cloud Storage.

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

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

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

Подписание,

Кроме того, используя платформы и методы тестирования, специалисты по данным и инженеры по машинному обучению могут выявлять и устранять проблемы на ранних этапах цикла разработки, что приводит к созданию более надежных и надежных моделей машинного обучения. В связи с растущим значением AI/ML в различных отраслях важно сосредоточиться на тестировании и убедиться, что модели ML работают должным образом, обеспечивая точные и надежные результаты.

(Примечание. Во второй части блога мы рассмотрим методы тестирования градиентов с использованием JAX, Theano и многих других. Мы также рассмотрим некоторые среды тестирования, такие как Nose, и некоторые другие методы тестирования, такие как дымовые тесты, A/ B-тестирование, развертывание Canary, развертывание Blue-green и многое другое в AI/ML, здесь мы будем делать хорошие практические шаги в облаке Azure.В заключительной и третьей части блога мы рассмотрим некоторые интересные исследовательские работы, которые были опубликованы в области тестирования в AI/ML, а затем некоторые стартапы и интересная работа, которую они проделали в этой области, следите за обновлениями!)

Непосредственно перед тем, как я начну, я задал вопрос нашему собственному Azure Open AI ChatGPT: почему инженеры по машинному обучению и специалисты по данным избегают тестирования? и там написано 😂

Потому что это всегда дает им "ложные срабатывания" и "истинно отрицательные"!

Хитеш Хиндуджа

test_input_shape. Этот тест проверяет, соответствует ли выходная форма модели ожидаемой форме при заданной входной форме.

«Хитеш Хиндуджа | LinkedIn»

Тестирование в машинном обучении: подробное руководство с примерами из TensorFlow, PyTorch, Keras…