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

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

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

В этом посте моя цель - предоставить рецепт, которому вы можете следовать, чтобы оценить и использовать модели машинного обучения с открытым исходным кодом для решения ваших собственных задач. Это шаги, которые я использовал снова и снова в своей собственной работе (на момент написания этой статьи у меня было настроено более 15 моделей с открытым исходным кодом в среде anaconda). Поскольку в моей работе в основном используется глубокое обучение для зрения и НЛП, я сосредоточен здесь именно на использовании моделей на основе нейронных сетей.

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

Шаг 1. Назовите свою задачу

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

Есть несколько способов выяснить это. Во-первых, если вы знаете кого-либо из исследователей или практиков машинного обучения, обязательно начните с этого. Другой вариант - спросить в r / machinelearning или r / learnmachinelearning. Если ничего из этого не сработает, следующим шагом будет поиск в Google в меру своих возможностей. По мере того, как вы обращаетесь к исследовательским работам, вы часто будете встречать в литературе название, которое обычно ассоциируется с задачей.

Шаг 2. Найдите документы и код

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

paperwithcode: репозиторий документов и связанного кода, организованный по задачам. Это действительно хорошая отправная точка, особенно если это хорошо известная задача.

arxiv-sanity: Многие модели с открытым исходным кодом связаны с исследовательскими работами. Большинство статей по машинному обучению (к счастью!) Открыто публикуются на arxiv. Еще одно хорошее место для начала - поиск в архиве последних статей, которые решают вашу задачу. Не все опубликованные здесь статьи имеют связанный с ними код. Если вы найдете статью, которая вам понравилась, попробуйте выполнить поиск по запросу ‹ имя бумаги ›github, чтобы узнать, выпущен ли код.

Kaggle: если случится соревнование Kaggle с задачей, аналогичной вашей, это может быть отличным способом получить высококачественные современные модели. Обратите особое внимание на блоги победителей прошлых соревнований, в них часто есть отличные объяснения и код. Маленькие уловки, которые использовались для победы в соревновании, часто могут оказаться действительно полезными и для вашей задачи.

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

Google: для стандартных / распространенных задач, таких как сегментация изображений, поиск по запросу «github сегментации изображений», «pytorch сегментации изображений» или «поток тензорной сегментации изображений» даст много результатов.

Шаг 3. Прочтите документы

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

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

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

Шаг 4. Убедитесь, что код можно использовать

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

Проверьте лицензию. Хотя большая часть кода выпущена под либеральными лицензиями с открытым исходным кодом (MIT, BSD, Apache и т. д.), часть кода - нет. Вы можете обнаружить, что у модели есть лицензия только на некоммерческое использование или ее вообще нет. В зависимости от вашего варианта использования и компании, код может вам пригодиться, а может и нет.

Проверьте фреймворк. Если вы работаете с определенным фреймворком (например, Tensorflow, Pytorch), проверьте фреймворк, в который встроена модель. В большинстве случаев вы застреваете на том, что получаете, но иногда бывает повторная реализация модели в предпочитаемом вами фреймворке. Быстрая проверка в Google (например, «‹ название бумаги ›pytorch») может сэкономить вам много хлопот.

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

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

Шаг 5. Запустите модель

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

Создайте среду conda для модели: вы можете пробовать несколько моделей, поэтому создайте среду conda (предполагая Python) для каждой модели (nvidia-docker - еще один вариант здесь, но лично я нахожу это быть перебором).

Я часто настраиваю свою среду так: conda create -n <name of the github repo> python=<same version of python used by the repo>

Быстрый способ выяснить, какую версию python использует репо, - это посмотреть на операторы print. Если скобок нет, это python 2.7, в противном случае должен работать 3.6.

Установите библиотеки. Я настоятельно рекомендую начать с установки той же версии фреймворка, которая использовалась для запуска в исходном коде. Если модель говорит, что работает с pytorch>0.4.0, не думайте, что она будет работать с pytorch 1.0. На данном этапе вы не хотите исправлять подобные ошибки, поэтому начните с pytorch=0.4.0. Вы можете установить определенную версию фреймворка (например, pytorch) с помощью команды conda install pytorch=0.4.0 -c pytorch. У большого количества кода не будет requirements.txt файла, поэтому может потребоваться некоторое изучение и повторение, чтобы выяснить все библиотеки, которые вам нужно установить.

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

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

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

Шаг 6. Создайте собственную записную книжку для тестирования

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

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

Шаг 7. Создайте собственную записную книжку с набором данных.

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

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

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

Шаг 8: Начните модифицировать модель в соответствии с вашей задачей!

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

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

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

Как можно чаще используйте предварительно обученную модель. Если ваша модель не является радикальной, попробуйте повторно использовать параметры предварительно обученной модели. Вы можете получить более быстрые результаты и преимущества трансферного обучения. Даже если вы расширяете модель, вы часто можете загрузить предварительно обученные параметры в остальную часть модели (например, использовать strict=False при загрузке модели в pytorch).

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

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

Шаг 9: Атрибут и содействие

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

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