Введение

Это апрель 2023 года.

ChatGPT и Stable Diffusion сейчас в моде. Эксперты говорят о волне инноваций ИИ. Каждую неделю появляются новые стартапы.

Между тем у вас не было возможности поиграть с этими новыми технологиями. Вы были заняты своей работой, и пространство генеративного ИИ вас пугает. Вы не знаете, с чего начать.

Однажды, просматривая YouTube, вы натыкаетесь на что-то интересное. Вы видите, что fast.ai только что вышел со стабильным курсом распространения.

Вы смотрите первый урок. Это чистое золото. Вы смотрите это снова. Вы взволнованы. Вы делаете заметки и превращаете их в статьи. Вы прочтите это про себя.

Статья

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

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

Интересный! 🤔

Поэтому все, что вам нужно, — это модель, которая подскажет, как изменить входные данные, чтобы получить хороший результат. Однако как обучить такую ​​модель?

Вы можете сгенерировать синтетические данные, добавив шум в MNIST,ноназначение вероятности каждому изображению было бы сложным и произвольным.

Что, если бы вы сделали что-то еще?

Что, если бы вы обучили нейронную сеть предсказывать, сколько шума было добавлено? Затем из изображения можно вычесть шум и получить рукописную цифру.

Используемая для этого нейронная сеть называется U-Net и является первым компонентом стабильной диффузии.

Эффективное обучение

В реальности мы не будем работать с 28*28 цифрами. Мы будем тренироваться на больших изображениях RGB. Если мы рассмотрим размер изображения 512 * 512 * 3, это 786 432 пикселя.

Обучение с миллионами таких изображений RGB потребует много ресурсов. Как мы можем сделать это более эффективно?

Вот тут-то и появляется VAE (вариационный автоэнкодер).

VAE принимают одно и то же изображение в качестве входных и выходных данных и пытаются изучить сжатое представление изображения. Обученный VAE можно разбить на кодер и декодер.

Теперь мы можем закодировать все наши входные изображения в latents. Мы можем добавить шум к этим латентным данным, чтобы обучить нашу U-Net. Наконец, мы можем вычесть шум из латентных шумов и декодировать их с помощью декодера, чтобы получить выходное изображение.

Добавление подсказки

До сих пор мы видели, как U-Net может генерировать изображения. Далее нам нужно указать, какое изображение генерировать.

Нам нужно дать ему подсказку, руководство по созданию правильного изображения.

Для нашего примера MNIST мы можем одним горячим способом закодировать цифру «3», соединить ее с изображением «3» и передать в U-Net.

Для решения общего назначения нам нужно вложение для нашего приглашения, которое представляет изображение.

Для этого требуется набор данных «изображения с подписями» и новая модель.

Мы можем загружать изображения из Интернета и использовать их тег alt в качестве подписи к этому изображению. Например,

<img src="img.jpg" alt="Cat wearing sunglasses" width="500" height="600">

Мы пропускаем комбинацию каждого caption с каждым image через наши кодировщики текста и изображений, чтобы получить соответствующие вложения.

Затем мы можем взять скалярное произведение этих вложений, суммировать их и сохранить в матрице.

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

Эта функция потерь известна как Contrastive Loss (CL), а модель известна как CLIP (Contrastive Language-Image Pre-Training).

После обучения мы можем использовать text_encoder для нашей модели стабильной диффузии.

Планировщик

Последний компонент стабильной диффузии известен как планировщик.

Поскольку мы добавляем различные уровни шума к нашим мини-пакетам, мы можем создать для этого график шума.

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

Собираем все вместе

Вот и все. Это стабильный диффузионный трубопровод.

Конвейер действительно универсален и дает вам множество параметров для создания выходных данных по вашему выбору.

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

Конец статьи

Это отличная статья. Вы нажимаете Опубликовать. Вы вздыхаете с облегчением. Следующие несколько месяцев будут интересными :)

~ счастливого обучения

Использованная литература: