Нейролента - подборка новостей о нейронных сетях, ChatGPT

HyperDreamBooth: HyperNetworks for Fast Personalization of Text-to-Image Models....

HyperDreamBooth: HyperNetworks for Fast Personalization of Text-to-Image Models
Nataniel Ruiz, Yuanzhen Li, Varun Jampani, Wei Wei, Tingbo Hou, Yael Pritch, Neal Wadhwa, Michael Rubinstein, Kfir Aberman
Статья: https://arxiv.org/abs/2307.06949
Сайт: https://hyperdreambooth.github.io/

Прикольная работа с гиперсетями, которые я нежно люблю.

Если кто не знаком с концепцией Hypernetworks, то в двух словах это когда одна нейросеть (она и есть гиперсеть) генерирует веса для другой нейросети. Начало этому направлению было положено одноимённой работой Дэвида Ха и ко (https://arxiv.org/abs/1609.09106). Работы с гиперсетями в целом идут довольно регулярным потоком, но, на мой взгляд, всё равно тема малоизвестная и по ощущению недостаточно глубоко проработанная, в том смысле, что, я убеждён, там скрывается ещё много всего интересного.

На этот раз гиперсети применили для персонализации text-to-image моделей, а точнее для ускорения DreamBooth (https://arxiv.org/abs/2208.12242). DreamBooth был способен файнтюнить предобученные модели (в той работе был Imagen) небольшим числом картинок (3-5) конкретного персонажа, так что модель выучивала уникальный идентификатор (например, “[V]”) субъекта, и его можно далее было использовать для синтеза картинок с этим субъектом в различных новых контекстах (“A [V] dog in the beach”). Примеры работы DreamBooth в статье или на сайте-компаньоне (https://dreambooth.github.io/).

Для файнтюнинга DreamBooth процесс с 1000 итераций занимал 5 минут для Imagen на TPUv4 или Stable Diffusion на A100. Процесс затрагивал все веса UNet’а и текстового энкодера, что в случае Stable Diffusion требовало порядка 1Gb на каждую персонализацию.

HyperDreamBooth сокращает размер кастомизированной модели (в этой работе берут Stable Diffusion) и делает процесс быстрее. Это не единственный способ ускорения персонализации, есть и другие подходы, но мы их тут не рассматриваем.

А ещё он работает на одной фотографии.

Рецепт HyperDreamBooth состоит из трёх ингредиентов.

1) Lightweight DreamBooth (LiDB) является по сути LoRA++.

Сначала делается уже общеизвестная LoRA (Low-Rank Adaptation, https://arxiv.org/abs/2106.09685), где предобученные веса W_0 (размерности n×m) заменяются сначала на сумму замороженных W_0 и обучаемых ∆W, а затем для ∆W делается низкоранговая аппроксимация ∆W=AB (размерность A n×r, размерность B r×m и r<<min(n, m), и работает всё даже для r = 1). Вот эта вот факторизованная добавка обычно и распространяется как LoRA-модель, которая не является полноценной моделью и требует оригинальных предобученных весов, чтобы посчитать с ними W_0 + AB.

Это уже уменьшает размер файнтюненной модели на три порядка, оставляя 386K параметров, требующих 1.6Mb места.

Затем идут дальше и делают ещё одну декомпозицию матриц A и B на A = A_aux*A_train (размерность A_aux n×a, A_train a×r) и B = B_train*B_aux (размерности аналогично r×b и b×m), где aux инициализированы случайными ортогональными векторами, которые заморожены, а обучаются только матрицы train. Гиперпараметры a и b подбираются экспериментально, в работе выбрали a = 100, b = 50. Это уменьшает модель ещё в 10 раз относительно LoRA. Финальная модель (вернее добавка относительно базовой модели) содержит 28К весов и занимает 120Кб места. Что конечно big deal, если нужно хостить множество файнтюненных моделей.

Эти матрицы A_train, B_train получают для каждого слоя внимания (кросс- или self-).

2) HyperNetwork for Fast Personalization of Text-to-Image Models -- собственно гиперсеть, которая по входному изображению предсказывает матрицы A_train и B_train от LiDB.

Гиперсеть обучается на наборе доменно-специфичных картинок (взяли CelebAHQ) с миксом обычного diffusion denoising loss и weight-space loss. Для всех сэмплов используется один и тот же промпт “a [V] face”.

Архитектура гиперсети -- это картиночный энкодер на базе ViT (ViT-H) и декодер трансформера (2 слоя). Декодер итеративно уточняет предсказания весов, стартуя с нулевых значений. Число итераций s -- гиперпараметр (и я не понял, чему он равен). На выходе также есть обучаемые линейные слои.