Генерация невидимых изображений с помощью вариационных автоэнкодеров
Как вы, возможно, уже знаете, классические автокодеры широко используются для обучения представлению посредством реконструкции изображений. Однако есть много других типов автоэнкодеров, используемых для множества задач. Тема этой статьи - вариационные автоэнкодеры (VAE). Как видно на рисунке ниже, VAE также пытается восстановить входное изображение; однако, в отличие от обычных автокодировщиков, кодер теперь выдает два вектора, с помощью которых декодер восстанавливает изображение. Таким образом, учитывая распределение, мы можем выбрать случайный шум и создать реалистичные изображения.
Принцип VAE
Цель VAE - создать реалистичное изображение с учетом случайного вектора, который генерируется из заранее определенного распределения. Это было невозможно с простыми автокодировщиками, которые я рассмотрел в прошлый раз, поскольку мы не указали распределение данных, которые генерируют изображение. Таким образом, стратегия такова:
- Кодировщик берет изображение и выводит два вектора, каждый из которых представляет среднее значение и стандартное отклонение.
- Мы суммируем вектор среднего и вектор стандартного отклонения, который сначала умножается на случайное малое значение в качестве шума, и получаем модифицированный вектор, который имеет тот же размер.
- Декодер берет измененный вектор и пытается восстановить изображение.
- Величина потерь, которую мы пытаемся оптимизировать, представляет собой комбинацию расстояния L2 и дивергенции KL, которая измеряет отклонение распределения среднего и векторов стандартного отклонения от 0 и 1 соответственно.
Таким образом, мы рекомендуем, чтобы наш средний вектор имел распределение с центром вокруг 0, тогда как последний вектор должен быть с центром вокруг 1 (гауссовское распределение). Наконец, наш декодер сможет генерировать реалистичные изображения из случайного шума (векторов), генерируемого со средним значением 0 и стандартным отклонением 1.
KL дивергенция
Мы используем дивергенцию KL, чтобы вычислить, насколько наши векторы признаков отличаются от желаемого распределения значений, имеющих среднее значение 0 и стандартное распределение 1. Потери рассчитываются следующим образом:
где сигма и мю - стандартное отклонение и среднее значение соответственно. Как видно, цель состоит в том, чтобы сделать среднее значение (mu) как можно ближе к 0 (возведением значения в квадрат). В то время как остальная часть уравнения гарантирует, что стандартное отклонение (сигма) близко к 1. Обратите внимание, что мы используем логарифм, чтобы убедиться, что стандартное отклонение не является отрицательным.
Пример
Модель, которую я собираюсь использовать, выглядит следующим образом:
Как видно, наш кодировщик выводит журнал дисперсии вместо вектора стандартного отклонения, поэтому будьте осторожны. Пример был запущен на наборе данных MNIST Digit. Наконец, функция потерь выглядит следующим образом:
Вуаля! После всего 10 эпох обучения наш декодер смог создать очень реалистичные изображения случайного шума со средним значением 0 и стандартным отклонением 1 (может быть сгенерировано с помощью функции torch.randn).
Несколько последних слов
Вариационный автоэнкодер - довольно простой, но интересный алгоритм. Я надеюсь, что вам будет легко следовать за мной, но не торопитесь и убедитесь, что вы понимаете все, что мы рассмотрели. Помимо VAE, существует множество типов автоэнкодеров. Не стесняйтесь изучать другие автоэнкодеры самостоятельно, перейдя по приведенной ниже ссылке. Спасибо!