Введение в нейрогенерации. Автоэнкодер

Привет, я Тимофей из Photonity AI. Мы занимаемся разработкой телеграм-бота, который позволит использовать все новинки нейросетевых генераций фото и видео в одном месте.

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

Создание изображений с помощью ИИ уже прочно вошло в нашу реальность, однако для многих из нас сам процесс генерации всё ещё является чем-то вроде магии. В этом цикле статей мы хотим последовательно, шаг за шагом, объяснить, как это работает, начиная с базовых моделей и заканчивая самыми свежими технологиями, которые вывели качество генерируемых изображений на совершенно новый уровень. Теперь их можно использовать не только в качестве шутки — «смотрите-ка, что нейросеть нагенерила», — но и для иллюстрирования статей, оформления сайтов, а также создания фотосессий.

Начнём наше путешествие с самого простого генератора — автоэнкодера. Простыми словами, автоэнкодер — это нейросеть, которая учится сжимать и восстанавливать данные.

Введение в нейрогенерации. Автоэнкодер

Автоэнкодер состоит из трёх частей: энкодера, декодера и латентного пространства (латента). Суть его работы проста: он берёт на вход картинку X, с помощью энкодера извлекает из неё всю значимую информацию и отбрасывает незначимую, переводя изображение в компактное представление — латент. Затем, с помощью декодера, он восстанавливает исходную картинку.

Чтобы лучше представить процесс, давайте будем представлять его на примере рукописных цифр. Вобще, в области нейросетей самым дорогим и трудоёмким является сбор и разметка данных, на которых производится обучение. Поэтому существует некоторое количество «стандартных» наборов размеченных данных (они также называются датасетами), которые широко используются для обучения и тестирования моделей. Одним из таких датасетов является MNIST, включающий 60 тысяч изображений рукописных цифр.

Введение в нейрогенерации. Автоэнкодер

Возвращаясь к автоэнкодеру, представим, что он получает на вход изображение цифры «7» и пытается его реконструировать. Здесь возникает закономерный вопрос: зачем нам нужно восстанавливать изображение, которое у нас уже есть? Помимо того, что это просто интересная задача (а в науке любят такие задачи), такой подход позволяет научиться распознавать цифру, изображённую на картинке. Если декодер может точно воспроизвести «7» по данным латента, значит в латенте содержится информация, отражающая саму «суть» (набор характерных признаков) цифры. Упрощённо говоря, латенты, полученные при обработке разных семёрок, будут похожи между собой и образуют «семейство», как и латенты других цифр. Таким образом, распознавание цифры сводится к определению того, на какую группу латентов больше всего похож латент, полученный при пропускании данной картинки через энкодер.

Способность декодера взять латент и воспроизвести из него цифру позволяет рассматривать такую архитектуру как простейший генератор изображений. Главный минус этой модели заключается в том, что каждая конкретная картинка «7» (как и любой другой цифры) кодируется в отдельную точку в латентном пространстве. То есть в одной области пространства мы получаем множество точек, соответствующих разным рукописным «7», а в другой — множество точек для рукописных «3» и так далее. Эти точки не образуют непрерывных областей, между ними могут быть «пустоты».

Введение в нейрогенерации. Автоэнкодер

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

Введение в нейрогенерации. Автоэнкодер

Исследователи подавали на вход декодера различные латенты, с которыми сеть ранее не сталкивалась, и смотрели, что получится на выходе. «Неизвестные» латенты создаются просто: например, есть два латента, соответствующих разным «9». Если усреднить их, получится новый латент, отражающий «среднюю» девятку. Точно так же можно усреднить латенты «9» и «1» и получить нечто промежуточное.

Как видно на изображениях, если латенты близки к «9», декодер выдаёт что-то смутно похожее на «9», если близки к «1» — на «1». Но когда латенты принадлежат «промежуточной» области, результат чаще похож на размытый гибрид цифр, чем на что-то осознанное.

Введение в нейрогенерации. Автоэнкодер

Итоги:

О чём мы говорили?

  • Автоэнкодер — это нейросеть, которая учится сжимать данные в компактное представление (латент) и затем восстанавливать их.
  • Такой подход позволяет извлекать из данных важную информацию, отбрасывая лишнее.
  • Латентное представление можно использовать для классификации и поиска похожих объектов и других задач.

Как это работает?

  • Энкодер превращает картинку в вектор признаков (латент).
  • Декодер по этому вектору пытается восстановить исходное изображение.
  • Если восстановление качественное, значит латент хранит «суть» картинки.

Почему автоэнкодер не является настоящим генератором?

  • Он воспроизводит только то, что видел при обучении.
  • Случайные латенты или их интерполяция часто дают бессмысленные результаты, потому что пространство «дырявое».

На этом мы заканчиваем. В следующий раз познакомимся с первым настоящим генератором — вариационным автоэнкодером, который решает описанные проблемы, превращая набор точек в облака вероятностных распределений. Благодаря этому латентное пространство становится гладким и удобным для генерации.

А сейчас приглашаем попробовать наш сервис Photonity AI и создать свою первую нейрофотосессию

1
1 комментарий