В первой части, был показан способ генерации видео за счет влияния на текстовый эмбеддинг изменениями от эмбеддингов кадров другого видео через матрицы вращений. Во второй части были показаны первичные подходы и реализации по генерации видео из текста с использованием машинного обучения простой модели Splitter. Задача модели Splitter создавать серию близких текстовых эмбеддингов, которые будут потом использоваться Декодером для генерации близких изображений. После получения первичных результатов, уже встала задача по улучшению и углублению модели Splitter.
Поиски дальнейшего улучшения
Изучение статей о матрицах вращений в машинном обучении выявило их ограниченное применение. В основном, матрицы вращений применяются в задачах, связанных с 3D и 2D пространствами. Однако, одна из статей, "On Learning Rotations" 2009 года, глубоко анализирует группы вращений и предлагает использование дивергенции фон Неймана как меры для измерения расстояний между матрицами вращения.
![](https://habrastorage.org/getpro/habr/upload_files/815/a85/d8b/815a85d8b946ebfd15e31eee2a800f51.png)
Это исследование вдохновило меня на рассмотрение возможности интеграции матриц вращений для углубления функции потерь для сравнения изменений в эмбеддингах на основе матриц вращений в разных пространствах. Базовая функция потерь основывается на MSE и CosineEmbedding между разностями эмбеддингов, что хорошо соответствует основному сценарию по сравнению изменений в обоих латентных пространствах метрическим и угловым методами.
Погружаться в тему развития функции потерь в этой статье я не стал. Там еще много работы и неоднозначные результаты. В целом, все уводит в геометрические методы и топологию многомерных пространств. А следующие гифки, хорошо показывают, что выбор траектории в латентном пространстве по созданию близких векторов из которых затем будут генерироваться близкие картинки для фильма очень неоднозначен :
![пример применения в обучения функции потерь на основе трансформации пример применения в обучения функции потерь на основе трансформации](https://habrastorage.org/getpro/habr/upload_files/ca1/35a/645/ca135a6456a04e9b17e414915e449d7d.gif)
Спойлер - есть примеры интереснее на основе трансформационной функции потерь, что дает мотивацию для исследований в реализации функций потерь на основе трансформации в пространстве.
![Splitter_Dual with transforn loss Splitter_Dual with transforn loss](https://habrastorage.org/getpro/habr/upload_files/b36/d38/3f6/b36d383f6735fe90344a21e47c36f961.gif)
Дополнительный интерес вызвала статья Rotated Word Vector Representations and their Interpretability, которая исследует угловые представления и матрицы вращений в контексте NLP.
![](https://habrastorage.org/getpro/habr/upload_files/52e/033/877/52e03387730bb86800e95bcd9da76547.png)
А статья Enhanced transformer with rotary position embedding открыла мне новый подход к позиционированию токенов через вращение вектора слова. Это позволяет модели учитывать как абсолютное положение токенов, так и их относительное расстояние друг к другу, что может быть крайне полезно для понимания текстовой структуры и повышения точности модели. RoPE, введенный в RoFormer слой, предлагает метод кодирования позиционной информации с помощью вращательных матриц, применяемых к векторам запросов и ключей в механизме внимания Transformer, что обеспечивает стабильность векторов и сохранение относительных позиций без потери контекста. Реализуемое через векторные операции вращения, повышает эффективность обработки данных.
![RoPE RoPE](https://habrastorage.org/getpro/habr/upload_files/6ac/57a/069/6ac57a0697771a44c5431c3ffde55b08.png)
Взамен добавления позиционного вектора, RoPE слой применяет вращение к вектору слова, где угол вращения пропорционален позиции слова в предложении. Это обеспечивает стабильность векторов и сохранение относительных позиций. RoPE вводит новый способ кодирования позиционной информации с помощью вращательных матриц, применяемых к векторам запросов и ключей в механизме внимания трансформеров. Технически, вращение осуществляется через простые векторные операции для повышения эффективности.
На слайдах выше показано обогащение эмбеддингов, за счет добавления в них вращений. Это используется в роторных эмбеддингах в трансформерах, например в моделе Т5, что дополняет дискретную природу текстов. Данный подход хорошо характеризует и то, что делают многомерные матрицы вращений в обучении модели Splitter на дополнительных шагах обучения, для обогащения новых стартовых векторов и текстовых эмбеддингов.
Я решил, что стоит добавить слой RoPE в модель Splitter, для предобработки входящих текстовых эмбеддингов last-hidden-state. Также применил блоковую структуру модели взамен простого чередования слоев. Все эти моменты могут улучшить работу модели Splitter.
![Givens Coordinate Descent Methods for Rotation Matrix Learning in Trainable Embedding Indexes Givens Coordinate Descent Methods for Rotation Matrix Learning in Trainable Embedding Indexes](https://habrastorage.org/getpro/habr/upload_files/c0b/0c9/c3a/c0b0c9c3af727e75beba0530fe54a98c.png)
Также подтверждение направления моего поиска дала мне и статья Givens Coordinate Descent Methods for Rotation Matrix Learning in Trainable Embedding Indexes. Она посвящена применению матриц вращения в рекомендательных системах для поиска документов в поисковых базах и встраиванию этих матриц в процесс обучения.
У меня матрицы вращения применяются так же, но я решил несколько уточнить обучение. В текстовых моделях, не редко, кроме нужного мне слоя last-hidden-state есть слой и проекции текстовых эмбеддингов. Он есть и в модели CLIP-ViT‑G, что я использую на текущем этапе работ. Я решил добавить в предобработку для сбора данных данные с этого слоя, так как они удобны для выяснения косинусной близости текстовых эмбеддингов и unclip векторов как входящих, так и предсказываемых.
Изменения в структуре модели
Для усложнения структуры нейронной сети при работе с большими количествами описаний роликов я решил также несколько изменить как входные данные, так и внутреннюю структуру нейронной сети.
Ранее, для описания того какой кадр нам нужен из текущего состояния, в нейронную сеть подавалось натуральное число, которое характеризует расстояние между кадрами, и так же подавался класс направления 0 или 1 (вперед, в обратном направлении). Но в нейронную сеть не подается знание от длины фильма, хотя косвенно это конечно присутствует в обучении нейронной сети, в работе функции потерь.
Информация о направлении и силе шага
Я решил объединить информацию о направлении и силе шага одним значением в диапазоне (-1, 1), нормирую позицию кадра к общему количеству кадров. Это изменение не только упрощает входные данные, но и потенциально повышает точность предсказаний модели за счет того, что нейронная сеть теперь может учитывать не только направление движения во времени, но и его интенсивность относительно общей продолжительности ролика.
Для обработки этого нового входа используется линейный слой, что позволяет преобразовать непрерывное значение в необходимый для работы модели формат. Это решение добавляет гибкость, поскольку линейный слой может настраиваться для улавливания тонких нюансов изменения кадров, что было бы сложнее достичь при использовании стандартных методов эмбеддинга для дискретных классов.
Добавление поворотных позиционных эмбеддингов
Для улучшения понимания структуры текста, положения слов, добавлен слой поворотных позиционных эмбеддингов RoPE, который объединяет преимущества абсолютных и относительных позиционных векторов, представляя позиционную информацию через вращение вектора слова. Это должно позволить модели понимать как абсолютное положение токенов, так и их относительные расстояния.
Добавление слоя перекрестного внимания
В дополнении к слою RoPE, в модель Splitter добавляется слой перекрестного внимания cross_attention. Информация из текстовых эмбеддингов дополнительно кодируется поворотно позиционными эмбеддингами и далее в слое cross_attention сравнивается с информацией о направлении и силе шага.
![Understanding and Coding Self-Attention, Multi-Head Attention, Cross-Attention, and Causal-Attention in LLMs Understanding and Coding Self-Attention, Multi-Head Attention, Cross-Attention, and Causal-Attention in LLMs](https://habrastorage.org/getpro/habr/upload_files/508/4b1/3fc/5084b13fcac898f12f2bf0731dd5d809.png)
Добавление проекции текстовых эмбеддингов
Как я выше написал, добавление проекции текстовых эмбеддингов понадобилось для подсчета косинусной близости между текстовыми и unclip векторами. Я решил заменить применявшиеся вначале внешние коэффициенты на динамические. Перед поворотом эмбеддингов last-hidden-state делается сверка косинусной близости с их проекции и unclip векторами и значение близости применяется в доработанном классе матриц вращений, за счет чего матрицы поворачивают векторы last-hidden-state боле аккуратно. Такой же более мягкий поворот делается и при регрессионном шаге в обучении и при регрессионной генерации unclip векторов для последующей генерации изображений с помощью Декодера.
Добавление точности
Изначально я ориентировался только на ошибки модели и по ним учитывал и их уровень обучения, и обновление модели (см. схему трейнера во 2-й части). Постепенно стало понятно, как стоит считать точность модели. Первичные вектора unclip из Prior и вектора изображений из модели CLIP-ViT‑G имеют некоторую косинусную близость, так как модель Prior училась их сближать.
В итоге такая точность стала вполне адекватным параметром в дополнение к данным по ошибке. И появление рабочего варианта подсчета точности дало мне подсказку как я могу динамически параметризировать вклад в общую ошибку при обучении от регрессионного шага. Это как раз усредненное окном назад по эпохам значение точности. За счет этого модель также стала более ровно учиться, так теперь ошибка от шага регрессии дают большей вклад в итоговую ошибку на эпохе с увеличением точности модели.
Переход на блоковое строение модели
Обычные линейные слои, дополненные функциями активации и регуляризации, я заменил на Improved Block с пробросом градиентов. Блоки Improved Block, используемые вместо простого каскада линейных слоев, вносят в модель ряд ключевых особенностей и преимуществ, которые могут существенно улучшить качество обучения и эффективность архитектуры.
Структура обновленной модели Splitter Next построенной на блоковой структуре, со слоями перекрестного внимания и с обучаемым слоем Dropout в понижающих блоках.
![Splitter Next Spliter.png](https://habrastorage.org/getpro/habr/upload_files/bec/444/235/bec44423536284a93502e1a0b9089993.png)
Результаты применения обновленной модели Splitter Next, обученной обновленным трейнером.
![](https://habrastorage.org/getpro/habr/upload_files/373/287/a94/373287a94b3d15f86f49d1ebb25e428b.gif)
![](https://habrastorage.org/getpro/habr/upload_files/e32/50c/360/e3250c36006d7c685a806e724b27020b.gif)
Стоит отметить, что удалось добиться малого изменения при первой генерации от того, что дает чистая модель Text-2-Image (слева). Это может пригодиться для соединения роликов с близкими текстами для первого шага в новой генерации с новым текстом.
Далее примеры разных типов генерации моделью, как просто от силы шага, так и регрессионными шагами в том числе и с вращением входных эмбеддингов на основе сравнения входных и сгенерированных векторов. А также пример модели Кандинский видео, построенной на моделе Кандинский 3.1.
![](https://habrastorage.org/getpro/habr/upload_files/914/3e8/710/9143e8710bac0ebce33c6f22164ff692.gif)
![](https://habrastorage.org/getpro/habr/upload_files/729/50a/5e1/72950a5e177b0e358b32e763a1c7d4a1.gif)
![](https://habrastorage.org/getpro/habr/upload_files/735/ae7/83c/735ae783cde3f0e865535b38603c0a66.gif)
Spliter_Dual
Далее я экспериментировал со смешиванием информации от полных текстовых эмбеддингов и unclip векторов через разные варианты слоя перекрестного внимания. И оказалась, что это очень неустойчивое в обучение соединение информации.
Наиболее рабочей оказалась двойная структура модели Splitter.
![Spliter_Dual Spliter_Dual.png](https://habrastorage.org/getpro/habr/upload_files/7ee/a7f/d35/7eea7fd355516a792d5ddc625514a3af.png)
![Incream_dog_good_2.gif](https://habrastorage.org/getpro/habr/upload_files/48d/130/c44/48d130c4447b6999fccebf2dae47f9f3.gif)
![gen_from_gen Splitter_dual gen_from_gen_increament_dual_acc_all_ways_base_losses_norm_cos_1_new_data_300_seed_70804.gif](https://habrastorage.org/getpro/habr/upload_files/66f/208/a2a/66f208a2a0c57e54c9262a15b95e220b.gif)
Оба примера выше получены от модели Splitter_dual при авто регрессионном варианте создания эмбеддингов для последующей генерации кадров декодером.
![получение эмбеддингов авто регрессионно получение эмбеддингов авто регрессионно](https://habrastorage.org/getpro/habr/upload_files/19c/738/80a/19c73880a315c4c311112ef92bc222d5.png)
Как видно из схемы, после предсказания эмбеддинга и для его авто регрессионного использования для следующего предсказания моделью Splitter_Dual, происходит поворот текстовых векторов через матрицу вращения, полученную от изменений между предсказанным и стартовым эмбеддингом, как это применяется и в обучении.
В итоге модель становится достаточно творческой и интересной. Хотя ее эмбеддинги для генерации декодером уже очень далеки от исходного изображения модели получаемого от Text-2-Image.
Если дать моделе генерировать эмбеддинги далее, то будут хорошо видны ее галлюцинации. Но вместе с тем есть логическая связность в происходящем, хотя порой и забавная.
![gen2gen_SpliterDual_textfrizee.gif gen2gen_DualBranchSpliter_textfrizee_seed_70804.gif](https://habrastorage.org/getpro/habr/upload_files/1db/421/7e2/1db4217e2921d37c2e30099044ed932f.gif)
![gen2gen_splitter_dual_rote_all_ways_base_losses_new_data_300.gif gen_from_gen_increament_dual_rote_all_ways_base_losses_norm_cos_1_new_data_300_with_dim2norm_1_seed_70804.gif](https://habrastorage.org/getpro/habr/upload_files/d6f/327/869/d6f327869a930ace5f3a20e86dd6cf1a.gif)
Основные эксперимента, а точнее обучение моделей Splitter, проводились на 300-500 роликах из датасета TGIF с использованием видеокарты Т4 в колабе. Таковы были мои ресурсы.
![gen2gen_DualBranchSpliterCSA.gif gen2gen_DualBranchSpliterCSA_trainloop_W_allways_baseloss_pwr0_tgif300500_rize_1e-75_rote_pow_0_seed_8599.gif](https://habrastorage.org/getpro/habr/upload_files/e8a/f2d/6d4/e8af2d6d4cb9bb883577ba0342c525cb.gif)
Но даже при столь малых и шумных данных, малых текстовых описаниях к роликах и слабом, по современным меркам, текстовом декодере в приоре Кандинского 2.2, хорошо заметна эффективность описанного подхода. Так как учить приходится небольшую модель Splitter, которая становится обученной матрицей вращений для предсказания направления изменений вектора генерации готовой и замороженной моделью Кандинском 2.2.
Оценка моделей
В рамках магистерской работы в МФТИ мне было необходимо было провести оценку полученных моделей для генерации видео. Для оценки я взял датасет MSR_VTT ((Microsoft Research Video to Text) . Его часто используют как бенчмарк как для задачи video-2-text, так и для задачи text-2-video. Пробные тесты показали наличие очень странных или скорее сложных для задачи text-2-video примеры.
![Проблемы датасета Microsoft Research Video to Text Проблемы датасета Microsoft Research Video to Text](https://habrastorage.org/getpro/habr/upload_files/5de/e0d/2c3/5dee0d2c30c12a062c2287221621a8d5.gif)
Слева пример из датасета, где диктор за кадром описывает игру, а справа сгенерированный моделью ролик по описанию из датасета. И подобных неоднозначных роликов в случайной выборке порядка 40% .
Для того, чтобы оценить работу модели, я отобрал из случайной выборки 30 роликов. Таковы мои ресурсы, так как оценка это много этапный и затратный процесс. Далее вырезал центральную квадратную часть из кадров и присвоил роликам текстовые описания, созданные мультимодальной моделью UForm. Далее я сделал генерации по 16 кадров из новых текстовых описаний модели Splitter + Кандинский 2.2 и моделью Text2VideoZero и далее оценил соответствующими метриками. Метрика FID из библиотеки Pytorch, а остальные метрики с помощью фреймворка common_metrics_on_video_quality .
![сравнение сравнение](https://habrastorage.org/getpro/habr/upload_files/5bf/69e/550/5bf69e550ffc941ced5164a71cf90c59.png)
И в итоге видно, что не специализированная видео модель Кандинский_2.2 дополненная вставкой Splitter_Dual показывает результат в пределах ошибки сходный со специализированной моделью Text2VideoZero . Кроме того, Splitter_Dual обучалась только на 500-х роликах из другого датасета.
![пример из тестовой генерации пример из тестовой генерации](https://habrastorage.org/getpro/habr/upload_files/21d/339/327/21d339327e50f1827e2d97c8330338d2.gif)
В этой и предыдущих 1-й и 2-й частях, я показал путь и результаты в рамках моей магистерской работы в МФТИ с октября 2023 по май 2024г..
Параллельно стали выходить работы целых команд по генерации видео. Большинство, где это можно увидеть, используют подход, который делает следующие генерации кадров на основе уже сгенерированных кадров. То есть модели выходят из латентного пространства и работают уже image-2-video модели.
![Mora: Enabling Generalist Video Generation via A Multi-Agent Framework, 22 Mar 2024 Mora: Enabling Generalist Video Generation via A Multi-Agent Framework, 22 Mar 2024](https://habrastorage.org/getpro/habr/upload_files/bc6/ef4/c4b/bc6ef4c4b42e93a826affdc7553e8cbd.png)
![Kandinsky Video 1.1 used interpolations Kandinsky Video 1.1 used interpolations](https://habrastorage.org/getpro/habr/upload_files/01e/601/878/01e601878370ea3251b63fa629e5bdbd.png)
В моей работе все шаги делаются в латентном пространстве текстов и создается набор аккуратно измененных эмбеддингов, из которых уже отдельно потом генерируются картинки, которые оказываются по смыслу и движениям близки и пригодны для соединения в видео.
Так что было приятно осознать, что мне удалось решить одному эту задачу на своем техническом и ресурсном уровне в ногу с целыми командами, используя только Colab и небольшой датасет. Исследования данного этапа также представлены в моем репозитории, а также есть видео выступления на конференции DataStart.
Как я уже писал выше, я продолжаю работать над этой задачей и ищу решения на уровне топологи латентных пространств для других более современных моделей генерации изображений с мощными текстовыми декодерами. Продолжение следует.