Назад
150

Cимметрия в нейронных сетях. Часть первая

150

Введение

Симметрия окружает нас повсюду с самых ранних лет жизни. Левая и правая рука, мяч, волчок, прямоугольный стол — мы понимаем, что все эти предметы симметричны, даже не задумываясь над значением слова «симметрия». В некоторым смысле это знание встроено в наш мозг.

Симметричные предметы нам кажутся красивыми. Но красота — не единственная польза симметрии. Те, кто изучает математику, физику или химию, знают, что теория симметрии — это еще и очень мощный аппарат, который зачастую помогает сильно упростить вычисления. В качестве примера приведем теорему Нётер: все законы сохранения в физике являются следствиями определенных симметрий системы.

Возникает закономерный вопрос: если учет симметрии настолько эффективен в естественных науках, то, может быть, его можно «встроить» и в нейронные сети?

Ответ: да! То есть что-то симметрично, если существует набор преобразований, оставляющий систему неизменной.

Постановка задачи

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

Рисунок 1. Грустный котик, который не хочет, чтобы его поворачивали
Рисунок 2. Тот же котик, только повернутый

Cетка, конечно определит, что это кот. Перевернём рисунок 1 — получим рисунок 2 и пропустим его через ту же сетку. Что мы получим теперь? Сложный вопрос. При обучении на обычных фотографиях сетка не видит перевернутых котов. Скорее всего, на выходе получится что-то непонятное 🙂

Аугментации здесь — наше всё! Да, для «обычных» сеток типа YOLO или ResNet, с которыми мы имеем дело в отношении картинок, это будет верное утверждение. Но аугментации — только частичное решение проблемы. Почему?

  1. Симметрия все-таки сохраняется не полностью. В качестве примера приведём анимацию из статьи Harmonic Networks: Deep Translation and Rotation Equivariance [источник], где наглядно видно изменение активаций:
Рисунок 3. Активационные карты обычной CNN, обученной с аугментациями
Рисунок 4. Сравнение активационных карт. Крупный план
Рисунок 5. Активационные карты сетки со “встроенными” симметриями (H-CNN)
  1. После длительных размышлений нашлась проблема, где даже «тяжёлые» аугментации работают значительно хуже. Если тезисно — люди спроектировали MNIST и FashionMNIST на сферу и попытались обучить сетку распознавать и сегментировать такие «сферические» изображения (семантическая сегментация). С распознаванием обычная аугментированная CNN еще справилась, но в случае сегментации она проиграла сетке, учитывающей симметрию (хоть пример отчасти искусственный).
  2. Аугментации — это тяжело. Во-первых, нужно много примеров для сетки, следовательно, много памяти и времени на тренировку. А если картинки большие (например, спутниковые снимки) — требования сильно возрастают. Во-вторых, крупные размеры самой сетки, которой необходимо как-то все усвоить.
  3. При переходе от картинок к более сложным объектам требования к ресурсам растут. В качестве примера приведу случай моего коллеги, который занимается моделированием биохимии с помощью 3D конволюционных сеток. Его попытка аугментировать большую молекулу произвольными поворотами привела к тому, что 320 Гб видеопамяти в один момент неожиданно закончились (в статье Google обучал Alphafold 3 только на аугментациях, но это Google и их ресурсы 🙂).

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

Выход есть — теория групп, или универсальный язык симметрий.

Теория групп и их представлений

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

Определение группы и подгруппы

Группа — это множество \( G \) с введенной на ней групповой операцией (обозначим её \( (\cdot) \), не путайте с обычными умножением!), так что:

  1. Для любых \( a, b \) и \( с \) из \( G \) выполняется \( (ab)с = a(bc) \).
  2. В \( G \) есть единица, то есть такой элемент \( e \), при котором для любого \( а \) из \( G \) выполняется \( ae = ea = a \) (можно показать: если такой элемент существует, то он единственный).
  3. Для любого \( а \) из \( G \) есть обратный элемент (принадлежащий \( G \)), такой, что \( aa^{-1} = e \).

Подгруппа — это группа в группе. Если формально: пусть \( G \) группа и \( H \) — подмножество в \( G \). Тогда \( H \)— подгруппа группы \( G \), если:

  1. \( H \) содержит единичный элемент из \( G \);
  2. Для любых \( a \) и \( b \) из \( H \) их произведение лежит в \( H \);
  3. Для любого \( a \) из \( H \) его обратный элемент тоже лежит в \( H \).

Отметим также: одна группа может содержать много подгрупп.

Примеры групп

