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

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

В этой статье на вводном уровне будет объяснено MTL и показано, как реализовать и обучить его на реальных данных с помощью модуля Keras из tensorflow. Полный код вместе с Jupyter Notebook, в котором вы можете поэкспериментировать с тем, что вы узнали, можно найти в моем репозитории GitHub:



Предварительная обработка данных

Чтобы объяснение было понятным и простым, будет использоваться набор данных CIFAR-10 [2], доступный по лицензии MIT. Этот набор данных состоит из 60 000 изображений RGB размером 32x32 пикселя, которые классифицируются по 10 различным классам. Он разделен на 50000 обучающих выборок и 10000 тестовых выборок и идеально сбалансирован, что означает, что набор данных содержит 6000 изображений на класс. Набор данных можно легко загрузить, выполнив:

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

  • Задание 1:многоклассовая классификация на модифицированном наборе данных CIFAR10 (самолет, автомобиль, птица, кошка, собака, лягушка, корабль и грузовикярлыки, модификации описаны ниже).
  • Задание 2: бинарная классификация (метки животное и транспортное средство).

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

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

Имея это в виду и чтобы иметь сбалансированный набор данных для обучения, экземпляры классов, принадлежащих оленю и лошади, будут удалены. Это делается потому, что изначально набор данных содержит 30 000 образцов, принадлежащих животным (5000 образцов x 6 классов), и только 20 000 образцов, принадлежащих транспортным средствам (5000 образцов x 4 класса), что приведет к дисбалансу набора данных в отношении задачи бинарной классификации. Экземпляры лошадей и оленей удалены, потому что они имеют очень похожие черты с кошками и собаками и, следовательно, могут усложнить обучение, так как будет сложнее различать экземпляры этих классов.

Обратите внимание, что после этой очистки метки имеют следующие классы: [0, 1, 2, 3, 5, 6, 8, 9] (отсутствуют 4 и 7, соответствующие оленю и лошади соответственно). Поэтому необходимо будет обновить метки, чтобы они были пронумерованы от 0 до 7, шаг, который можно найти в блокноте Jupyter в моем репозитории. Тем не менее, попробуйте закодировать его самостоятельно для лучшего обучения!

Для многозадачного обучения важно, чтобы метки обучения соответствовали задачам. Таким образом, в n-задачном обучении будет определено n массивов различных меток. В этом случае первая задача требует, чтобы метки были целыми числами от 0 до 7 (по одному числу для каждого класса), а вторая задача требует, чтобы метки были 0 и 1 (поскольку это бинарная классификация). Данные были предварительно обработаны так, чтобы метки представляли собой цифры от 0 до 7, и, как и ожидалось, метки для бинарной классификации будут построены на основе исходных меток от 0 до 7, так что, если экземпляр соответствует животному, он будет 0, и будет 1, когда он соответствует транспортному средству.

Создайте модель

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

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

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

Обратите внимание, что когда ɣ равно 0, модель получит только потери, полученные в Задаче 2, тогда как, если ɣ равно 1, модель получит потери в Задаче 1. Это позволяет обучать модель только для задачи 1 (если ɣ = 1), только для задачи 2 (если ɣ = 0) или для обеих задач (если 0 ‹ ɣ ‹ 1), что позволяет использовать модель для нескольких сценариев в зависимости от того, что требуется от модели.

Совместную функцию потерь можно определить в ранее созданной модели при компиляции, указав веса для функции потерь каждой ветви модели в параметре loss_weights. См. функцию ниже.

Обучите модель

После предварительной обработки данных и определения модели для обеих задач наступает время ее обучения. Для обучения используется метод .fit(), который, в отличие от определения обычной модели, получает столько массивов, сколько ветвей/выходов в модели как y параметр. С другой стороны, как и в случае с обычными моделями, необходимо указать размер партии и количество эпох. В этом случае будет использоваться пакет размером 128, и он будет обучаться в течение 15 эпох.

Модель обучается с тремя разными значениями гаммы: 0, 0,5 и 1, а код измеряет и печатает время выполнения каждого обучения. .

Оцените производительность моделей

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

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

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

Заключение

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

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

Рекомендации

[1]КРОШОУ, Майкл. Многозадачное обучение с помощью глубоких нейронных сетей: обзор. препринт arXiv arXiv:2009.09796, 2020 г.

[2] Домашняя страница:



API тензорного потока: