7.1Kпросмотров
1 февраля 2024 г.
Score: 7.8K
Мы в команде давно заметили, что с VAE в Stable Diffusion 1.5 что-то не так. Оказалась, что не только мы. Тут на редите появился пост об этом. Давайте разберем проблему. Зачем нужно VAE?
Оказалось, что генерировать картинку(и обучать) размером 1024 на 1024 может быть очень сложно, но к счастью, в картинках много избыточности(т. е. взяв рандомные пиксели мы получим шум и надо сгенерировать миллиарды рандомных картинок, чтобы хотя бы одна выглядела как что-то информативное), а значит их можно хорошо сжимать. Поэтому придумали 2 идеи. Сжатие картинки
Сначала генерировать маленькую картинку(пиксельное пространство), а потом растягивать, или сжимать картинку в маленькую матрицу(латентное пространство) и уметь потом обратно возвращаться. Модель которая делает второе и назвали VAE. Требования к VAE
В VAE авторы закладывали 2 важные вещи, без которых sd работал бы плохо:
1) Чтобы соседние пиксели картинки влияли только на соседние значения матрицы в латентном пространстве(и наоборот, чтобы в левом верхнем углу латентной матрицы была информация только о левом верхнем углу картинки
2) Чтобы небольшой изменение чисел в латентной матрице не приводило к сильному изменению картинки. Чтобы латентное пространство не было разряжено Устойчивость VAE Чтобы этого добиться, мы при обучении немного меняем значения латентной матрицы, и при этом хотим восстанавливать оригинальную картинку. Но оказалось, что это не помогло. Какую проблему нашли
Авторы поста на редите начали занулять по одному числу в латентной матрицы sd размером 64 на 64 и смотреть как при этом, после декодирования, изменится оригинальная картинка. Предполагалось, что изменение одного числа не должно сильно сказаться на всю картинку, а только на небольшую область, и у всех чисел влияние будет равнозначным. Но этого не произошло. Ярко желтые пиксели(см фото в коментах) сильно ломали всю картинку К чему привело
И когда обучали SD, он должен был научиться делать какие-то пиксели глобальными, и если этот пиксель предсказывали немного другим, то это влияло на всю картинку. Это должно было привести к тому, что sd обучался дольше, чем должен был, и возникновению артефактов, в том числе мог меняется оттенок всей картинки при инпейтинге. Итого
К сожалению эту проблему не поправить, так как SD уже настроился на эту особенность и потребуется полноценное обучение на новом VAE. У SDXL такой проблемы нет. Мы продолжим следить за событиями Информацию увидел у https://t.me/derplearning