За пределами триплетной потери: эксперименты с однократным обучением с четырехкратной потерей

Вступление

Эта статья является продолжением моей предыдущей статьи о One Shot Learning, Siamese Networks и Triplet Loss с Keras. Здесь описаны One Shot Learning и Mining, поэтому, если вы еще не знакомы с этими концепциями, я настоятельно рекомендую вам сначала прочитать их.

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

Эта статья посвящена изучению статьи и реализации некоторых концепций исследовательской статьи с помощью Keras.

Edit: Тим Скарф пригласил меня рассказать об этой статье на его канале YouTube. Если вам нужна дополнительная информация по этой теме, загляните в подкаст здесь.

Бумага «QuadLoss»

«За пределами тройной потери: глубокая учетверенная сеть для повторной идентификации человека» была написана в 2017 году, через два года после знаменитой статьи «Facenet», упомянутой в моей предыдущей статье. Область этого исследования - повторная идентификация в контексте системы камер наблюдения, отслеживающих человека с помощью различных камер. Если вы отслеживаете объект с помощью изображений с камеры 1, как вы распознаете этот же объект на изображениях с камеры 2? Задача такого рода очень сложна, потому что один и тот же объект в камере 2 может иметь другую позу, другой угол и даже другое освещение.

Один из способов решения этой проблемы - использовать ту же концепцию, что и Facenet: использовать сиамские сети для кодирования двух изображений, а затем сравнить результат, чтобы определить, похожи они или нет. Это по-прежнему средство сравнения сходства, поэтому вам необходимо обучить свою систему, чтобы она могла «кодировать» человека с соответствующими функциями, которые не зависят от позы, угла и освещения. Какой кошмар. В этом документе много содержания, но его можно резюмировать в 4 частях:

  • Улучшение исходной функции потерь триплетов
  • Выученная метрика
  • Стратегия майнинга
  • Обширное изучение функций потерь

Улучшение триплетных потерь

Напомним, что исходная функция потерь триплетов выглядит так:

Он содержит разницу между расстоянием «Якорь-положительный» и «Якорь-отрицательный», а также имеет гиперпараметр альфа «маржа».

Примечание. В статье используется не слово «привязка», а слово «ссылка» или «ссылка».

Предлагаемое улучшение выглядит так:

Он содержит такую ​​же разницу между расстоянием Anchor-Positive и Anchor-Negative, но они добавили еще один термин: разницу между расстоянием Anchor-Positive и Negative-AnotherNegative. Плюс еще один «маржинальный» гиперпараметр alpha2. Они вводят здесь еще один отрицательный член, который является образцом из класса, отличного от якоря, но также отличного от первого отрицательного. Чтобы вычислить это, нам теперь нужна четверка (Anchor, Positive, Negative, Negative2) вместо триплета, как раньше (Anchor, Positive, Negative). Отсюда и название «Четверная потеря» вместо «Триплетная потеря».

Давайте использовать некоторые обозначения: Якорь = A, Положительный = P, Отрицательный = N, Отрицательный2 = N2. Расстояние между A и P = AP и т. Д. С расстоянием между N и N2 = NN

С нашими обозначениями и игнорированием максимального члена мы имеем:

Потери триплета = AP-AN + alpha1

Четверная потеря = AP-AN + alpha1 + AP-NN + alpha2

В газете они назвали:

  • первый термин «AP-AN + alpha1» - «сильный» толчок (alpha1 = 1)
  • второй термин «AP-NN + alpha2» - «слабый» толчок (альфа2 должен быть ниже = 0,5)

Согласно их исследованиям, это улучшение помогает уменьшить межклассовую дистанцию, а слабый толчок помогает «оттолкнуть отрицательные классы друг от друга» (мое объяснение, а не их). Тем самым улучшается обобщение системы, которая будет лучше работать с невидимыми, реальными данными.

Выученная метрика

В исходном определении функции потерь расстояние вычисляется по формуле L2, что означает:

L2dist (a, b) = (a-b) ²

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

