In my implementation of a GAN network the output of the discriminator is something like 2.05145e+07
which leads to 1 - disc_output
-> 1-2.05145e+07=-2.05145e+07
(a negativ number) therefore log(1-2.05145e+07)
leads to NaN.
I am not the first one with this kind of problem. One solution is to only allow positive values inside the log
like done here.
Does anyone knows any better solution to this?
maybe some different loss function ?
答案 0 :(得分:1)
因为鉴别器返回概率值,其输出必须介于0和1之间。在使用鉴别器输出之前尝试使用sigmoid
(https://www.tensorflow.org/api_docs/python/tf/sigmoid)。
此外,正如其他人所做的那样,我建议在数值不稳定的情况下使用tf.log(tf.maximum(x, 1e-9))
。
答案 1 :(得分:1)
有一些标准技术可以避免日志数值不稳定。例如,您经常关心的是损失(这是日志的函数),而不是日志值本身。例如,物流损失:
为简洁起见,请x = logits
,z = labels
。物流损失
z * -log(sigmoid(x))+(1 - z)* -log(1 - sigmoid(x))
= max(x,0) - x * z + log(1 + exp(-abs(x)))
这些技巧已经在标准张量流损失中实现(如tf.losses.sigmoid_cross_entropy
)。请注意,在log 内部采用最大值或最小值的天真解决方案不是是一个很好的解决方案,因为饱和区域中没有有意义的渐变:例如,d/dx[max(x, 0)] = 0 for x < 0
,这意味着饱和区域不会出现梯度。
TensorFlow通过tf.contrib.gan
获得GAN支持。这些损失已经实现了所有标准的数值稳定性技巧,并且避免了你必须重新创建车轮。
tfgan = tf.contrib.gan
tfgan.losses.minimax_discriminator_loss(...)
有关详细信息,请参阅https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/gan。