“Группа крови на рукаве” группой не является 😊. Здесь не задана групповая операция.

  1. Группа, которая состоит только из единицы (операция — умножение). Негусто, но все выполняется.
  2. Вещественные числа с операцией сложения — это группа (можете проверить сами!). Подгруппой являются, например, все целые числа. А вещественные числа с операцией умножения — это не группа (там есть ноль).
  3. Группа поворотов окружности вокруг центра, элементы которой можно записать как матрицы вида \( \begin{pmatrix} \cos(\phi) & -\sin(\phi) \\ \sin(\phi) & \cos(\phi) \end{pmatrix} \). То есть она может быть реализована как группа ортогональных матриц с единичным определителем. Отсюда обозначение группы — \( SO(2) \), где \( S \) — singular, \( O \) — orthogonal, \( 2 \) — размерность матриц (ортогональные матрицы с определителем, равным единице). Она возникнет, когда мы захотим покрутить картинку с котиком.

Обратите внимание: элементы группы — это повороты окружности. А реализована она может быть через матрицы. Подгруппой этой группы являются, например, повороты на 0, 90, 180 и 270 градусов.

4. Группа поворотов сферы вокруг центра (\( SO(3) \)).

Она возникнет, если у нас будут трехмерные данные, и мы захотим покрутить котика в 3D. Ее подгруппа — \( SO(2) \): фиксируем какую-нибудь ось и вращаем вокруг нее.

5. Группа трансляций в n-мерном пространстве (\( Т_n \)).

Конволюционные сетки возникают из обычных полносвязных, когда мы “встраиваем” в полносвязные группу \( T_2 \).

6. Группа перестановок \( n \) элементов (\( S_n \)).

Рассмотрим, например, группу \( S_3 \). Пусть у нас есть три предмета, скажем, числа (1, 2, 3). Элементы группы переставляют предметы местами, а групповая операция — это последовательное применение двух перестановок. Приведем пример элемента группы: 1 переходит в 2, 2 — в 1, 3 — в 3. Это записывается так: \( \begin{pmatrix} 1 & 2 & 3\\ 2 & 1 & 3 \end{pmatrix} \). В сетях такое может возникнуть, если некоторые входы сетки эквивалентны друг другу. В качестве простого упражнения предлагаю выписать все элементы (их будет 6) и проверить, что выполняются условия (1-3) из определения группы.

Эта группа важна, потому что любая конечная группа из \( n \) элементов эквивалентна (или изоморфна, как говорят математики) какой-то подгруппе группы \( S_n \). Другими словами, если мы знаем всё про группу \( S_n \) — мы знаем всё про все группы на \( n \) элементах.

Виды групп

Видов групп очень много. Перечислим некоторые из них:

  1. Конечные и бесконечные. Определяем их по количеству элементов в группе. К конечным относится, например, группа перестановок 3-х элементов. К бесконечным — группа трансляций.
  2. Абелевы и неабелевы, они же коммутативные и неккомутатитивные. Пример коммутативной группы — группа вещественных чисел с операцией сложения. Пример некоммутативных — группа вращений шара вокруг центра (важна последовательность нескольких поворотов подряд).
  3. Группы Ли (названы по имени математика Софуса Ли). Помимо основных групповых аксиом мы требуем, чтобы множество было локально, похоже на Евклидово пространство.
  4. Компактные и некомпактные. Здесь пространство параметров, задающих элементы группы, — компакт (то есть нечто ограниченное). Пример компактной группы — группа поворотов окружности. Угол изменяется от нуля до \( 2\pi \). Пример некомпактной — группа трансляций.

Действие группы на множестве

Действие группы на множестве — это применение элементов группы к некоторому множеству (например, когда мы вертим стол).

Давайте разбираться 🙂

Пусть у нас есть группа \( G \) и множество \( M \). Мы говорим, что группа \( G \) действует на множестве \( M \), если выполняются следующие три условия:

  1. Для любых \( g \in G \) и \( x \in M \) \( gx \in M \) (то есть для всех элементов из группы и множества результат действия определен и лежит в том же множестве \( M \)).
  2. Для любых \( g_1, g_2 \in G \) \( g_1(g_2x)= (g_1g_2)(x) \). Это значит, что мы можем сначала подействовать элементом \( g_2 \) на \( x \) и к полученному результату применить \( g_1 \), или в начале перемножить \( g_1 \) на \( g_2 \), а получившимся элементом подействовать на \( x \). Результат не изменится.
  3. Для любого \( x \in M \) \( ex = x \) (единица группы действует как единица и на множестве \( M \)).

Если для некоторого отображения \( T \) выполняется \( T(g_1)T(g_2) = T(g_1g_2) \), то оно называется гомоморфизмом.

