ImageNet — классификация на 1000 классов, 1.3M изображений в обучающей выборке, ~ 150 GiB.
— Для текстов, обычно решают задачу языкового моделирования, на набирающем популярность датасет The Pile ~ 825 GiB.
Дообучаемся на более похожем на нашу задачу размеченном датасете (если такой есть; если нет пропускаем этот шаг).
Оставляем только первые $L$ слоёв
Aктивации слоя $L$ берём в качестве представлений объектов
🔧 Агрегируем активации по пространственным координатам, чтобы получить вектор для каждого объекта. Часто используется покомпонентное среднее или максимум (скажем, глобальный пулинг для изображений).
Используем признаки или предобученные веса для решения целевой задачи (downstream problem)
Об алгоритме: Supervised подход можно применять для различных типов данных. Всё, что нужно — это большой размеченный датасет, хоть и отдалённо, но похожий на целевые данные. Для музыки это может быть задача классификации жанра, для видео — задача классификация действий, для текста — классификация тематик.
Достоинства и недостатки:
Эксперементы
🧪 На рисунке ниже показан пример того, как представления помогают решать задачу поиска. Запрос находится в самом левом столбике. Зеленым отмечены верно найденные изображения, красным — неверно найденные, синим — изображения из стоп-листа. Как видно, система вполне неплохо решает задачу поиска изображений. Подробнее про такой подход для поиска изображений можно почитать в работах (Babenko2014, Babenko2015). Изображение из (Babenko2015).
Big Transfer
Статья Big Transfer (BiT): General Visual Representation Learning (Kolesnikov at el. 2019) даёт ряд важных советов, о том, на что именно стоит обратить внимание при supervised обучении c целью переноса представлений и весов модели на новые задачи.
Большие и разнообразные датасеты: Увеличение размера pretex датасета вносит существенный вклад в качество решения downstream задачи. Авторы продемонстрировали, что при предобучении переход от 1М изображений (ImageNet) к 14М изображений (ImageNet21k) к 300M изображений (JFT), стабильно улучшает качество дообучения на новой задаче с маленьким числом размеченных примеров.
😦 Да, тут мы заходим на территорию, когда ImageNet рассматривается как маленький датасет.
Большие pretext модели: Увеличение датасета при недостаточном размере модели может навредить. Нужно одновременно иметь большие модели и большие датасеты. Одно из возможных объяснений такое: с увеличением датасета модель должна предсказывать правильные ответы на трейне для огромного числа точек. При этом нельзя работать очень плохо хоть на каких-то точках, ведь когда гибкости недостаточно, моделька настраивается "так себе" во многих областях пространства, что может ухудшить финальное качество алгоритма.
Долгое обучение: Большие модели требуют много шагов оптимизации.
Большие модели часто учатся на десятках, сотнях или даже тысячах вычислителей, таких как GPU и TPU, и требуют много памяти для обучения. Как правило, это происходит из-за большого размера моделей: на один вычислитель часто помещаются только маленькие минибатчи (1-10 примеров). Маленькие минибатчи работают плохо с популярной Batch Normalization или требуют дорогой синхорнизации между вычислителями.
В статье (Kolesnikov at el. 2019) Batch Normalization заменяется на Group Normalization, которая позволяет использовать батчи маленького размера на кажой отдельном вычислительном девайсе. Group Normalization используется в комбинации c Weight Standardization, что позволяет улучшить обучение.
Мотивация: После supervised обучения расстояния между эмбеддингами не обязаны хорошо отражать треубуемую для решения нашей задачи «похожесть». Поэтому,
Для этого была предложена триплетная фунция потерь или triplet loss (Schroff at el. 2015). Триплетный лосс обучается на тройках объектов (якорный объект, негативный к якорному, позитивный к якорному). Информация о позитивных и негативных объектах является видом разметки. Этот лосс может использоваться как для обучения снуля так и для дообучения.
✍️ Отметим, что объекты не обязательно должны быть из одного домена: к примеру, якорный объект может быть картинкой, а позитивные и негативые объекты текстами. Таким образом, мы сможем находить «подходящие» тексты к картинкам и наоборот.
Как будет устроено обучение:
рассмотрим тройки объектов $(\text{obj}_i, \text{pos}_i, \text{neg}_i)$, где $\text{pos}_i$ – позитивный пример к $\text{obj}_i$, $\text{neg}_i$ – негативный пример к $\text{obj}_i$
будем притягивать $emb(\text{obj}_i)$ и $emb(\text{pos}_i)$ и отталкивать $emb(\text{obj}_i)$ и $emb(\text{neg}_i)$
одним из популярных лоссов для решения такой задачи является triplet loss:
$$L=\sum_i^N\left[\left\|emb_\theta(\text{obj}_i)-emb_\theta(\text{pos}_i)\right\|_2^2 - \left\|emb_\theta(\text{obj}_i)-emb_\theta(\text{neg}_i)\right\|_2^2+\alpha\right]_+.$$
$emb$ представляется нейронной сетью $emb_\theta(\cdot)$
$\alpha$ – параметер зазора – в некотором смысле усложняет задачу:
лосс $L$ оптимизируем по параметрам $\theta$.
Hard negative/positive mining
Обучение с триплет лоссом сильно зависит от алгоритма формирования троек. Если формировать тройки случайно, то большинство троек будут слишком легкими, не информативными. Негативные объекты будет слишком легко отличить от позитивных, поэтому обучающего сигнала от таких троек будет мало.
Поэтому хочется собрать наиболее сложные тройки из всех объектов в датасете или минибатче. Такой процесс называется hard negative/positive mining и часто используется для обучения с триплетной функцией потерь.
🧪 Примеры:
- $\text{obj}_i$ – лицо которое хотим верифицировать;
- $\text{pos}_i$ – тот же человек, что и в $\text{obj}_i$, но с других ракукрсов, в другом освещении, ...;
- $\text{neg}_i$ – лица других людей.
Об алгоритме:
Мотивация Мы разобрали supervised предобучение нейронных сетей и их использование для извлечения признаков. Однако supervised подходы не всегда эффективны. Supervised обучение требует больших размеченных датасетов. ❗️ Разметка данных — это трудоёмкий и дорогой процесс, на выходе от которого все равно получается шумная, и зачастую смещенная разметка. Поэтому от ручной разметки данных хочется уйти или хотя бы постараться её минимизировать.
Этого можно добиться, если научиться использовать неразмеченные данные для предобучения. Неразмеченные данные генерируются в огромном количестве, и их значительно проще собирать. Это позволит нам обучаться на огромных коллекциях данных, размер которых был бы недостижим при необходимости сбора разметки. Также в каждом объекте, изображении, звуке или тексте содержится в разы больше информации, которую можно учитывать при обучении, чем взкодировано в одном таргете. К примеру, один из тысячи классов можно закодировать всего десятью битами, а изображение содержит мегабайты внутренней полезной информации, котрую можно использовать для обучения. Поэтому подходы, которые могут обучаться без разметки, но с использованием внтурненнией информации, потенциально могут выучивать более хорошие представления, чем supervised подходы;
💡Основная идея self-supervised обучения – обучение через решение синтетических supervised задач (pretext problems), источником разметки в которых является сам объект (текст, изображение, или видео). Отсюда и приставка "self" в названии подхода.
Примеры pretext задач:
Если всё это кажется вам supervised-задачами, вы правы! Приставлка self- означает отсутствие внешней разметки.
🔥 Признаки и веса, выученные для решения, казалось бы, бесполезных pretext задач, на практике работают как очень хороший претрейнинг для решения supervised задач (downstream problems). Это позволяет достигать отличного качества, используя в сотни раз меньше размеченных данных по сравнению с чисто supervised подходами.
Почему контекст так важен для обучения? Обучение людей, как и обучение алгоритмов, неразрывно связано с использованием контекста. При изучении иностранного языка часто прибегают к упражнениям вида «Вставте правильные слова в текст». Чтобы выполнить такое упражнение, человеку нужно учитывать контекст и предсказывать значения незнакомых слов, если это необходимо для понимания текста.
Input hypothesis, предложенная Стивином Крашенйном, профессором University of Southern California, предполагает, что для эффективного изучения языка человеку нужно читать и слушать текст, который немного превышает его текущий уровень: скажем, содержит 10-15% незнакомых слов, но при этом остается понятным. Такой способ обучения требует восстановления значения незнакомых слов из контекста.
Визуальный контекст также широко используется при обучении детей. Вы можете помнить упражнения, в которых нужно было найти лишний предмет, закончить рисунок или раскрасить изображение. Такие задания требуют учета визуального контекста для решения задачи: важно уметь понимать принадлежность разных рисунков к одной группе, генерировать изображение, наблюдая только некоторую его часть и так далее.
Self-supervised обучение представлений и моделей глубокого обучения использует похожие идеи обучения из контекста. К примеру, модель word2vec (Mikolov et al. 2013) и BERT (Devlin et al. 2018) выучивают эмбедигнги слов, решая задачу предсказания слов по контексту. А некоторые модели для картинок решают пазлы (Doersch, Noroozi et al. 2017), дорисовывают изображения или звуки (van den Oord et al. 2018), раскрашивают фотографии (Zhang et al. 2016) и ищут похожие объекты (Chen et al. 2020).
С философией word2vec вы уже познакомились в параграфе про нейросети для работы с последовательностями. А в следующей части мы подробно разберем SimCLR (Chen et al. 2020) – метод, который обучается, решая задачу поиска похожих объектов.
Что разбираем? В этой части мы разберем SimCLR – метод, который первым продемонстрировал, что self-supervised предобучение может достигать того же качества что и supervised обучение. SimCLR основан на контрастивной функции потерь (contrastive loss), и в некотором смысле решает задачу поиска похожих объектов.
Также мы разберем метод self-supervised предобучения для vision tranformer, который, в некотором смысле, дорисовывает картинку, а также демонстрирует, что методы self-supervised предобучения для изображений и текстов во многом похожи.
✍️ Стоит отметить, что pretext задачи, которые мы будем обсуждать ниже, не являются «серебряной пулей». Известно, что такие задачи работают как хороший претрейнинг. Другими словами, позволяют получить хорошее качество для некоторых downstream задач (классификация, детекция, сегментация) после дообучения на небольшом количестве размеченных примеров. Хорошего понимания, почему эти методы работают, в области пока нет. Скорее всего, разные типы задач (downstream problems) будут требовать разных методов претрейнинга, но это мы поймём только в ближайшие несколько лет.
Как работает SimCLR на высоком уровне
SimCLR (Chen et al. 2020) – это метод для предобучения сети без использования рукотворной разметки. SimCLR решает синтетическую задачу поиска похожих изображений.
SimCLR:
👇 Иллюстрация задачи SimCLR для одного запросса из минибатча.
Loss SimCLR оптимизирует контрастив лосс (contrastive loss) который фактически является кросс энтропией на positive-negative разметке:
$$L^\color{#5180e6}{\textit{query}}_\color{#72bd44}{\textit{positive}} = -log \frac{\exp\Big(sim(emb(\color{#5180e6}{\textit{query}}), emb(\color{#72bd44}{\textit{positive}}))\Big)}{\sum_{\color{#fd0007}{z} \in \text{Neg}(\color{#5180e6}{\textit{query}})} \exp\Big(sim(emb(\color{#5180e6}{\textit{query}}), emb(\color{#fd0007}{z}))\Big) },$$
где $sim(\cdot,\cdot)$ – это косинусное расстояние, a лосс $L$ работает следующим образом:
Интуиция: На контрастивную функцию потерь можно смотреть как на поиск ответа по запросу, который ведется только среди всех эмбедингов в текущем минибатче. Такая задача требует сохранения информации про контент на изображении (что, вообще говоря, не очень просто) и в то же время понижения размерности, так как эмбединги $f(\cdot)$ обычно имеют сравнительно низкую размерность.
Размер минибатча: Размер минибатча влияет на количество отрицательных примеров. Чем больше отрицательных примеров – тем сложнее задачу мы ставим перед нейросетью. Существует некоторый баланс между сложностью задачи и качеством выученных представлений. Слишком простые задачи (то есть маленькие батчи) обычно не позволяют выучить хороших представлений: простая задача может хорошо решаться даже с помощью «плохих» представлений. Поэтому SimCLR обучается хорошо только на очень больших мини-батчах (с тысячами примеров).
Как работает SimCLR на низком уровне
Что нам нужно иметь перед началом обучения:
неразмеченный датасет изображений $X = {x_0, ..., x_N}$
операцию аугментации изображения $aug(x_j)$
энкодер $f_\theta(\cdot): Image \to R^M$ (типичные значения M~2048)
проекция $g_\psi(\cdot): R^M \to R^K$ (типичные значения K~128)
✍️ В примере сверху $emb (x) = g \odot f (x)$
Как мы обучаемся:
Семплируем мини-батч объектов $\hat{Х} \sim X$;
Для каждого объекта в минибатче $\hat{Х}$:
— Cемплируем две аугментации ${v}_i, {v^\prime}_i = aug(\hat{Х}_i), aug(\hat{Х}_i)$;
— Вычисляем эмбединги $y_i, y^\prime_i = f_\theta(v_i), f_\theta(v^\prime_i)$;
— Вычисляем проекции $z_i, z^\prime_i = g_\psi(v_i), g_\psi(v^\prime_i)$;
Вычисляем contrastive loss $\mathcal{L}=\sum_i l^{z_i}_ {z^\prime_i} + \sum_i l^{z^\prime_i}_{z_i}$, используя $sim(\cdot,\cdot) = \frac{u^Tv}{||u||\ ||v||}$.
$$l^\color{#5180e6}{\textit{q}}_\color{#72bd44}{\textit{p}} = -log \frac{\exp(sim(\color{#5180e6}{\textit{q}}, \color{#72bd44}{\textit{p}}))}{\sum_{\color{#fd0007}{z_i,z^\prime_i} \neq \color{#5180e6}{\textit{q}}} [\exp(sim(\color{#5180e6}{\textit{q}}, \color{#fd0007}{z_j})) + \exp(sim(\color{#5180e6}{\textit{q}}, \color{#fd0007}{z^\prime_j}))]}$$
— ✍️ В $\mathcal{L}$ два слагаемых из-за того, что в паре (изображение, аугментация), вообще говоря, любой элемент можно выбрать в качестве запроса (другой тогда будет позитивным примером). Тем самым из одного мини-батча картинок мы можем сделать для мини-батча для обучения SimCLR.— ✍️ Функция потерь $\mathcal{L}$ вычисляется для низкоразмерных проекций $z_i, z^\prime_i \in R^K$.
Делаем шаг по градиенту $\nabla_{\theta,\psi} \mathcal{L}$, повторяем с шага 1 пока не сойдёмся;
Используем $f_{\theta}(\cdot)$ для генерации эмбедингов или файнтюнинга под supervised задачу.
Почему это вообще работает?
Точно никто не знает, но приведем следующую гипотезу:
Контрастивная функция потерь требует различать аугментации разных изображений. При этом эмбеддинги должны содержать информацию о контенте изображения, чтобы осуществлять поиск аугментаций одинаковых изображений по ключу. Этот процесс позволяет создать представления изображений, сохраняющие достаточно много информации про контент, чтобы решать не только задачу поиска аугментаций, но и другие задачи.
Результаты
Претрейнинг, который мы обсудили выше, позволяет эффективно дообучать модели и получать качество, сравнимое с supervised обучением, используя в 100 раз меньше размеченных примеров.
Оговрка в том, что эти результаты получены второй весрсией метода SimCLRv2 (Chen at. el, 2020). SimCLRv2 TLDR; модели больше, глубже сеть проекции, улучшение качества происходит за счет дистиляции.
Какие аугментации выбрать? авторы предлагают использовать resize random crop, random flip, color distortions, Gaussian blur. Такая комбинация была найдена небольшим перебором. Для разных данных оптимальный набор аугментаций может получаться разным.
Сложно ли такое учится? Да, но сложности в основном технические. Вы быстро оказываетесь наедине c размером батча 2048 на ImageNet (не забудьте ещё, что на каждую картинку 2 аугментации, поэтому реальный размер батча 4048). Даже с не самой большой сеткой, например, ResNet50 (25М параметров) приходится использовать не один десяток ГПУ с 32 Гб памяти в каждой и долго ждать, пока всё обучится. Процесс чтения 2k картинок с диска тоже может занимать намного больше времени, чем вы предпологали, а одновременное вычисление 4k аугментаций быстро создает bottleneck в CPU. Но если у вас много GPU, батч успевает грузиться быстро, и аугментации не упираются в CPU, так что основные сложности позади.
Можно ли обойтись без contrastive loss/негативных примеров? Да можно: так делают авторы статьи "Bootstrap your own latent: A new approach to self-supervised Learning" (Grill et al.). Но пока метод достаточно новый, и его рано добавлять в учебник. Если вам очень хочется узнать про этот метод, рекомендуем посмотреть разбор с анализом на канале Yannic Kilcher.
Одна из самых популярных self-supervised задач в NLP — это предсказание замаскированных токенов (masked tokens prediction Devlin at el. 2019). При обучении такая модель (обычно transformer) видит текст, в котором некоторые токены заменены на специальный токен [MASK]; задача модели — правильно предсказать замаскированные токены по контексту. Оказывается, такой претрейнинг позволяет очень хорошо адаптировать модель для решения разных задач, таких как классификация текстов, используя при этом мало размеченных примеров.
На самом деле, модель будет способна не только предсказывать замаскированные токены, но и для оригинальных предсказывать «более логичные», на её взгляд замены: например, с её помощью можно исправлять опечатки. Это можно использовать на этапе обучения модели, чтобы показывать ей, что токена [MASK] может и не быть в тексте. Это может оказаться полезным на этапе файнтюнинга, где уже нет маскировки токенов. Подробнее про Transformer, BERT, и masked tokens prediction можно прочитать в курсе NLP for You.
Можно ли использовать такой self-supervised подход для изображений? Оказывается, что да! В этом помогает vision transformer.
Vision Transformer
В последнее время модели на основе vision transformer (ViT) (Dosovitskiy at el. 2020) бурно развиваются и компьютерного зрения.
В supervised режиме для задачи классификации vision transformer обучается следующим образом:
ViT не используют локальные операции, такие как свертки. Как следствие, такие модели требуют заметно больше данных и параметров для обучения (300M изображений по сравнению со стандартным размером размеченного датасета 1.3М). Но оказывается, что BERT-like self-supervised обучение применимо и для моделей vision transformer, и позволяет обучать их без использовния гиганских датасетов.
Какие self-supervised задачи на замаскированных патчах решают авторы статьи:
Во всех случаях обучается и файнтюнится вся сеть целиком. Этот интересный пример показывает, что pretext задачи придуманные, для NLP-сетей могут быть применены и к задачам зрения.
Глубинное обучение — в существенной степени наука о представлениях сложных объектов. В этом параграфе мы лишь слегка затронули несколько важных тем: supervised предобучение, self-supervised предобучение, и metric learning. Self-supervised предобучение – это важный новый раздел глубинного обучения, который, вероятно, поможет серьезно сократить количество необходимой разметки во многих приложениях. Генеративные модели VAE/inverse-GANs также широко используются для получения и обработки представлений. О них вы сможете прочитать в следующих параграфах.
Полезные материалы: