Введение в нейрогенерации. Автоэнкодер
Привет, я Тимофей из Photonity AI. Мы занимаемся разработкой телеграм-бота, который позволит использовать все новинки нейросетевых генераций фото и видео в одном месте.
В этой серии статей я разберу шаг за шагом то, что происходит под капотом нейросетевой технологии создания фото и видео. И первая статья будет посвящена автоэнкодеру.
Создание изображений с помощью ИИ уже прочно вошло в нашу реальность, однако для многих из нас сам процесс генерации всё ещё является чем-то вроде магии. В этом цикле статей мы хотим последовательно, шаг за шагом, объяснить, как это работает, начиная с базовых моделей и заканчивая самыми свежими технологиями, которые вывели качество генерируемых изображений на совершенно новый уровень. Теперь их можно использовать не только в качестве шутки — «смотрите-ка, что нейросеть нагенерила», — но и для иллюстрирования статей, оформления сайтов, а также создания фотосессий.
Начнём наше путешествие с самого простого генератора — автоэнкодера. Простыми словами, автоэнкодер — это нейросеть, которая учится сжимать и восстанавливать данные.
Автоэнкодер состоит из трёх частей: энкодера, декодера и латентного пространства (латента). Суть его работы проста: он берёт на вход картинку X, с помощью энкодера извлекает из неё всю значимую информацию и отбрасывает незначимую, переводя изображение в компактное представление — латент. Затем, с помощью декодера, он восстанавливает исходную картинку.
Чтобы лучше представить процесс, давайте будем представлять его на примере рукописных цифр. Вобще, в области нейросетей самым дорогим и трудоёмким является сбор и разметка данных, на которых производится обучение. Поэтому существует некоторое количество «стандартных» наборов размеченных данных (они также называются датасетами), которые широко используются для обучения и тестирования моделей. Одним из таких датасетов является MNIST, включающий 60 тысяч изображений рукописных цифр.
Возвращаясь к автоэнкодеру, представим, что он получает на вход изображение цифры «7» и пытается его реконструировать. Здесь возникает закономерный вопрос: зачем нам нужно восстанавливать изображение, которое у нас уже есть? Помимо того, что это просто интересная задача (а в науке любят такие задачи), такой подход позволяет научиться распознавать цифру, изображённую на картинке. Если декодер может точно воспроизвести «7» по данным латента, значит в латенте содержится информация, отражающая саму «суть» (набор характерных признаков) цифры. Упрощённо говоря, латенты, полученные при обработке разных семёрок, будут похожи между собой и образуют «семейство», как и латенты других цифр. Таким образом, распознавание цифры сводится к определению того, на какую группу латентов больше всего похож латент, полученный при пропускании данной картинки через энкодер.
Способность декодера взять латент и воспроизвести из него цифру позволяет рассматривать такую архитектуру как простейший генератор изображений. Главный минус этой модели заключается в том, что каждая конкретная картинка «7» (как и любой другой цифры) кодируется в отдельную точку в латентном пространстве. То есть в одной области пространства мы получаем множество точек, соответствующих разным рукописным «7», а в другой — множество точек для рукописных «3» и так далее. Эти точки не образуют непрерывных областей, между ними могут быть «пустоты».
На практике это означает, что интерполяция между такими точками часто даёт бессмысленные результаты, что легко увидеть на примере экспериментов.
Исследователи подавали на вход декодера различные латенты, с которыми сеть ранее не сталкивалась, и смотрели, что получится на выходе. «Неизвестные» латенты создаются просто: например, есть два латента, соответствующих разным «9». Если усреднить их, получится новый латент, отражающий «среднюю» девятку. Точно так же можно усреднить латенты «9» и «1» и получить нечто промежуточное.
Как видно на изображениях, если латенты близки к «9», декодер выдаёт что-то смутно похожее на «9», если близки к «1» — на «1». Но когда латенты принадлежат «промежуточной» области, результат чаще похож на размытый гибрид цифр, чем на что-то осознанное.
Итоги:
О чём мы говорили?
- Автоэнкодер — это нейросеть, которая учится сжимать данные в компактное представление (латент) и затем восстанавливать их.
- Такой подход позволяет извлекать из данных важную информацию, отбрасывая лишнее.
- Латентное представление можно использовать для классификации и поиска похожих объектов и других задач.
Как это работает?
- Энкодер превращает картинку в вектор признаков (латент).
- Декодер по этому вектору пытается восстановить исходное изображение.
- Если восстановление качественное, значит латент хранит «суть» картинки.
Почему автоэнкодер не является настоящим генератором?
- Он воспроизводит только то, что видел при обучении.
- Случайные латенты или их интерполяция часто дают бессмысленные результаты, потому что пространство «дырявое».
На этом мы заканчиваем. В следующий раз познакомимся с первым настоящим генератором — вариационным автоэнкодером, который решает описанные проблемы, превращая набор точек в облака вероятностных распределений. Благодаря этому латентное пространство становится гладким и удобным для генерации.
А сейчас приглашаем попробовать наш сервис Photonity AI и создать свою первую нейрофотосессию