Приведем пример действия группы на множестве. Рассмотрим группу трансляций в двухмерном пространстве. Элемент группы — сдвиг на вектор \( a \). Обратный сдвиг — сдвиг на вектор \( -а \). Единичный элемент — сдвиг на нулевой вектор. Такая группа действует на плоскости. Проверяем, что все условия выполняются: операция определяется для всех элементов, последовательные сдвиги на вектора \( а \) и \( b \) эквиваленты сдвигу на вектор \( а + b \), а нулевой элемент оставляет все на месте.

Наконец, есть частный вид действия группы на множестве — (линейные) представления групп (“линейные” обычно опускают).

Представления групп — это действие группы на векторном пространстве.

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

Теория представлений групп — очень развитая область, по ней написаны тысячи томов. Причина, по которой она так интересна: структура группы переносится на преобразования. Причем одна и та же группа может иметь представления разной размерности (действовать в разных векторных пространствах). Но они все будут в некотором смысле “одинаковы”.

Инвариантность и эквивариантность

Мы подошли к очень важному шагу — теперь мы готовы сформулировать понятия инвариантности и эквивариантности.

Начнем с примера. Вернемся к нашей картинке с котиком. Если наша сетка правильно определяет наличие котика (есть котик / его нет) независимо от его положения на картинке — это инвариантность относительно трансляций. Если при этом она еще и правильно определяет котика независимо от угла поворота — это инвариантность относительно поворотов. Инвариантность — это в некотором смысле скаляр (да / нет).

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

Рисунок 6. Инвариантность и эквивариантность. Обратите внимание: в случае эквивариантности активации не остаются на месте

Что мы видим? Порядок операций не важен. Мы можем сначала сдвинуть котика, а потом пройтись сверткой / в начале пройтись сверткой, а затем сдвинуть полученную карту. Это пример эквивариантности.

Кроме того, операции справа и слева могут быть различными, важно лишь то, что они соответствуют одному и тому же элементу группы.

На языке математики это выглядит следующим образом:

Рисунок 7. Математический вариант рисунка 6

Давайте закрепим еще раз понятие эквивариантности:

\[ \begin{equation} f(\rho_g(x)) = \rho’_g(f(x)) \end{equation} \]

В левой части уравнения мы сначала применяем к \( x \) действие \( \rho_g \), а потом действуем функцией \( f \). В правой части — применяем функцию \( f \), а потом действуем \( \rho’_g \).

\( \rho_g \) и \( \rho’_g \) — это, строго говоря, два разных преобразования, которые могут жить и действовать в различных пространствах. Важно то, что они соответствуют одному и тому же элементу группы. И соотношение (1) верно для всех элементов группы.

Соответственно, инвариантность — это частный случай эквивариантности.

Про сетки

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

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

Проиллюстрируем это с помощью сетей 🙂

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

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

Учет дискретных симметрий

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

Рассмотрим сверточную нейронную сеть и попробуем сделать так, чтобы она “из коробки” учитывала повороты картинки на 180 градусов. Это группа, состоящая из двух элементов, — единичного и поворота на 180 градусов (группа \( C_2 \)). Как нам это сделать?

Пусть у нас есть конволюционное ядро (оно необязательно симметричное). Пробежимся им по картинке. Получим некоторый набор активаций. Повернем его на 180 градусов и пробежимся по картинке снова. Получим еще один набор активаций. А теперь сконкатенируем их. И возьмем максимум по каждому каналу (это можно делать, а можно и не делать). Что мы получили? Ту самую эквивариантность! А после максимума — инвариантность!

Действительно, повернем картинку на 180 градусов и повторим весь процесс. Что изменится? В сконкатенированных картах активации будет другой порядок, но карты останутся аналогичные. А значит, результат усреднения или максимума не изменится вообще. Это именно то, что мы хотели. Такую процедуру можно провести на всех слоях сети. И вуаля! Наша сеть без всяких аугментаций теперь умеет учитывать повороты на 180 градусов!

Рисунок 8. Карты активаций для исходного изображения
Рисунок 9. Карты активаций для повернутого
изображения. Обратите внимание: порядок карт
поменялся, но сами карты — нет. После проецирования
мы получили то же cамое, что и для
исходной картинки

У этого подхода есть несколько минусов:

  • непонятно, как учитывать непрерывные симметрии;
  • дополнительные карты активаций съедают память;
  • скорость обучения и инференса уменьшается из-за дополнительных карт активаций и проекционных слоев.

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

Заключение

Итак, подведем итоги. В этой статье мы:

  • рассмотрели основные понятия теории групп;
  • затронули математические аспекты симметрий;
  • поговорили об инвариантности и эквивариантности;
  • “закинули удочку” для второй части, обсудив учет дискретных симметрий.

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

Телеграм-канал

DeepSchool

Короткие посты по теории ML/DL, полезные
библиотеки и фреймворки, вопросы с собеседований
и советы, которые помогут в работе

Открыть Телеграм

Увидели ошибку?

Напишите нам в Telegram!