Вили Ван, Джон Инакей и Майк Ван

Одна из новых концепций в области глубокого обучения - Few Shot Learning. Если вы изучали машинное обучение или глубокое обучение, вы, вероятно, слышали этот термин раньше. Но что это? Как это на самом деле работает? Мы углубимся в тему и покажем один из способов выполнения краткого обучения через сети-близнецы. Ниже мы узнаем, как построить систему One Shot Learning с использованием Twin Networks. Вы можете найти нашу реализацию Twin Network в PyTorch здесь.

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

Прежде всего, что это такое и почему вы должны изучать Few Shot Learning? Алгоритмы глубокого обучения, как известно, требуют массивных наборов данных для выполнения своей целевой задачи. Однако получение и маркировка больших объемов данных часто требует много времени и средств. Метод обучения с учителем требует большего количества данных для выполнения большего числа задач. Для типичной задачи классификации нам нужна большая выборка каждого класса. Однако, если мы переосмыслим задачу классификации глубокого обучения как прямой ввод 1 к 1 для функции маркировки, мы сможем найти способы по-прежнему работать с меньшими наборами данных. Основная цель Few Shot Learning - дать возможность алгоритмам глубокого обучения работать в случаях ограниченных данных по прямой задаче.

Что такое двойная сеть?

Двойная сеть использует две идентично структурированные нейронные сети в качестве магистралей, два выхода которых передаются в другую функцию или сеть для окончательного результата. Когда каждая сеть принимает свои собственные входные данные, эта сетевая структура действует как агент сравнения, обеспечивая эквивалентность функции подобия. В нашем примере мы используем две сверточные нейронные сети (CNN) в качестве магистралей. Традиционные CNN часто используются в качестве классификаторов, принимая один ввод и отправляя его вывод непосредственно на уровень (уровни) классификации. Посредством обучения единый классификатор CNN учится различать определенные классы на основе достаточного количества примеров от начала до конца. В двойной сети взаимосвязь изображений, принадлежащих к одному классу, от изображений, принадлежащих разным классам, изучается от начала до конца. Twin Networks обучается через Contrastive Loss, функцию потерь, которая минимизирует, когда два входа принадлежат одному классу, и максимизирует, когда два входа принадлежат разным классам.

Рисунок 1. Пример обучающего пакета, в котором изображение из x1 сравнивается с соответствующим изображением из x2. Массив потерь показывает, что изображения одного и того же фрукта имеют метку 0, а изображения разных фруктов имеют метку 1. Наша цель состоит в том, чтобы Twin Network автоматически научилась выполнять эту задачу.

Что такое N-Way K-Shot Learning?

Одним из примеров реализации Few Shot Learning является применение N-Way K-Shot Learning с двойной сетью. Мы сравниваем входное изображение с N классами по K изображений в каждом и выбираем наиболее вероятный класс, в котором потери триплетов наименьшие. Например, задача 5-Way 2-shot объединяет наше входное изображение с 5 другими классами с 2 примерами каждого класса, в результате получается 10 изображений, с которыми мы сравниваем.

С помощью Twin Network мы генерируем вложение для каждого изображения. Последний уровень Twin Network выполняет сравнение двух внедрений каждого изображения. Если мы рассмотрим выходы Twin Network как функцию расстояния, N-Way K-Shot Learning похож на алгоритм ближайшего соседа.

Наша реализация метода обучения по принципу `` немногочисленные выстрелы ''

Чтобы попрактиковаться в обучении методом Few Shot Learning, мы решили проблему классификации фруктов с помощью набора данных Kaggle Fruits 360. Опять же, нашу реализацию можно найти здесь.

Для начала мы предварительно обрабатываем данные для потребления pytorch. Затем мы определяем двойную сеть, используя одну и ту же магистраль CNN для генерации функций для каждого изображения в паре. Мы вычисляем сходство между двумя выходами CNN, беря абсолютную разницу и передавая ее через сигмовидную функцию, насыщая конечные выходы до 0 или 1, чтобы соответствовать нашим наземным меткам истинности. Для обучения мы передаем пакеты пар изображений и оцениваем моделируйте каждые 250 партий с помощью 20-этапной однократной задачи.

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

Другое приложение: распознавание лиц

Как вы используете Twin Network для выполнения One Shot Learning? Одним из наиболее распространенных вариантов использования One Shot Learning является распознавание лиц. В примере сценария вы можете захотеть разработать систему, которая распознает пользователя только по одной справочной фотографии. Важно отметить, что наша система никогда раньше не видела этого пользователя. Предполагая, что мы уже обучили Twin Network сравнивать лица, мы можем сравнивать разные фотографии людей с нашей эталонной фотографией. Мы можем предоставить эталонную фотографию на левый вход Twin Network, а другие фотографии - на правый вход. Затем Twin Network скажет, являются ли входы одним и тем же человеком или нет. Наша система One Shot Learning будет успешной, если мы правильно распознаем только целевого пользователя. На практике этот метод сопоставим с K ближайших соседей (примечание: K не означает то же самое в этом методе), где мы классифицируем входные данные, сравнивая его с его ближайшими примерами и их метками / классификациями. .

Секреты и уловки

Очень важно установить правильную скорость обучения для вашего оптимизатора. Когда мы впервые начали тренировать нашу Twin Network, величина потерь изначально оставалась постоянной на протяжении всего тренировочного процесса. Сначала мы думали, что наша реализация Twin Network не обучается или что наши обучающие данные были отформатированы неправильно. После более глубокого изучения проблемы мы, наконец, обнаружили, что скорость обучения нашего оптимизатора была слишком высокой, а это означало, что процесс оптимизации расходился, а не сходился. После снижения скорости обучения до 0,0001 величина потерь в сети начала уменьшаться. Наш опыт показывает, насколько расхождения в нейронной сети могут быть незаметными и трудными.

Вывод

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

использованная литература