Идея заключается в следующем: если вы сравниваете, скажем, два вектора, функция L2 вычислит значение разности по значению, возведет их в квадрат и все просуммирует. Если ваши векторы были объектами, извлеченными из ваших входных изображений, разница будет применяться единообразно ко всем значениям объектов. Например, небольшая разница во втором элементе (второе значение вашего вектора) будет иметь такой же эффект на конечном расстоянии, как и такая же небольшая разница в третьем элементе (третье значение вашего вектора). Принимая во внимание, что с изученной метрикой каждое значение вашего вектора характеристик может иметь разный вес. Таким образом, небольшая разница во втором элементе может вдвое повлиять на окончательное расстояние, чем такая же небольшая разница в третьем элементе. Или, может быть, эта вторая функция будет иметь вес 3, поэтому небольшая разница в этой функции будет иметь тройное влияние на общее расстояние. Или могут быть еще более сложные нелинейные эффекты между значениями признаков, например «если первое значение высокое, а второе низкое, то нам действительно следует обратить внимание на это другое значение». В конце концов, нейронные сети идеально подходят для моделирования нелинейности, верно? Так что же тогда будет вычислять изученная метрика? Хорошо помните, что эта нейронная сеть будет обучаться вместе с остальной системой, поэтому она (надеюсь) сходится к метрической функции, которая оптимизирует нашу цель, давая нам лучшую формулу для сравнения двух векторов.

Архитектура обучения

Схема обучения слева направо состоит из трех частей.

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

Затем выходы перегруппировываются в три пары: AP, AN и NN (Ref-Pos, Ref-Neg и Neg-Neg2 на чертеже) и проходят через то, что мы можем предположить, является изученной метрической сетью. Это тоже сиамский трюк, поэтому три нарисованные сети на самом деле одинаковы. Изученная метрика заканчивается двоичным softmax, который выводит 2 значения. Один - это вероятность того, что в паре будет один и тот же человек, второй - вероятность того, что в паре будут разные люди. Будет выбран только второй, который будет служить индикатором расстояния или, если хотите, индикатором несходства.

Последняя часть справа - это вычисление функции потерь, на которую подается дерево выходных данных softmax.

Стратегия майнинга

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

  • Легкие образцы - это те, которые генерируют низкие потери или вообще не имеют потерь. Например, позитив, который уже находится очень близко от якоря, и / или изображения негативов, которые уже находятся далеко друг от друга.
  • Жесткие образцы - это те, которые генерируют наибольшую потерю. Например, позитивное изображение, которое находится на значительном расстоянии от привязки, и / или негативное изображение, между которыми есть небольшие расстояния.
  • В середине, на границе полей alpha1 (и alpha2 для 4x), находятся полутвердые образцы.

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

Исследование функции потерь

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

Наша задача

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

Для набора данных мы могли бы использовать MNIST, как мы делали в нашей предыдущей статье, или Fashion MNIST. Но у этих наборов данных есть проблема: MNIST и F-MNIST имеют около 6000 выборок на класс, но только 10 классов. Поскольку в документе упоминаются некоторые обобщающие свойства, на этот раз мы собираемся взять набор данных, специально разработанный для однократной обучающей ситуации: набор данных OMNIGLOT. Набор данных OMNIGLOT содержит 1623 различных рукописных символа из 50 различных алфавитов. Таким образом, вместо 10 классов с 6000 выборками на класс (MNIST) у нас будет 1623 класса только с 20 выборками на класс.

Интересно, что набор данных разделен на набор поездов, состоящий из 964 классов, и тестовый набор из 659 классов. Это означает, что в тестовом наборе есть не только образцы, но и целые классы, с которыми мы никогда не будем тренироваться. И мы ожидаем, что наша система сможет хорошо работать с этими классами, чего она никогда раньше не видела. Это главное отличие от MNIST.

Давайте попробуем некоторые из этих идей

