Реализация SIAMESE и триплетных сетей Pytorch для обучения встраиванию.
Сиамские и триплетные сети полезны для изучения отображения от изображения в компактное евклидовое пространство, где расстояния соответствуют меру сходства [2]. Внедрения, обученные таким образом, могут использоваться в качестве векторов функций для классификации или нескольких выстрелов.
Требуется Pytorch 0,4 с Tourvision 0.2.1
Для Pytorch 0,3 Compatibility Tag Tag TACK-0.3.1
Мы тренируем встраивание на наборе данных MNIST. Эксперименты проводились в ноутбуке Юпитера.
Мы пройдемся через встроенные функции обучения, используя различные функции потерь в наборе данных MNIST. Это только для целей визуализации, таким образом, мы будем использовать 2-мерные встраивания, что не является лучшим выбором на практике.
Для каждого эксперимента используется одна и та же самая сеть встраивания (32 conv 5x5 -> prelu -> maxpool 2x2 -> 64 conv 5x5 -> prelu -> maxpool 2x2 -> плотный 256 -> Prelu -> Плотный 256 -> Prelu -> Dense 2), и мы не выполняем поиск гиперпараметрического.
Мы добавляем полностью связанный слой с количеством классов и обучаем сеть для классификации с помощью SoftMax и поперечной энтропии. Сеть тренируется до ~ 99% точности. Мы извлекаем 2 размерных встроения из предпоследнего слоя:
Набор поездов:

Тестовый набор:

В то время как встроения выглядят отделимыми (для чего мы их обучили), у них нет хороших метрических свойств. Они могут быть не лучшим выбором в качестве дескриптора для новых классов.
Теперь мы тренируем сиамскую сеть, которая снимает пару изображений и поезда построения, чтобы расстояние между ними было сведено к минимуму, если они из одного класса и больше, чем какое -то значение, если они представляют разные классы. Мы сведем к минимуму функцию контрастной потери [1]:

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

Тестовый набор:

Ученые встраивания сгруппированы намного лучше в классе.
Мы тренируем триплетную сеть, которая принимает якорь, положительный (тот же класс, что и примеры, и отрицательные (из разных классов, чем якорь). Цель состоит в том, чтобы изучить встраиваемые встроения таким образом, чтобы якорь ближе к положительному примеру, чем к отрицательному примеру с некоторым значением маржи.
Источник: Шрофф, Флориан, Дмитрий Калениченко и Джеймс Филбин. FACENET: единое внедрение для распознавания лица и кластеризации. CVPR 2015.
Потеря триплета : 
Образцы класса Tripletmnist Положительный и отрицательный пример для каждого возможного якоря.
После 20 эпох тренировок вот встроенные встроения, которые мы получаем для тренировочного набора:

Тестовый набор:

Ученые встраивания не так близки друг к другу в классе, как в случае сиамской сети, но это не то, на что мы их оптимизировали. Мы хотели, чтобы встраиваемые были ближе к другим вставкам из того же класса, чем от других классов, и мы видим, где идет тренировка.
Есть пара проблем с сиамскими и триплетными сетями:
Чтобы эффективно решать эти проблемы, мы будем питать сеть со стандартными мини-партиями, как мы делали для классификации. Функция потерь будет отвечать за выбор жестких пар и триплетов в мини-партии. Если мы подаем сеть с 16 изображениями на 10 классов, мы можем обработать до 159*160/2 = 12720 пар и 10*16*15/2*(9*16) = 172800 триплетов по сравнению с 80 пар и 53 триплета в предыдущей реализации.
Обычно это не самая лучшая идея для обработки всех возможных пар или триплетов в мини-партии. Мы можем найти некоторые стратегии о том, как выбрать триплеты в [2] и [3].
Мы будем питать сеть с мини-партиями, как и для классификационной сети. На этот раз мы будем использовать специальный пакет пакетов, который будет пробежать N_CLASSES и N_SAMPLES в каждом классе, что приведет к мини -партиям размера n_classes*n_samples .
Для каждой мини -партии положительные и отрицательные пары будут выбираются с использованием предоставленных меток.
MNIST - это довольно простой набор данных, и встраивания из случайно выбранных пар уже были довольно хорошими, мы не видим большого улучшения здесь.
Поездка встраивания:

Тестовые встраивания:

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

Тестовый набор:

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

Сиамская сеть со случайно выбранными парами

Онлайн контрастная потеря с негативной добычей

Триплетная сеть со случайными триплетами

Онлайн -потеря триплета с негативной добычей

[1] Райя Хадселл, Сумит Чопра, Янн Лекун, Сокращение размерности путем изучения инвариантного картирования, CVPR 2006
[2] Шрофф, Флориан, Дмитрий Калениченко и Джеймс Филбин. FACENET: единое внедрение для распознавания лица и кластеризации. CVPR 2015
[3] Александр Херманс, Лукас Бейер, Бастиан Лейбе, в защиту триплетного потери для личности, переоснастка, 2017
[4] Брэндон Амос, Бартош Людвичжук, Махадев Сатьянараянан, Openface: библиотека распознавания лиц общего назначения с мобильными приложениями, 2016
[5] Yi Sun, Xiaogang Wang, Xiaoou Tang, глубокое обучение лицевое представление с помощью совместной идентификации, NIPS 2014