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

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

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

Шаги по использованию трансферного обучения

  1. Найдите подходящую сеть, обученную решению большой сложной задачи компьютерного зрения. Эти сети были обучены на миллионах выборок данных со многими слоями. Их называют предварительно обученными сетями. Примерами предварительно обученных сетей являются Inception-V3, VGG16, VGG19 и т. д. Предварительно обученная сеть, которую вы выбрали для использования, называется исходным доменом.
  2. Удалите последний слой предварительно обученной сети, которую вы выбрали, и, возможно, дополнительные полносвязные слои.
  3. Замените слои, которые вы удалили на шаге 2, слоями, соответствующими вашей новой проблеме (задаче). Этот замещающий уровень называется целевым доменом.
  4. В некоторых случаях заморозьте все слои, которые уже обучены в выбранной предварительно обученной сети (исходный домен). Это делается для того, чтобы их веса не изменились в ходе обучения сети на данных целевого домена.
  5. Обучите сеть на данных целевого домена.
  6. При желании настройте сеть в зависимости от поставленной задачи.

Вот некоторые из правил:

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

Шаг 1–5 выше часто называют методом извлечения признаков. Причина, по которой это называется извлечением признаков, заключается в том, что мы используем выбранную предварительно обученную сеть (исходный домен) для извлечения визуальных признаков из нашего целевого домена. В этом случае мы используем небольшую нейронную сеть, прикрепленную к сети извлечения признаков, чтобы выполнить требуемую задачу для целевого домена. В некоторых случаях шагов с 1 по 5 может быть достаточно в зависимости от вашей задачи и используемого набора данных. Вы можете решить настроить всю сеть (шаг 6). Это необязательно, так как зависит от ваших целей и результата, полученного от шага 1 до шага 5.

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

Когда использовать трансферное обучение

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

Если мы хотим выполнить перенос обучения из исходного домена (A) в целевой домен (B). То есть перевод из А в Б будет иметь смысл, если:

  1. A и B имеют одинаковый вход. Пример Изображение/изображение или аудио/аудио и т. д.
  2. У вас гораздо больше данных для A, чем для B.
  3. Низкоуровневые функции из A могут быть полезны для изучения B.
  4. А решает аналогичную задачу, которую пытается решить Б.

Сходство в проблеме доменов

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

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

Основные моменты описанных выше шагов по трансферному обучению

Выбор сети и удаление верхнего слоя: если мы хотим классифицировать изображения как кошку или собаку, как указано выше, мы можем выбрать предварительно обученную сеть, которая была обучена на изображениях, связанных с кошкой или собакой. . В этом случае мы можем выбрать предварительно обученную сеть, например InceptionV3. Этот InceptionV3 подходит для использования в качестве исходного домена, поскольку существует сходство между исходным доменом (InceptionV3) и нашим целевым доменом, который должен классифицировать изображения как собаку или кошку. Следует отметить, что сеть Inception-V3 состоит из нескольких начальных модулей, установленных друг над другом. Последние два слоя полностью связаны, а выходной слой представляет собой softmax на 1000 нейронов. Предполагая, что мы используем Keras, мы можем загрузить сеть InceptionV3, как показано в следующих фрагментах кода.

из keras.applications.inception-v3 импортировать InceptionV3

our_model = InceptionV3 (веса = ‘imagenet’, include_top = False)

Напомним, что мы говорили ранее, что нам нужно удалить верхний слой предварительно обученной сети (Source Domain). Из приведенного выше фрагмента кода вы можете заметить «include_top = False». include_top = False используется для удаления последнего слоя из предварительно обученной сети (InceptionV3) по мере ее загрузки.

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

X = наша_модель.выход

X = GlobalAveragePooling2D()(X)

X = плотный (1024, активация = «relu») (X)

classifier_layer = Плотный (1, активация = «сигмоид») (X)

Model = Model(inputs=our_model.input, outputs=classifier_layer) #модель для обучения.

Мы использовали GlobalAveragePooling2D в приведенных выше фрагментах кода, чтобы свести 4D-выход предыдущего слоя в 2D-слой, который будет подходить для нашего полностью связанного слоя путем усреднения.

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

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

для слоя в our_model.layers:

слой.trainable = Ложь

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

После подготовки данных можно приступать к обучению (извлечению признаков). Результат, полученный после извлечения признаков или первого обучения, определит, сможем ли мы приступить к тонкой настройке сети. Проще говоря, у нас может быть две разные модели обучения. Первое обучение (извлечение признаков) — это обучение сети с замороженной сетью, с корректировкой только весов полносвязных слоев. Затем другая тренировка (тонкая настройка), мы разморозим некоторые слои и снова потренируемся. Сколько слоев вы разморозите, зависит от вас, и вы можете разморозить столько слоев сети, сколько захотите. Тем не менее, на практике обычно выгодно размораживать самые верхние слои. Помимо размораживания слоев, вы также можете выбрать поиск различных гиперпараметров на этапе тонкой настройки. Вы можете решить использовать стохастический градиентный спуск (SGD) с различными скоростями обучения и импульсом, чтобы посмотреть, как это повлияет на полученный результат. Приятно корректировать веса очень медленно во время точной настройки, чтобы сеть не делала слишком большой скачок в неправильном направлении.

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

Исходные домены:

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

  1. VGG-16: около 138 миллионов параметров. Относительная однородность сети делает ее весьма привлекательной.
  2. Остаточная сеть (ResNet): ее можно использовать для обучения гораздо большей сети без потери производительности. Это предотвращает взрыв градиентного спуска.
  3. MobileNet: использует низкие вычислительные затраты при развертывании. Это полезно для мобильных и встроенных приложений машинного зрения.
  4. EfficientNet: помогает увеличивать или уменьшать масштаб сети в соответствии с вычислительными ресурсами.

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

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

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