Прошло почти 3 года с тех пор, как мы начали наши крупные проекты в области искусственного интеллекта в Decathlon. С тех пор мы создали ряд цифровых продуктов, доступных для многих. Среди них - Sport Vision API, который можно использовать для автоматизации добавления тегов к изображениям и их модерации, а также запроса каталога Decathlon по изображению.

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

1) Очистите набор данных

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

Мы усвоили это на собственном горьком опыте, создав приложение для анализа изображений в Instagram. Приложение использует API Sport Vision для определения вида спорта на изображениях, размещенных в Instagram, и данных, которые мы затем используем для определения популярных видов спорта.

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

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

2) Овладейте искусством трансферного обучения

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

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

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

TensorFlow Hub представляет собой очень хороший источник предварительно обученных моделей, обязательно просмотрите его, прежде чем начинать новый проект. В качестве очень общего практического правила мы выяснили, что EfficientNet (классификация изображений), EfficientDet (обнаружение объектов) и Многоязычный универсальный кодировщик предложений (задачи НЛП) - это модели, которые в целом работают хорошо, хотя вы всегда должны попробуйте несколько разных, так как правильная модель сильно зависит от вашего конкретного варианта использования.

3) Настраивайте гиперпараметры как можно раньше и чаще

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

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

Чтобы помочь вам найти правильные гиперпараметры, обязательно используйте библиотеки, такие как scikit-optimize или keras-tuner, чтобы избежать использования неэффективного подхода к поиску по сетке.

4) Узнайте о отсеве, регуляризации L2 и нормализации пакетов

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

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

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

5) Распечатайте матрицу неточностей

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

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

Для начала вы можете использовать scikit-learn для вычисления матрицы путаницы и Plotly heatmaps для визуализации результатов.

6) Используйте легкодоступные вычислительные ресурсы в облаке

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

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

В нашем случае такого ресурса, как Colab Pro, было достаточно, чтобы правильно обучить модели классификации изображений с более чем 150 классами на нескольких сотнях тысяч изображений, настроить гиперпараметры и сгенерировать модели, лежащие в основе Sport Vision API.

7) Найдите время, чтобы правильно настроить конвейер данных

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

Таким образом, для освоения эффективных конвейеров ввода может быть хорошей инвестицией следовать нескольким руководствам по TensorFlow Dataset API. Если вы планируете использовать TPU, также найдите время, чтобы узнать, как правильно извлекать данные из Google Cloud Bucket.

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

8) Разбейте код на более мелкие функции

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

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

Разделите все блоки на небольшие задачи (одна задача = одна функция, максимум 20–30 строк). Выбирайте явные и согласованные имена функций и переменных, добавляйте множество аннотаций, используйте подсказки типов и следуйте стандартам PEP 8, насколько это возможно.

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

9) Научитесь использовать TensorFlow Serving

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

Использование TensorFlow Serving может представлять собой самый простой и наиболее эффективный способ создания API. Использование TensorFlow Serving предполагает сохранение вашей модели в формате SavedModel вместо формата h5, к которому мы привыкли. Вы можете использовать saved_model_cli, чтобы получить всю информацию о вашей SavedModel, необходимую для предоставления ее как REST API.

Чтобы хорошо начать работу с TensorFlow Serving, вы можете взглянуть на несколько руководств, представленных в Google Colab. После того, как вы развернули свой первый API, вы можете перейти к более продвинутым руководствам, чтобы изучить, как оптимизировать время отклика API.

10) Всегда выполняйте конечное тестирование

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

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

Бонусный совет: следите за популярными алгоритмами и методами обучения!

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

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

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

Дополнительная литература

Вам понравилась эта статья? Если да, не стесняйтесь продолжить чтение и взгляните на:

Спасибо за внимание!

🙏🏼 Если вам понравилась статья, подумайте о том, чтобы дать ей несколько.

💌 Узнайте больше о технологических продуктах, открытых для сообщества, и подпишитесь на нашу рассылку на http://developers.decathlon.com

👩‍💻? 👨‍💻? Хотите присоединиться к команде Decathlon Tech Team? Посетите https://developers.decathlon.com/careers

Большое спасибо команде Decathlon Canada AI за комментарии и отзывы.