Самоорганизующиеся текстуры: нейросеть учится рисовать как природа

Самоорганизующиеся текстуры: нейросеть учится рисовать как природа

У любых двух зебр разные полосы. Это не баг эволюции, а следствие архитектурного решения: природа не хранит в геноме побитовую карту окраса, она кодирует процесс, который этот окрас порождает. Клетки на коже зебры исполняют локальные правила, смотрят на соседей и в итоге выращивают паттерн нужного качества, а не нужной формы. В 2021 году коллектив Distill взял ту же идею и перенёс её в нейросети: они заставили нейронные клеточные автоматы (NCA, Neural Cellular Automata) генерировать текстуры, и то, что выучила система, оказалось ближе к живому алгоритму, чем к генератору картинок.

Что такое самоорганизующиеся текстуры

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

Постановка задачи заимствована у классического переноса стиля Гатиса. Берётся эталонная текстура, прогоняется через предобученную сеть VGG, и со слоёв block1_conv1 по block5_conv1 снимаются грам-матрицы активаций, статистика, которая улавливает стиль изображения, но не его конкретную раскладку. Затем NCA запускается на 32-64 итерации, и результат тоже прогоняется через замороженную VGG. Лосс: L2-расстояние между грам-матрицами сгенерированной картинки и эталона. Веса VGG не трогают, оптимизатор ADAM крутит только веса самого автомата. Эталоны взяты из Oxford Describable Textures Dataset, набора текстур, размеченного по 47 атрибутам вроде пупырчатый или в горошек.

От уравнений Тьюринга к нейросети

Интересна логика, по которой авторы пришли к архитектуре. В 1952 году Алан Тьюринг предположил, что паттерны в природе рождаются из реакционно-диффузных процессов, описываемых частными производными: изменение состояния каждой точки зависит от её текущего значения, градиента и лапласиана по соседям. Модель Грея-Скотта, знаменитый пример такой системы, при настройке всего двух параметров выдаёт целый зоопарк паттернов от пятен до лабиринтов.

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

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

Живые текстуры и солитоны

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

Авторы формулируют это сильнее: раз автомат нашёл временно согласованное решение, он нашёл алгоритм, порождающий паттерн. И поведение это подтверждает. На текстуре с пузырями плотность пузырей держится постоянной. Уничтожь часть клеток интерактивно, и пузыри отрастут заново. Но стоит двум пузырям сблизиться, как один из них спонтанно схлопывается, сохраняя среднюю плотность. Ускорь анимацию, и видно, что пузыри движутся с разной скоростью, но никогда не сталкиваются. Авторы называют их солитонами, устойчивыми локализованными структурами в пространстве решений. Повреждённый пузырь сам себя достраивает, и всё это выучено без единого вспомогательного лосса, только из картинки-эталона, статистики VGG и индуктивного смещения автомата.

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

Устойчивость, которую не заказывали

Самая неожиданная часть статьи про robustness. Операторы Собеля и лапласиан можно переопределить для других решёток. Модель, обученную в квадратном мире, без всякой дообучения переносят в гексагональный: у клетки теперь шесть соседей вместо восьми, и после короткой перестройки она производит ту же текстуру. Ядра можно поворачивать, причём для каждой клетки по-разному, и система всё равно работает. Это напоминает биологическую ткань, где клеткам безразличны точное положение и ориентация относительно соседей.

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

Что клетки прячут в скрытых каналах

Модель хранит 12 каналов состояния: три видимых RGB и девять скрытых, которые видят соседи, но лосс их не касается. Это аналог химических сигнальных каналов биологических клеток. Чтобы заглянуть внутрь, авторы берут первые три главные компоненты скрытых каналов и красят ими картинку, примерно как потенциал-чувствительные красители в биологии.

Результаты читаются почти как reverse engineering. У текстуры с диагональными нитями нити разных направлений окрашены в разные цвета PCA: скрытые каналы кодируют направление нити, чтобы клетки внутри неё знали, куда она растёт. У шахматной доски каждый квадрат пересекает градиент в пространстве главных компонент, и диапазоны градиента различаются для чёрных и белых квадратов. Похоже на локальную систему координат, по которой клетка определяет своё положение внутри квадрата и его размер. А у NCA, обученного изображать глаз (об этом ниже), скрытые состояния чётко разделяют тело глаза и ореол вокруг него, который, судя по всему, служит буфером от столкновений солитонов. Авторы честно называют анализ скрытых состояний тёмным искусством: выводы качественные, каналы коррелированы, и строгих заключений тут нет.

Глаза на крыльях бабочки

Второй большой эксперимент меняет дискриминатор. Вместо VGG со стилевым лоссом берут Inception v1, обученный на ImageNet, и максимизируют активацию выбранного нейрона, подбирая нейроны через OpenAI Microscope. Это feature visualization, только параметризацией картинки служит не пиксельный буфер и не фурье-базис, а популяция клеток.

Чаще всего из этой процедуры вылезают глаза. Это закономерно: ImageNet полон животных, и детекторы глаз в сети сильные. Но авторы проводят красивую параллель. Некоторые бабочки носят на крыльях пугающе реалистичные глаза, хотя ни бабочка, ни хищник не имеют понятия о том, что такое глаз. Эволюция нашла область морфопространства, эксплуатирующую паттерн-детекторы в мозге хищника. Клетка имеет размер порядка микрон, а глаз на крыле миллиметры, то есть сотни и тысячи клеток координируются локальными сигналами, чтобы нарисовать картинку, предназначенную для зрительной системы другого вида. NCA с Inception делает то же самое: популяция клеток коллективно рисует паттерн, возбуждающий нейрон чужой нейросети. Солитоны и тут никуда не деваются: круглые структуры с внутренним устройством гаснут при сближении и умеют делиться на две новые.

Где система ломается

Честный разбор failure modes в статье тоже есть. Одни текстуры воспроизводятся структурно, но не по цвету, другие наоборот, третьи проваливаются полностью. Цветовые провалы авторы связывают с известной нестабильностью грам-матричного лосса в style transfer. Структурные, по их гипотезе, упираются в параметризацию: локальной коммуникации клеток трудно организовать согласование на больших расстояниях. Это важное ограничение всего подхода: там, где паттерн требует глобального плана, чисто локальные правила проигрывают.

Часто задаваемые вопросы

Чем NCA отличается от обычного генератора текстур на нейросети?

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

Почему асинхронные обновления так важны?

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

Где это может пригодиться на практике?

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

Итог

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

← Все записи