В этой статье мы попытаемся поэкспериментировать с некоторыми идеями из этой статьи и посмотрим, как это решит нашу проблему.

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

  • Тренируйтесь в одно и то же время, на (почти) одних и тех же данных, с одинаковым количеством эпох и с одной и той же стратегией майнинга.
  • Используйте ту же архитектуру нейронной сети для части кодировщика. Два кодировщика начнут с одинаковых параметров, и оба производят вложения одинакового размера (20 в этой статье).

Во вторую систему мы добавим следующие улучшения:

  • Квадруплетная функция потерь путем добавления дополнительного члена к функции потерь dist (A, P) -dist (N, N2)
  • Используйте заученную метрику вместо расстояния L2. Это добавит еще одну нейронную сеть для обучения в системе.

Таким образом, в левом углу у нас будет обычная система триплетных потерь, которую мы назовем «3х», а в правом углу - новый претендент, учетверенная система потерь + изученная метрическая система, которая будет называться «4х». Пусть матч начнется.

Подготовка данных

Этапы подготовки данных включают:

  • загрузка набора данных, что очень просто, поскольку OMNIGLOT является частью репозитория tenorflow-dataset
  • преобразование в оттенки серого
  • нормализация значений пикселей от 0–255 до 0–1

Затем мы организуем набор данных в две версии:

  • Типичная «плоская» версия с X, содержащим все изображения, и Y, содержащим настоящие метки (номера классов), используется в основном для оценки
  • Другая версия отсортирована по классам. поэтому dataset_train [0] содержит все изображения из класса 0 в массиве формы (?, 105,105,1). Эта организация более удобна для выбора образцов из определенного класса, например, для построения четверок (A, P, N, N2)

Используется та же простая стратегия майнинга, что и в предыдущей статье, поэтому для системы 4x:

  • рисуем партию из 100 четверок
  • отбираем 16 самых сложных четверных
  • мы добавляем 16 случайных четверок, чтобы завершить этот пакет из 32 образцов

Поскольку система 3x использует только триплеты, мы делаем следующее:

  • из пакета 100 четверных выше, мы извлекаем первые 3 изображения для APN, делая пакет из 100 триплетов
  • отбираем 16 самых сложных троек
  • мы добавляем 16 случайных троек, чтобы завершить этот пакет из 32 образцов

Построение нашей модели Кераса

Кодировщик

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

Выученная метрика

Для системы 4x нам нужно построить нейронную сеть, которая вводит два вложения и выводит расстояние. Мы выбрали 3 слоя полностью связанных нейронов и, следуя тому, что было сделано в статье, добавили бинарный слой softmax. Мы берем только один результат softmax, потому что нам нужно только одно число, чтобы представить расстояние, на котором мы можем быть «вероятностью того, что эти два вложения будут несхожими». Обратите внимание, что мы объединяем два вложения входных данных для подачи на первый уровень нейронной сети.

Функции потерь

Для нашей системы 3x мы берем такое же определение функции потерь в виде настраиваемого слоя Keras, который принимает вложения A, P и N в качестве входных данных, вычисляет расстояние L2 и суммирует все, чтобы создать потерю.

Примечание: у меня было несколько замечаний по поводу последней «суммы», что она должна быть «средней». Это совершенно верный комментарий, не стесняйтесь использовать средний, он работает так же

Для нашей системы 4x мы используем тот же подход, но здесь входными данными являются расстояния AP, AN и NN (они уже вычислены в другом месте с помощью изученной метрики). Мы возводим их в квадрат и применяем формулу квадруплетных потерь.

Сборка наших моделей Keras

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

То же самое для нашей системы 4x. Обратите внимание, как мы вычисляем расстояния AP, AN и NN с помощью нашей метрической сети перед передачей их в QuadrupletLossLayer в строке 30.

Оценка и метрики

Кривая ROC

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

Если вы возьмете обычный двоичный классификатор, который прогнозирует оценки от 0% до 100% (например, если вы используете softmax), то чем выше оценка, тем выше вероятность принятия решения равной «1». Чем ниже оценка, тем выше вероятность принятия решения «0».

