Год назад я только что услышал об обучении Zero-Shot и поискал в Интернете больше информации. К сожалению, тогда не удалось найти какой-либо полезный материал, который бы объяснял эту тему простым и понятным языком, потому что это была довольно новая тема для исследований. Были исследовательские работы, в основном сосредоточенные на технических аспектах, и только пара кратких объяснений. Тем не менее, это не сильно изменилось. Поэтому я решил поделиться своим опытом / знаниями здесь, вместо того, чтобы скрывать это от себя, после года проведения соответствующего проекта по этой теме.

Что такое безупречное обучение?

Метод обучения Zero-Shot направлен на решение задачи без получения какого-либо примера этой задачи на этапе обучения. Задача распознавания объекта по заданному изображению, на котором не было каких-либо изображений этого объекта на этапе обучения, может рассматриваться как пример задания Zero-Shot Learning. Фактически, это просто позволяет нам распознавать объекты, которых мы раньше не видели.

Зачем нам нужно обучение без выстрела?

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

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

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

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

Давайте начнем

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

Подход

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

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

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

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

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

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

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

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

Сбор данных

В качестве первой работы нам необходимо собрать данные изображения, которые требуются на этапе обучения и на этапе оценки, чтобы измерить производительность Zero-Shot после обучения. Я собрал данные из Visual Genome и решил использовать всего 20 классов, из которых 15 классов выбраны для обучения и 5 классов выбраны как классы Zero-Shot.

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

Помните, что мы не собираемся использовать классы Zero-Shot во время обучения.

Извлечение функций изображения и формирование набора данных

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

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

Вложения слов

После того, как мы извлекли элементы изображения и сформировали наборы данных, теперь мы должны собрать другие представления классов, а именно вложения слов. Мы будем использовать представление Google Word2Vec, обученное на документах Google News. Мы получим Wor2Vec с 300 измерениями для каждого из 20 указанных нами классов объектов.

Модельное обучение

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

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

Для задачи категориальной классификации ReLU используется в качестве функции активации на каждом уровне, кроме выходного уровня, где вместо этого используется распределение вероятностей - функция softmax.

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

Мы достигли достаточно хороших результатов, использовав 15 учебных классов для обучения.

Модель нулевого выстрела

На данный момент наша обученная модель выглядит так.

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

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

Оценка модели нулевого выстрела

Мы создали модель Zero-Shot. Пришло время измерить его производительность. Мы будем использовать уже определенные образцы классов Zero-Shot. Мы не использовали эти образцы ни на одном этапе обучения модели. Вспомним эти классы: машина, еда, рука, человек и шея. Мы собрали 400 изображений для каждого класса (всего 2000 изображений) и, просто выполнив классификацию Zero-Shot - используя 300 размерных выходных векторов - мы измерим производительность модели.

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

Теперь, когда мы выполнили оценку, давайте посмотрим на производительность модели Zero-Shot.

Точность топ-5 составляет почти 79%. Помните, что мы можем классифицировать изображения, которые никогда раньше не видели - модель не знает, как выглядят объекты, принадлежащие этим классам - с этими процентами точности, что совсем неплохо! Помните, что модели дается только информация о том, где векторы слов этих классов расположены в пространстве векторов слов. Это лучше, чем случайная классификация.

Точность не всегда бывает такой высокой (79%), потому что действительно сложно классифицировать мелкозернистые категории объектов с высокой точностью. В нашем случае я выбрал относительно дискретные ежедневные классы объектов, чтобы показать, как работает алгоритм обучения с нулевым выстрелом и может быть реализован. Это должно объяснить высокую точность. Если вы помните из вводной части, я приводил примеры проблем с мелкозернистыми объектами, такими как классификация видов деревьев / рыб. Это проблемы, над которыми было бы разумно попробовать обучение с нулевым выстрелом.

Заключение

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

Ее можно использовать в качестве базовой системы для многих проектов в будущем: вспомогательная встроенная система для людей с ослабленным зрением может быть разработана с использованием обучения Zero-Shot. Камеры наблюдения за естественной жизнью могут использовать обучение Zero-Shot для обнаружения и подсчета редких животных в их собственной среде обитания.

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

Спасибо за прочтение. Надеюсь, это поможет.

Не забудьте заглянуть в мой репозиторий GitHub для более детальной работы и не стесняйтесь покупать мне кофе :)