自动编码器的损耗功能


21

我正在尝试一些自动编码器,并使用tensorflow创建了一个试图重建MNIST数据集的模型。

我的网络非常简单:X,e1,e2,d1,Y,其中e1和e2是编码层,d2和Y是解码层(Y是重构的输出)。

X具有784个单位,e1具有100个单位,e2具有50个单位,d1具有100个单位,Y具有784个单位。

我将S型曲线用作层e1,e2,d1和Y的激活函数。输入在[0,1]中,因此应该是输出。

好吧,我尝试使用交叉熵作为损失函数,但输出始终是斑点,并且我注意到从X到e1的权重始终会收敛到零值矩阵。

另一方面,将均方误差用作损失函数,会产生不错的结果,我现在可以重构输入。

为什么呢?我以为我可以将这些值解释为概率,因此可以使用交叉熵,但是显然我做错了。


1
您提到在第一层中使用sigmoid作为激活功能。那些表现出“饱和”,如CS231n注释中所述。您是否尝试过其他激活功能(如ReLU)?
杰里(Jerry)

如果尝试其他操作,我现在不记得了,但是感谢您的分享!
AkiRoss

Answers:


18

我认为对此的最佳答案是,交叉熵损失函数并不十分适合此特定任务。

在采用这种方法时,您实际上是在说真正的MNIST数据是二进制的,并且像素强度表示每个像素“打开”的概率。但是我们知道事实并非如此。这种隐含假设的不正确性随后导致了我们的问题。

我们还可以查看成本函数,并查看为什么它不合适。假设我们的目标像素值为0.8。如果我们绘制MSE损失和交叉熵损失(对此进行归一化,以使其最小值为零),我们得到:-[目标日志预测+1个-目标日志1个-预测]

交叉熵与mse损失

我们可以看到交叉熵损失是不对称的。我们为什么要这个?为这个0.8像素预测0.9真的比预测0.7还要差吗?我会说这可能更好,如果有的话。

我们可能会更详细地说明为什么这会导致您看到特定的斑点。我可能会猜测,这是因为在您看到斑点的区域中,像素强度平均高于0.5。但是通常这是您使隐式建模假设不适用于数据的情况。

希望有帮助!


3
如果输入在0到1之间浮动,哪种损失函数合适?
Jemshit Iskenderov '18

二进制交叉熵损失
torayeff
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.