Можно ли распознать буквенные символы, которые не были предоставлены во время обучения?

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

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

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

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

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

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

Самостоятельным способом было бы использовать слово "встраивание" для названий категорий. Это связано с тем, что встраивание слов уже фиксирует семантическое значение категорий в соответствии с контекстом, в котором названия категорий появились в тексте (например, в корпусе Википедии).

Эксперимент

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

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

После этого мне пришлось разделить набор данных и решить, какие символы будут использоваться в качестве нулевых категорий. Для этого я выбрал пять символов («J», «D», «H», «R», «Z») с относительно разными функциями и отложил все их данные. Остальная часть набора данных с оставшейся 21 категорией была разделена между набором для обучения и тестирования для подбора и тестирования модели.

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

Чтобы оценить и фактически использовать обученную модель, мне пришлось каким-то образом сопоставить предсказанные векторы категорий с соответствующими категориями. Это было сделано с использованием сопоставления ближайшего соседа с евклидовым расстоянием. Сначала я оценил модель по наблюдаемым категориям с помощью набора тестов и достиг точности 96,53%.

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

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

Вторая настройка учитывает все возможные категории во время прогнозирования. Поле, которое занимается этим, называется обобщенным нулевым обучением. Результаты, оцененные таким образом, обычно значительно ниже, поскольку наблюдаемые классы действуют как отвлекающие факторы в пространстве поиска. Так было и в нашем случае, когда модель, оцененная на тех же данных, достигла точности всего 10,83%. Прогнозы для символа R просто почти всегда были ближе к P, предсказания для J - ближе к U и так далее. Один из способов решения этой проблемы можно найти в этой статье.

Заключение

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

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