Здесь у нас нет нормального классификатора. Это средство сравнения сходства. Но для нашей цели оценки мы рассматриваем нашу систему как своего рода двоичный классификатор следующим образом: для двух входных изображений наша система предсказывает, являются ли эти два входных изображения одинаковыми (1) или разными (0) в зависимости от расстояния. Чем больше расстояние, тем выше вероятность того, что входы будут разными (0). Чем меньше расстояние, тем выше вероятность совпадения входов (1). Таким образом, наше расстояние здесь действует как счет в моем первом примере, но в инвертированном виде: в моем первом примере счет увеличивается до целевой «1», в то время как в нашем случае расстояние уменьшается до целевой «1».

Итак, чтобы вычислить ROC, создайте два списка y_target и y_true и используйте функцию sklearn roc_auc_score. Списки создаются таким образом:

  1. возьмите все возможные пары из вашего тестового набора,
  2. для каждой пары вычислите расстояние, используя L2 (для 3x) или metric_network (для 4x)
  3. вычислить целевой счет, инвертируя расстояние
  4. добавить это значение в y_score
  5. для y_true добавьте 0, если пара была из разных классов, или добавьте 1, если они были из одного класса

Межклассовое расстояние

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

Примечание. У меня было несколько комментариев по поводу использования центроидов для вычисления метрики межстрочного расстояния. Мне не нравится метод центроида по двум причинам

  1. Центроид - это средняя точка, представляющая весь класс одной точкой. Хотя это определенно быстрее вычислить, он скрывает реальное распределение расстояний, которое вы можете иметь между всеми элементами. Я предпочитаю видеть, насколько растянуты прямоугольники примерно в среднем, а где - наихудшие случаи
  2. Вычисление центроида с расстоянием L2 имеет (своего рода) смысл. Вычисление центроида с использованием нелинейной заученной метрики кажется мне немного сложным. Я постараюсь этого избежать, если только кто-то не сможет провести математические вычисления, чтобы убедиться, что мы не вносим искажений в наш индикатор.

Представляем совокупный показатель CMC для характеристики совпадения

Когда вы используете системы обучения One shot, вы обычно хотите сравнить изображение (назовем его кандидатом) со списком других изображений (назовем его каталогом), чтобы проанализировать, «какой элемент в этом каталоге больше всего похож на моего кандидата. ? » Лучшее совпадение - это совпадение с наименьшим расстоянием во всем каталоге. Если вы оцениваете производительность своей системы, если это наилучшее соответствие соответствует тому же классу, что и ваш кандидат, это действительно положительный результат и учитывается для вашего показателя точности. Если это не тот же класс, значит, это не истинно положительный результат, поэтому это снизит ваш показатель точности.

Но что, если истинный матч был вторым лучшим? Этому показателю точности все равно, он все равно считается неправильным ответом, что немного грубо. Разве вам не нужен индикатор, который может отличать систему, которая может давать второй результат, от системы, которая может давать 10-е место? Вот что делает оценка CMC. В этом индикаторе используются «ранги».

Возьмем пример:

У нас есть кандидат (слева), которого сравнивают с каталогом из 400 классов. Мы упорядочиваем расстояния между кандидатом и всеми элементами каталога от наименьшего (слева) до наибольшего (справа, но мы отображаем только первые 10).

Система А:

Система B:

В этом примере обе системы A и B не могут дать правильный ответ, потому что в обоих случаях ответ rank1 с наименьшим расстоянием не является истинной меткой. Но система B дает ранг 3, тогда как A дает ранг 4. Итак, здесь B работает лучше, чем A.

Оценка CMC - это «вероятность наличия истинного совпадения в пределах первого х ранга».

Поскольку мы хотим, чтобы наша система имела наилучшие возможные ранги для кандидатов, мы также будем использовать CMC для анализа производительности нашей системы 3x и 4x.

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

Тренировочный процесс

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

Вот наша кривая ROC после тренировки:

Теперь расстояние:

И кривая CMC:

