Я обучаю вариационный автоэнкодер с tenorflow 2.0 с использованием высокопроизводительного API Keras. Цель состоит в том, чтобы резонировать изображения, которые состоят из формы с однородной интенсивностью int_shape
, не равной нулю на нулевом фоне, см. Следующее изображение с int_shape = -0.25
:
![enter image description here](https://i.stack.imgur.com/8aYfJ.png)
Вариационный автоэнкодер имеет следующую архитектуру: w со скрытым пространством из 50 измерений, в отличие от 16, указанных на изображении :
![enter image description here](https://i.stack.imgur.com/7dJs4.png)
Лямбда-слой использует функцию для выборки из нормального распределения, которое выглядит так:
def sampling(args):
z_mean, z_log_var = args
epsilon = K.random_normal(shape =(1,1,latent_dim))
return z_mean + K.exp(0.5 * z_log_var) * epsilon
Потеря представляет собой комбинацию KL расхождение и потеря MSE:
def vae_loss(y_pred, y_gt):
mse_loss = mse(y_pred, y_gt)
original_dim = GLOBAL.input_res**2
mse_loss *= original_dim
z_mean = model.get_layer('z_mean_layer').output
z_log_var = model.get_layer('z_log_var_layer').output
kl_loss = 1 + z_log_var - K.square(z_mean) - K.exp(z_log_var)
kl_loss = K.sum(kl_loss, axis=-1)
kl_loss *= -0.5
return K.mean(mse_loss + GLOBAL.beta*kl_loss)
В настоящее время int_shape
принимает значения в диапазоне (-0,5, 0,5), но разной величины (1e-1, 1e-2 и редко 1e-3) , Целью VAE является получение изображения в качестве входного сигнала и восстановление того же изображения. Для диапазона (-0,5, 0,5) сходимость потерь не является детерминированной c: иногда она остается постоянной на протяжении всего времени, иногда она остается постоянной в течение 5 / 50/180 эпох, а затем падает и сходится. В результате реконструкции не всегда хороши, некоторые грязные, иногда только шум. По моему мнению, сходимость сильно зависит от начальной начальной точки для оптимизации.
Однако, если я масштабирую данные с 10, то есть диапазон (-5, 5) или даже 100, то есть (-50, 50 ), потеря сходится и я постоянно получаю хорошие реконструкции. В диапазоне (-5,5) более высокие абсолютные значения имеют тенденцию к лучшему восстановлению, тогда как в диапазоне (-50,50) практически каждый вход восстанавливается правильно.
Мой вопрос: есть ли связь между диапазоном входных данных и сходимостью потерь в случае VAE?
Из моих экспериментов формы с более высоким int_shape
имеют тенденцию иметь лучшие реконструкции. Я бы отнес это к более высоким градиентам и, следовательно, к большим шагам в пространстве гиперпараметров, так как значение градиентов зависит от значения ввода. Большие шаги ведут к точке, где потеря находит минимум и сходится. В этом смысле меньшие значения приведут к меньшим градиентам, и поэтому будут предприняты меньшие шаги по оптимизации.
Другая теория, которая у меня есть, заключается в том, что для небольшого диапазона (-0,5, 0,5) точки в скрытом пространстве представляют входы расположены ближе друг к другу, и во время случайной выборки они путаются, и для декодера выбирается «неправильная» точка. Я проверил, построив гистограммы скрытых компонентов пространства. Чем выше диапазон входных значений, тем выше дисперсия распределения в скрытом пространстве.
Обновление: я пробовал разные скорости обучения, от 1e-4 до 5e-2, с и без скорости обучения распад (уменьшение на 10% каждые 10 эпох). Я также тренировался для достаточного количества эпох (300), размер партии 64, тренировочный набор 3800 изображений, val на 100. Потеря не улучшилась, и восстановление не является хорошим. И 32-битная, и 64-битная точность с плавающей запятой были использованы без какого-либо успеха. Для скоростей обучения, превышающих 2e-2, потеря иногда превращается в Nan. Самая высокая скорость обучения, обеспечивающая стабильное обучение, составляет 1e-2. Кроме того, скрытое пространство равно 50 (хотя, IMO не должно влиять на проблему).