Найти тему

Как строили "Шедеврум"

Оглавление
"Стройка века", Shedevrum 1.3. Экран, пиксели, 2024. Фрагмент.
"Стройка века", Shedevrum 1.3. Экран, пиксели, 2024. Фрагмент.

Вам интересно, как создаются нейросети? Мне — да.

Недавно мне попалась очень интересная и подробная статья, написанная одним из членов команды разработчиков YandexArt — нейросети, на которой основано приложение "Шедеврум". Это очень объёмная статья, поэтому при желании можете почитать оригинал, а здесь я перескажу только те моменты, которые показались мне наиболее интересными и простыми для понимания. Технические подробности опущу: во-первых, я в этом почти не разбираюсь, во-вторых, подозреваю, что и большинство из вас тоже не эксперты (иначе вы читали бы профильные сайты, а не этот блог). Но даже без них можно получить представление о том, как много сил и времени было вложено в этот проект, и перестать воспринимать его как данность, или, ещё хуже — как что-то, что Яндекс всем нам обязан выдать на блюдечке именно в том виде, в котором нам хочется.

Инструменты и материалы

Начинали в Яндексе скромно, по-домашнему, со своих собственных ресурсов. Первая база данных была составлена из поисковых запросов пользователей и соответствующих им картинок - результатов выдачи. К сожалению, она оказалась непригодна для работы из-за слишком слабого соответствия текста и изображений (вы сами можете убедиться в этом, просто попробовав найти что-нибудь специфическое в поисковике).

Поэтому разработчикам пришлось переключиться на специально составленные "очищенные" датасеты (базы данных) в формате "текст-картинка", находящиеся в открытом доступе. Первые результаты генераций обученной на них модели были всё ещё далеки от идеала, но это уже был значительный шаг вперёд. Что важнее, опыт работы с этими базами данных позволил команде Яндекса начать формировать собственные оригинальные датасеты, специально заточенные под обучение нейросетей. Так что теперь YandexArt работает преимущественно на собственном "сырье".

"Шедеврум" 1.3. Автопортрет.
"Шедеврум" 1.3. Автопортрет.

Дальше нужно было выбрать оптимальный метод генерации. Существует два базовых подхода к созданию изображений, которые опробовали в Яндексе. В первом (Latent model) весь процесс от начала до конца проходит в одной модели: она генерирует сначала очень маленькую картинку плохого качества, а затем постепенно увеличивает её, добавляя детали. Так работают, кстати, мои любимые Stable Diffusion XL и DALL-E 3.

Во втором (Cascaded diffusion) за создание исходной картинки и дальнейшее её увеличение отвечают разные модели, которые работают в связке и формируют как бы модульную конструкцию. На этом принципе основана работа нейросетей Imagen от Google и DALL-E 2. Преимущество этого метода в его гибкости: модели-увеличители обучаются отдельно и являются взаимозаменяемыми. Можно подбирать разные модели и датасеты в зависимости от текущей задачи или доступных вычислительных ресурсов. В Яндексе остановились на этом подходе.

"Шедеврум" 1.3
"Шедеврум" 1.3

Вкратце процесс создания картинки в YandexArt выглядит так:

  • сначала на основе текстового запроса генерируется зачаточное изображение размером 64х64 пиксела;
  • затем вторая модель увеличивает картинку до размера 256х256 пикселов, при этом текстовый запрос всё ещё учитывается. На этом этапе добавляются относительно крупные детали;
  • наконец, на третьей стадии картинка снова увеличивается, уже до 1024х1024 пиксела, а на текст модель больше не обращает внимания: она сосредоточена на повышении разрешения (улучшении качества) того, что уже создано.

Для понимания запроса, введённого пользователем, существует отдельная модель - переводчик с человеческого на машинный. Это тоже внутренняя разработка Яндекса, которая изначально создавалась для использования в поисковике.

"Шедеврум" 1.3
"Шедеврум" 1.3

Строгий отбор, цензура и фильтры

В самом начале экспериментов Яндекс пытался работать с гигантским датасетом (почти триллион пар "текст-картинка"), общий объём которого сравним с размерами всей видимой части Вселенной Интернета. Очень быстро экспериментаторы выяснили, что результаты обучения на такой куче мусора хорошими не будут, и её нужно отфильтровать.

Фильтрация проводилась по трём направлениям: качество картинки, качество текста и степень соответствия первого второму.

Фильтрация картинок

1. В первую очередь из датасета были удалены разного рода неприличные и сомнительные картинки, чтобы модель их даже в глаза не видела, а, значит, не смогла бы воспроизвести. (Впрочем, как пользователь "Шедеврума" могу утверждать, что здесь за качеством фильтрации следили не очень тщательно, потому что кое-что неприличное модель всё-таки явно успела подсмотреть.)

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

