Обучающий генератор генеративной состязательной сети (GAN) в PyTorch

Я работаю над реализацией генерирующей состязательной сети (GAN) в PyTorch 1.5.0.

Для вычисления потерь генератора я вычисляю как отрицательные вероятности того, что дискриминатор неправильно классифицирует полностью реальную мини-серию, так и фальшивую мини-серию полностью (генерируемую генератором). Затем я последовательно повторяю обе части в обратном направлении и, наконец, применяю пошаговую функцию.

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

Однако классификация мини-пакетов, состоящих только из реальных данных, не включает передачу данных через генератор. Поэтому мне было интересно, будет ли следующий фрагмент кода по-прежнему вычислять градиенты для генератора или он вообще не будет вычислять какие-либо градиенты (поскольку обратный путь не ведет через генератор, а дискриминатор находится в режиме оценки при обновлении генератора )?

# Update generator #
net.generator.train()
net.discriminator.eval()
net.generator.zero_grad()

# All-real minibatch
x_real = get_all_real_minibatch()
y_true = torch.full((batch_size,), label_fake).long()  # Pretend true targets were fake
y_pred = net.discriminator(x_real)  # Produces softmax probability distribution over (0=label_fake,1=label_real)

loss_real = NLLLoss(torch.log(y_pred), y_true) 
loss_real.backward()
optimizer_generator.step()

Если это не работает должным образом, как я могу заставить это работать? Заранее спасибо!


person Daniel B.    schedule 06.06.2020    source источник


Ответы (1)


На генератор не распространяются градиенты, так как расчет не производился ни с одним из параметров генератора. Дискриминатор, находящийся в режиме eval, не будет препятствовать распространению градиентов на генератор, хотя они будут немного отличаться, если вы используете слои, которые ведут себя иначе в режиме eval по сравнению с режимом обучения, например, выпадение.

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

Конечно, это не двоичный случай, но генератор всегда пытается улучшить поддельное изображение, чтобы дискриминатор еще больше убедился, что это было реальное изображение. Цель генератора не в том, чтобы дискриминатор был сомнительным (вероятность 0,5, что он настоящий или фальшивый), а в том, чтобы дискриминатор был полностью убежден в том, что он настоящий, даже если он фальшивый. Вот почему они враждебны, а не сотрудничают.

person Michael Jungo    schedule 07.06.2020
comment
Я работаю над расширением некоторого метода, представленного в следующем исследовательском документе: arxiv.org/pdf/1710.04087.pdf В этой статье смешение дискриминатором реальных изображений с поддельными является частью функции потерь генератора (уравнение 4). Итак, мне все еще интересно, как распространить член потерь через генератор, в вычислениях которого сам генератор не участвовал. - person Daniel B.; 07.06.2020
comment
Я не думаю, что должен быть второй срок. Я вижу это ради симметрии, но только первый член имеет какое-либо влияние на W, второй член фактически постоянен относительно. W, что делает его производную равной 0. Если бы вложение также было оптимизировано (т.е. часть генератора), эта потеря имела бы смысл, но это не так, только mapping оптимизирован в их официальном коде. Этот код очень старый и использует устаревшие конструкции PyTorch, но вы все еще можете увидеть, что они сделали. - person Michael Jungo; 07.06.2020
comment
Собственно, код предполагает, что они оптимизируют w.r.t. к обоим условиям. В строке 75 они конкатенируются. истинная цель и ложные вложения перевода, вычислить в строке 116 потерю w.r.t. оба термина и поддерживают объединенные общие потери через их генератор W в 128. Итак, как я вижу, их способ принять во внимание путаницу целевых слов при обновлении генератора - просто добавить оба термина и обратно -распространение совокупного / суммированного убытка. И вы были правы насчет приведенного выше кода: там ничего не поддерживали (проверяли сумму градиентов до и после шага обратной опоры). - person Daniel B.; 07.06.2020
comment
Да, но сложение терминов не влияет на W вообще, так же как in(loss + 10).backward() 10 не имеет никакого эффекта, с таким же успехом его можно было бы оставить. Неважно, 10 это или f (10), пока f не включает W в вычислениях, это просто как константа. В случае конкатенации они представляют собой отдельные выборки из партии, которые не зависят друг от друга, поэтому единственное реальное влияние на первый член заключается в том, что при взятии среднего значения выборок в два раза больше. Я предполагаю, что они изначально планировали оптимизировать вложения с этой потерей. - person Michael Jungo; 08.06.2020