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

Часто энтузиазм сообщества разработчиков ПО может показаться необоснованным или даже фанатичным. Итак, перед тем, как я продолжу, расскажу анекдот: во время первого использования NeuroSky Mindwave Mobile пару лет назад устройство не могло связываться с моим компьютером; Мне нужны были данные с устройства на моем компьютере в сценарии Python, и я, естественно, расстраивался. Примерно через неделю возни, редактирования файлов конфигурации на уровне ядра и работы с сокетами я смог заставить его работать. Конечно, если бы я использовал популярную систему с закрытым исходным кодом, скорее всего, я смог бы заставить устройство работать быстрее. Но прохождение всего этого процесса было похоже на паломничество в области операционных систем, электроники и сигналов. Более того, я полностью контролировал, как мой ноутбук взаимодействует с устройством.

Породы с открытым исходным кодом. Это действительно так.

А в последние годы многие библиотеки машинного обучения с открытым исходным кодом (ML) стали чем-то вроде золотого стандарта как для энтузиастов машинного обучения, так и для профессионалов. Некоторые из самых популярных - это scikit-learn, tensorflow, pytorch и mlpack.

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

Что такое энсмаллен?

Библиотека Ensmallen описывается как гибкая библиотека C ++ для эффективной математической оптимизации.

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

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

Что такое модульное тестирование?

Тестирование определенных частей кода в широком смысле называется модульным тестированием.

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

Чем полезно модульное тестирование?

В mlpack есть тесты, основанные на Boost Unit Test Framework, а у Ensmallen есть тесты, основанные на Catch2 Unit Test Framework. Обе эти библиотеки создают несколько тестовых примеров для каждой включенной базовой функции. В mlpack некоторые тесты включают запуск алгоритма классификации или регрессии с небольшим набором данных и проверку точности метода относительно ожидаемой производительности. Для Ensmallen это проще, поскольку в библиотеке присутствует набор функций, и каждому оптимизатору предоставляется соответствующее подмножество тестовых функций для оптимизации; здесь результаты сравниваются с тем, что известно и установлено о глобальном оптимуме каждой из тестовых функций.

Средства, позволяющие пользователям систематически тестировать программное обеспечение

Как только любой проект будет скомпилирован и собран, тесты можно будет запускать. Вот пример из Ensmallen:

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

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

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

Вот еще один анекдот. Во время тестирования некоторых функций, которые я создавал для библиотеки ensmallen, я заметил, что конкретный тест, связанный с оптимизатором SPSA, неоднократно терпел неудачу. Сообщая о своем прогрессе сопровождающим в канале mlpack IRC, я упомянул об этом мимоходом. Однако это сразу же подтвердил другой разработчик в сообществе, Рахул Прабху, так как он столкнулся с той же ошибкой во время продвижения своего проекта. Наши комментарии привлекли внимание ведущего разработчика, Райана Кертина. Райан немедленно приступил к работе над ошибкой, открыл запросы на извлечение для исправления и устранил проблему всего за два дня. С тех пор я больше не сталкивался с подобной неудачей.

Звучит довольно круто, правда?

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

Истинный дух открытого исходного кода

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

Что еще мы можем сделать?

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