2

我目前正在使用简单的自动编码器运行一些测试。我自己完全在 Tensorflow 中编写了一个自动编码器,此外还复制并粘贴了这个 keras 博客条目中的代码:https ://blog.keras.io/building-autoencoders-in-keras.html (只是为了有一个不同的自动编码器实现) .

当我测试不同的架构时,我从单层开始,并在这一层中有几个隐藏单元。我注意到,当我将隐藏单元的数量减少到只有一个(!)隐藏单元时,我仍然会得到与更大架构(多达几千个隐藏单元)相同的训练和测试损失。在我的数据中,最差的损失是 0.5。我尝试过的任何架构都达到了 ~ 0.15。

出于好奇,我将唯一现有隐藏层中的隐藏单元数量减少到零(我知道这没有任何意义)。但是,我仍然得到 0.15 的训练和测试损失。我认为这种奇怪的行为可能是由于解码层的偏差(当我重建输入时)。最初,我将偏差变量(在 TF 中)设置为 trainable=True。所以现在我猜即使没有任何隐藏单元,模型仍然会学习解码层中的偏差,这可能会导致我的损失从 0.5 减少到 0.15。

在下一步中,我将解码层中的偏差设置为 trainable=False。现在模型(没有隐藏单元)没有学到任何东西,就像我预期的那样(损失=0.5)。然而,使用一个隐藏单元,我再次得到大约 0.15 的测试和训练损失。

按照这种思路,我将编码层中的偏差设置为 trainable=False,因为我想避免我的架构只学习偏差。所以现在,只有我的自动编码器的权重是可训练的。这仍然适用于单个隐藏单元(当然只是单个隐藏层)。令人惊讶的是,这只适用于单层网络。一旦我增加层数(与隐藏单元的数量无关),网络就不会再学习任何东西(以防只有权重得到更新)。

我报告的所有事情对于训练损失和测试损失都是正确的(在机器永远看不到的完全独立的数据集中)。这让我更加好奇。

我的问题是:我如何从 1 节点“网络”中学到与从更大的“网络”中学到的一样多的东西(用于训练和测试)?其次,更大的网络怎么可能永远不会过拟合(训练和测试误差略有变化,但始终具有可比性)。任何建议都会非常有帮助!非常感谢!尼尔斯

4

0 回答 0