Привет, народ :-)

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

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

Давайте сначала разберемся, что такое самостоятельное обучение и как оно помогает в решении указанной выше проблемы ручной маркировки (или, по крайней мере, минимизировать ее).

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

Проблема:

Рассмотрим задачу классификации изображений, скажем, с 1000 классами. И у нас есть немаркированные данные (скажем, 1 миллион изображений), охватывающие эти 1000 классов. Как мы подойдем к решению этой проблемы?

  1. Во-первых, нам нужно вручную аннотировать эти изображения.
  2. При необходимости примените аугментации.
  3. Затем просто обучите классификатор, скажем, resnet50 магистралью - с помощью ImageNet предварительно обученные веса или случайные веса.

Шаги 2 и 3 очень просты. Если у вас есть необходимые рамки, вы можете быстро дополнить и обучить классификатор.

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

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

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

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

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

Решение:

1. Передача обучения:

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

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

Кстати, почему я говорю, что это лучше, чем случайная инициализация?

Это потому, что это помогает в достижении более высокой точности и более быстрой сходимости!

Отлично, но как?

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

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

Таким образом, автоматически наш следующий подход - изучить репрезентации из этого немаркированного целевого дистрибутива!

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

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

2. Самостоятельное обучение:

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

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

а. Автоэнкодеры:

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

Автоэнкодер выглядит так:

  • В нашем случае входом и выходом будет изображение.

Сеть принимает изображение и выводит то же изображение. Обычно используется потеря MSE. Здесь главное отметить код (или встраивание). Это представляет функции, извлеченные из входных данных.

Как это помогает в решении нашей проблемы?

Мы можем обучить автоэнкодер (кодировщик resnet50 с выводом avgpool в конце в качестве встраивания) на наших немаркированных данных, загрузить веса кодировщика и обучиться на помеченном подмножестве.

б. Образцы CNN:

Документ: - Дискриминационное неконтролируемое обучение функций с помощью образцовых сверточных нейронных сетей

Авторы предлагают следующую методику:

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

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

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

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

c. Контрастное обучение - SimCLR:

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

Предлагаемый подход:

  1. Во время обучения возьмите образец пакета N немаркированных изображений.
  2. Для каждого изображения примените два преобразования - случайное кадрирование и изменение размера, создав два изображения, которые считаются положительными образцами. . Остальные (N-1) изображений в том же пакете считаются отрицательными образцами. Теперь обучите классификатора этим двум классам. Этот процесс повторяется для каждого изображения в пакете.
  3. Используемый базовый кодировщик - это Resnet50 (2048), за которым следует двухуровневый MLP, который преобразует представление из 2048 в 128 размерность.
  4. Используемые потери - NT-Xent (нормализованная кросс-энтропийная потеря, измеренная по температуре).

где sim = косинусное подобие, 𝟙 ∈ {0, 1}, если ki, и τ обозначает температурный параметр.

Цель состоит в том, чтобы изучить аналогичные представления для двух позитивных изображений и остальных негативных изображений N-1, чтобы иметь представления, полностью отличные от этих двух. Но как этого добиться?

  1. Вычислить косинусное сходство для всех пар внедрения в пакете.
  2. Для каждой положительной пары (i, j) мы вычисляем нормализованный показатель сходства и минимизируем его, используя потеря журнала / потеря CE
  3. Это делается для всех изображений в пакете (2N), и в конце берется среднее.

Однако здесь есть один важный момент:

Как мы можем гарантировать, что изображения (N-1), используемые для отрицательного класса в партии, не содержат положительного образца, если мы вообще не знаем их ярлыков?

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

Другие задачи с общим предлогом:

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

  1. Генеративные состязательные сети: мы можем обучить GAN генерировать изображения из нашего распределения немаркированных данных, использовать весовые коэффициенты генератора (т. е. кодировщика) и переобучить наше помеченное подмножество.
  2. Прогнозирование поворота изображения - Обучение представлению без учителя путем прогнозирования поворота изображения
  3. Предсказание относительного положения патча относительно другого патча на изображении - Обучение визуальному представлению без учителя с помощью предсказания контекста

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

  1. Дискриминационное неконтролируемое изучение функций с помощью образцовых сверточных нейронных сетей.
  2. Простая структура для сравнительного изучения визуальных представлений.
  3. Https://lilianweng.github.io/lil-log/2019/11/10/self-supervised-learning.html