Различное поведение оптимизации с использованием np.random-normal вместо tf.random_normal - PullRequest
0 голосов
/ 09 апреля 2019

Я смотрю код от https://github.com/AshishBora/csgm и испытываю странное поведение при использовании np.random.normal вместо tf.random_normal в качестве инициализации tf.Variable.Более конкретный:Вместо

z = tf.Variable(tf.random_normal((batch_size, hparams.n_z)), name='z')

у меня есть

# in mnist_vae/src/model_def.py, line 74
z = tf.Variable(np.random.normal(size=(batch_size, 
                hparams.n_z)).astype('float32'), name='z')

z - переменная, которая оптимизируется с помощью оптимизатора Adam относительно цели.

Для небольшого фона: Существует предварительно обученная нейронная сеть G, чей вход z получен из стандартного нормального распределения с использованием tf.random_normal.Для данного z* требуется решить ẑ= argmin_z ||AG(z)-AG(z*)|| и проверить ошибку восстановления ||G(ẑ)-G(z*)||.Выходное минимальное значение c(z*)=||G(ẑ)-G(z*)|| для нескольких различных z* довольно стабильно в районе значения c1.Теперь я не совсем уверен, может ли оптимизация (оптимизатор Адама) использовать информацию, полученную из стандартного нормального распределения.Поэтому я заменил tf.random_normal на np.random_normal в надежде, что оптимизатор не сможет использовать эту информацию.(см. код выше)

К сожалению, результаты действительно отличаются, если использовать np.random.normal: c(z*)=||G(ẑ)-G(z*)|| для нескольких различных z* стабильных значений, отличных от c2 (не c1).Как можно это объяснить?Действительно ли оптимизатор использует информацию о нормальном распределении (например, в качестве логарифмического правдоподобия) при оптимизации?Я чувствую, что нет, так как это только инициализация.

Код указан в https://github.com/AshishBora/csgm

...