"Шедеврум" 1.3
"Шедеврум" 1.3

3. Далее картинки отсортировали по размерам и пропорциям. Отбирались изображения в диапазоне величин от 512 до 1024 пикселов по одной стороне с соотношением сторон от 0,5 до 2 (в результате мы сейчас и имеем форматы 1:1, 3:4, 4:3, 16:9 и 9:16 в версии "Шедеврума" 1.3).

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

5. И снова конкурс красоты для картинок: эстетическая привлекательность оценивалась повторно, более тщательно, с использованием различных алгоритмов и ручным управлением.

Чтобы результаты генерации не выглядели скучными и однообразными, особо были отобраны сложные изображения с большим количеством объектов и деталей. Отдельное внимание уделили фону: картинкам, на которых изолированный объект помещён на однородный фон, было решено отдать всего 10% от общего объёма датасета. Все остальные изображения имели "интересный", более насыщенный деталями фон.

И это был только предварительный этап. Чуть позже настройка перешла на полностью ручной режим: оценивать оставшиеся картинки начали люди — асессоры Яндекса.

"Шедеврум" 1.3
"Шедеврум" 1.3

Фильтрация текста

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

В начале фильтрации разработчики сфокусировались на английских текстах. Используя автоматический определитель языка, они отсеяли все прочие. Почему именно английский — автор не уточняет, но могу предположить, что, во-первых, из-за чистой массы: сайтов на английском в Сети больше, чем на каком-либо другом. Во-вторых, качественных изображений в англоязычном сегменте Интернета тоже намного больше. Ведущие фотографы, дизайнеры и цифровые художники мира, как правило, публикуют свои работы на англоязычных сайтах или с аннотациями на английском языке. Поэтому становится понятно, из-за чего "Шедеврум" в ранних версиях был заметно ориентирован на Запад.

Около 4 800 текстов, выбранных случайным образом, были вручную обработаны и снабжены пометками-ярлыками. Эти ярлыки содержали либо отредактированную и вычищенную версию текста, либо были пустыми, что означало "для работы непригоден". Все пустые ярлыки были отброшены, а отредактированные составили стартовый текстовый датасет. На нём Яндекс обучил языковую модель, на которую и опирался в дальнейшем для определения качества текстов.

"Шедеврум" 1.3
"Шедеврум" 1.3

Фильтрация пар "текст-картинка"

После предварительной сортировки у Яндекса осталось примерно 2,3 млрд пар "текст-картинка", и их требовалось отфильтровать ещё тщательнее. Здесь снова пришлось поработать вручную: на этот раз весь массив делили на три кучки. Пометки "хорошо", "сойдёт" и "плохо", оценивающие одновременно и привлекательность картинки, и соответствие её тексту, получили 66 000 пар. На этой выборке обучили ещё один алгоритм, который определял, насколько хорошо пара "текст-картинка" подходит для обучения конечной генеративной нейросети (кажется, мы приближаемся к цели).

Целевым размером датасета для Яндекса было 300 млн картинок с "интересным" фоном и 3 млн — с однотонным фоном. Итого 303 млн, полученные в результате тщательного отсева из почти триллиона изображений!

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

"Шедеврум" 1.3
"Шедеврум" 1.3

Оценка модели

Финальная стадия — оценка качества создаваемых нейросетью изображений. Для такой работы существуют специальные алгоритмы, но в Яндексе сочли, что машины плохо справляются с этой задачей, поэтому снова поручили её людям. Насколько я понимаю, этим занимались асессоры Яндекса, набранные для работы в ЯндексКрауде. Им предлагалось сравнить пары картинок, сгенерированных по одному и тому же запросу разными нейросетями, и оценить их по трём параметрам:

  • наличие дефектов;
  • степень соответствия запросу;
  • эстетическая привлекательность.

В этом тесте "вслепую" (участники не знали, какая нейросеть создала картинки) YandexArt сравнивалась с "Кандинским" v3, Midjourney, SDXL и Openjourney. Если верить результатам, опубликованным в оригинальной статье, то в большинстве случаев YandexArt обогнала конкурентов по всем показателям, за исключением соответствия запросу: тут её пока с небольшим перевесом побеждает "Кандинский". Верить этому или нет — личное дело каждого; эти оценки в любом случае субъективны. Если вы принимали участие в этих тестах, поделитесь своим мнением в комментариях: будет интересно его узнать.

"Шедеврум" 1.3
"Шедеврум" 1.3

Ну как, изменилось ваше отношение к "Шедевруму" после прочтения? Моё —определённо да. Добавьте ко всему вышеописанному огромную работу программистов - инженеров нейросетей, создававших алгоритмы, и мы получим самую настоящую стройку века. Когда вы в следующий раз увидите в приложении очередного вязаного котика верхом на сардельке, вспомните об этом.