README.md

WGAN (Wasserstein Generative Adversarial Networks)

WGAN (Wasserstein Generative Adversarial Networks) - генеративно-состязательные сети в обучении использующие расстояние Вассерштейна.

Leonid Nisonovich Vaserstein (Russian: Леонид Нисонович Васерштейн) Русско-Американский математик, на данный момент профессор математики в Penn State University.

Расстояние Вассерштейна - это мера расстояния между двумя распределениями вероятностей. Его также называют расстоянием Earth Mover, сокращенно от EM, потому что неформально его можно интерпретировать как минимальные затраты энергии на перемещение и преобразование кучи земли в форме одного распределения вероятностей в форму другого распределения.

Официальная публикация: https://arxiv.org/abs/1701.07875

Системные требования

Использовались при разработке.

  • Python 3.11.4
  • PyTorch 2.1.1+cu121
  • Видеокарта NVIDIA GeForce GTX 1650
  • CUDA версия 12.2

Среда разработки

  • Редактор - VSCodium 1.84.2 (VSCodium is a community-driven, freely-licensed binary distribution of Microsoft’s editor VS Code.)
  • Расширение для VSCodium (VS Code) - Jupyter v2023.9.100 Extension

Используемые библиотеки

  • PyTorch - ML фреймворк.
  • Torch info (torchsummary) - вывод подробной информации о структуре модели.
  • NumPy - математический функции.
  • Matplotlib - построение графиков.

Рекомендации по сборке

Обязательно укажите путь для сохранения набора данных в константе DATASET_ROOT. По умолчанию установлен путь актуальный для моей системы (z:\Home\Projects\dataset) и скорее всего вам не подойдёт.

Наборы данных используемые в примерах занимают порядка 4.4 Gb

  • CELEBA - 4.3 Gb
  • MNIST - 0.66 Gb

WGAN (MNIST)

wgan-gp_mnist.ipynb - классический WGAN с порезкой весов (weight clipping).

WGNA MNIST result

WGAN-GP (Wasserstein Generative Adversarial Network - Gradient Penalty) (MNIST)

Официальная публикация: https://arxiv.org/abs/1704.00028

Время обучения: ~1 час

wgan-gp_mnist.ipynb - генеративно-состязательные сети в обучении использующие расстояние Вассерштейна с применением метода штрафа градиента (WGAN-GP - Wasserstein Generative Adversarial Network - Gradient Penalty). Генерирует изображения рукописных цифр размером 28x28.

Считается, что среди других методов своего класса, данный метод обучения является самым эффективным.

Сеть обучается на наборе данных MNIST (Modified National Institute of Standards and Technology).

WGAN-GP results

WGAN-GP CelebA

Время обучения: ~9 часов

wgan-gp_celeba.ipynb - генеративно-состязательные сети в обучении использующие расстояние Вассерштейна с применением метода штрафа градиента (WGAN-GP - Wasserstein Generative Adversarial Network - Gradient Penalty). Генерирует изображения рукописных цифр размером 64x64.

Сеть обучается на наборе данных CelebA (Large-scale CelebFaces Attributes (CelebA) Dataset).

WGAN-GP CelebA results

Документация

Лирика

Долго обучается.

Часто утверждается, что WGAN, а в частности WGAN-GP, лучший алгоритм для обучения GAN. Увидеть убедительных результатов, что WGAN-GP лучший среди GAN алгоритмов мне к сожалению не удалось. Есть ощущение, что имеется небольшая стабильность в обучении на финальных стадиях, но, это нивелируется временем обучения.

Так или иначе результат мало отличается по качеству от обычной DCGAN.

Проверенно на наборах данных MNIST и CelebA.


Лучше поздно чем никогда =)

Добавил обычный WGAN. Глядя на результат начинаю понимать почему утверждается, что WGAN-GP лучший алгоритм =)

Сеть быстро уловила стилистику, но дальше проявила упорство в уверенности в том, что она посчитала цифрами =)

Эксперимент WGAN-GP Celeba Perfomance

experiments/wgan-gp_celeba_perfomance.ipynb

Версия с хранением всего набора данных в памяти при обучении.

Рекомендую пк с объёмом памяти от 8Gb.

Прирост в скорости обучения порядка 30%. Ориентировочно 4.16 часа.

Эксперимент: WGAN (MNIST) (RMSProp оптимизатор)

experiments/wgan_mnist_RMSProp.ipynb

WGAN MNIST with RMSProp optimizer results

Есть поверие, корни которого, как утверждается, растут в рекомендации из оригинального документа по WGAN, о том, что использование оптимизатора RMSProp предпочтительно, так как в нем отсутствует импульс, что положительно отражается на сходимости обучения. С другой стороны, есть утверждения, что это не так, так как обоснованных доказательств этому нет.

Я решил проверить этот факт, и в результате особо никакой разницы =)

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

lr = 0.00001
n (critic iteration) = 5
m (batch size) = 64
c = 0.01

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


Отрывок из оригинальной статьи:

Наконец, в качестве отрицательного результата мы сообщаем, что обучение WGAN становится нестабильным в те моменты, когда используется оптимизатор на основе момента, такой как Adam [8] (с β1 > 0), для критика или когда используются высокие скорости обучения. Поскольку потери для критика являются нестационарными, методы на основе момента, казалось, работали хуже. Мы определили момент как потенциальную причину, потому что, когда потери взлетали до небес и образцы ухудшались, косинус между шагом Adam и градиентом обычно становился отрицательным. Единственным местом, где этот косинус был отрицательным, были эти ситуации нестабильности. Поэтому мы переключились на RMSProp [21], который, как известно, хорошо работает даже на очень нестационарных задачах [13].


На момент проведения эксперимента использовался не эффективный для WGAN-GP критик использующий пакетную нормализация. Думаю, что результат эксперимента не является объективным.

Эксперимент: критик без использования Sigmoid

experiments/wgan-gp_mnist_C_no_sigmoid.ipynb - эксперимент на наборе данных MNIST

Удалось заметно увеличить скорость обучения.

Подробности в ноутбуке.

experiments/wgan-gp_celeba_perfomance_C_no_sigmoid.ipynb - эксперимент на наборе данных CelebA

Продолжение изучения идеи критика без Sigmoid. К сожалению результат не самый удовлетворительный =(

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

Подробнее дополнено в начале ноутбука с экспериментом проведенном ранее на наборе данных MNIST (experiments/wgan-gp_mnist_C_no_sigmoid.ipynb).

Спойлер: во всём была виновата пакетная нормализация (batch normalization) которой не должно быть в критике. Была ли виновата Sigmoid(), на момент написания этого комментария, непонятно.

В результате получилось так:

WGAN_GP no batchnorm

Подробности там же: (experiments/wgan-gp_mnist_C_no_sigmoid.ipynb).


Всё таки решил закрыть вопрос с полезностью Sigmoid в критике и провёл несколько экспериментов. Для моего критика Sigmoid оказалась подругой BatchNorm и в разных комбинациях только вредит процессу делая сеть не сходимой. Более того, оказалось, что успехи которых я добивался на первых парах моих экспериментов были только благодаря тому, что в модели критика была пакетная нормализация, без нее сигмойда даёт невменяемые результаты.

Описание
WGAN (Wasserstein Generative Adversarial Networks)
Конвейеры
0 успешных
0 с ошибкой
Разработчики