我目前正在使用简单的Autoencoders运行一些测试。我自己完全在Tensorflow中编写了一个Autoencoder,另外复制并粘贴了这个keras博客条目中的代码:https://blog.keras.io/building-autoencoders-in-keras.html(只是为了拥有不同的Autoencoder实现)。
当我测试不同的架构时,我开始使用单层和此层中的几个隐藏单元。我注意到,当我将隐藏单元的数量减少到只有一个(!)隐藏单元时,我仍然可以获得与更大架构(多达几千个隐藏单元)相同的训练和测试损失。在我的数据中,最差的损失是0.5。我尝试的任何架构都达到了0.15。
出于好奇,我将唯一存在的隐藏层中隐藏单元的数量减少到零(我知道这没有任何意义)。但是,我仍然得到0.15的训练和测试损失。我认为这种奇怪的行为可能是由于解码层中的偏差(当我重建输入时)。最初,我将偏差变量(在TF中)设置为trainable = True。所以现在我想即使没有任何隐藏单位,模型仍然可以学习解码层中的偏差,这可能导致我的损失从0.5减少到0.15。
在下一步中,我将解码层中的偏差设置为trainable = False。现在模型(没有隐藏单位)没有学到任何东西,就像我预期的那样(损失= 0.5)。然而,只有一个隐藏的单位,我再次获得大约0.15的测试和训练损失。
按照这种思路,我将编码层中的偏差设置为trainable = False,因为我想避免我的架构只学习偏差。所以现在,只有我的自动编码器的权重是可训练的。这仍适用于单个隐藏单元(当然只有一个隐藏层)。令人惊讶的是,这仅适用于单层网络。一旦我增加了层数(独立于隐藏单元的数量),网络就不会学到任何东西(如果只有权重得到更新)。
我报告的所有内容都适用于训练损失和测试损失(在机器永远不会看到的完全独立的数据集中)。这让我更加好奇。
我的问题是:如何从一个节点“网络”中学到更多,从一个更大的网络(用于培训和测试)中学到什么?第二,怎么可能更大的网似乎永远不会过度拟合(训练和测试错误略有变化,但总是可比的)。任何建议都会非常有帮助! 非常感谢! 尼尔斯