Здесь мы видим следующее:

  • обе системы сошлись во что-то как-то полезное. Хотя и не идеальные, обе системы могут распознавать символы, даже если эти системы никогда раньше не видели эти символы, или, по крайней мере, ранжировать их.
  • Согласно кривой ROC и CMC, 3x кажется лучше в этом контексте, чем более сложный 4x

Давайте немного поиграем и опробуем их на нескольких примерах из тестового набора:

Обсуждение

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

  • Для обеих систем не было надлежащих разверток гиперпараметров. Может система 4х лучше работает с другим набором параметров?
  • Может быть, стратегия майнинга важнее, чем мы думали изначально? В статье кажется, что они взяли только самые сложные образцы, что мне кажется очень агрессивной стратегией. Я попытался взять более жесткие образцы из партии, но это ничего не изменило. Мы застряли в локальном оптимуме?
  • Может, метрическая сетевая архитектура не подходит? Моя интуиция подсказывала, что трех слоев должно быть достаточно. Больше слоев казалось излишним и могло привести к чрезмерной подгонке. Может я ошибался?
  • Возможно, сеть кодировщика была слишком простой и не имела достаточной мощности, чтобы раскрыть реальный потенциал четырехкратных потерь и / или изученной метрики. В конце концов, в статье они использовали Resnet, который намного больше, чем тот, который мы выбрали. Или, может быть, 3x лучше всего работает с сетевой архитектурой A, тогда как 4x лучше всего работает с другой сетевой архитектурой B, независимо от того, имеют ли A и B одинаковое количество параметров или нет.
  • Может быть, такой набор данных не подходит для такого рода улучшений?
  • Возможно, эта статья - одна из тех, в которых есть экспериментальные недостатки, описанные в другой статье: Проверка реальности обучения метрической системе. В этой последней статье авторы обнаружили, что результаты некоторых работ по глубокому метрическому обучению в тезисах последних лет (например, той, которую мы изучаем здесь), в лучшем случае переоценены и незначительны. Это могло произойти из-за несправедливого сравнения (вместо того, чтобы сохранять как можно больше параметров постоянным, они увеличили свою архитектуру, а не конкурирующие методы). Это также может быть результатом обучения с обратной связью по набору тестов: модели настраиваются на основе результатов набора тестов, переоснащая их. Другими словами, они не использовали набор проверки, как следовало бы. Другой источник обмана - слабость широко используемых показателей точности: вспомните @ K F1 или NMI, которые считались неуместными или неинформативными.

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

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

Резюме

  • И выученная метрика, и квадлосс - интересные идеи. Изучать их было увлекательно, ведь они по-разному ведут себя, с разной динамикой. Поскольку эти улучшения здесь не помогли, они могут помочь в другом контексте. Поэтому я храню их в своем ящике, готовые к повторному использованию.
  • Авторы этой статьи не смогли убедительно доказать, что 4x лучше в общем смысле. Это заставляет задуматься о том, что при оценке работ требуется большая степень здорового скептицизма.
  • На заметку: в следующий раз возьмите бумагу с доступным кодом. Реализация кода на основе идей - интересный процесс, который заставляет вас углубиться в него, чтобы понять, как он работает. Недостатком является то, что если объяснения из статьи недостаточно конкретны, это может дать вам слишком большую свободу интерпретации.

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

Ссылки и благодарности

Вся моя благодарность

Весь используемый код находится на моем гитхабе там: https://github.com/CrimyTheBold/tripletloss

Последняя статья содержит массу ссылок. Наиболее полезными мне показались следующие:

Мой код CMC был основан на работе от

Если вам интересно узнать о том, как связаны ROC и CMC, вам следует прочитать это Брайан ДеКанн и Арун Росс Связь кривых ROC и CMC

Подробнее о наборе данных OMNIGLOT: веб-сайт есть и связан с статьей Лейк, Б. М., Салахутдинов, Р., и Тененбаум, Дж. Б. (2015). Изучение концепций на уровне человека посредством индукции вероятностной программы . Наука, 350 (6266), 1332–1338.