【问题标题】:Using cross-entropy loss in denoising autoencoder saturates output在去噪自编码器中使用交叉熵损失使输出饱和
【发布时间】:2018-04-14 02:57:16
【问题描述】:

我在已缩放到 [0,1] 的 CIFAR10 数据集上使用这个去噪自动编码器的 implementation。 我的超参数是 -

Adam optimizer 
lr = 0.0001
sigmoid activations for both encoder and decoder
512 hidden nodes
Batch size = 50

在将损失函数设置为交叉熵时,它在第一个训练步骤开始时非常庞大。但随后它在 3 步内收敛到 0,这让我很怀疑。经过一段时间的训练后,我将图像传递给 AE,并在评估解码层的输出时,它们都是 1 或接近它,而不是原始图像值。

我对正在发生的事情有一点了解。交叉熵损失在代码中定义为 -

tf.reduce_sum(self.input_data * tf.log(self.decode))

如果解码层的值全为 1,则 tf.log(self.decode) 接近于零。因此网络优化其隐藏权重,使输出接近 1,从而使交叉熵等于 0。我说的对吗?

我该如何解决这个问题?

【问题讨论】:

  • 你在隐藏层中使用了什么激活函数?

标签: neural-network deep-learning autoencoder


【解决方案1】:

不是交叉熵损失。对于伯努利输出变量(由于您使用的是 sigmoid,这意味着它们是伯努利),它应该是

-tf.reduce_sum(
  self.input_data * tf.log(self.decode) + 
  (1-self.input_data)*(tf.log(1-self.decode)))

【讨论】:

  • 输出不是二进制的,它在 [0,1] 范围内
  • @HMK 同样适用于伯努利斯
  • 那么我们什么时候只使用交叉熵损失的第一项而不是整个函数呢?我知道前者用于多类分类,但我不确定其他情况。
  • 我们从不使用“仅第一项”,它始终是所有类的总和(所有可能的因变量值)。在只有 2 个类(伯努利 y)的特殊情况下,我们有 p(y=1|x) = 1 - p(y=0|x),因此您所说的“第二项”只是第一项应用于第二个概率的术语。
  • 在这种情况下,tf.reduce_sum 的 reduction_indices/axis 参数是什么?
猜你喜欢
  • 2021-01-02
  • 2019-04-20
  • 2018-01-31
  • 2019-02-25
  • 2021-03-11
  • 2020-08-26
  • 2021-08-25
  • 1970-01-01
  • 2018-09-03
相关资源
最近更新 更多