为什么在目标上应用 PCA 会导致欠拟合?

数据挖掘 机器学习 神经网络
2021-10-08 15:04:14

目标:

我是机器学习和神经网络实验的新手。我想建立一个网络,将一系列 5 张图像作为输入并预测下一张图像。我的数据集完全是人工的,只是为了我的实验。作为说明,这里有几个输入和预期输出的例子:

在此处输入图像描述

数据点和目标的图像来自同一来源:一个数据点的目标图像出现在其他数据点中,反之亦然。

我做了什么:

现在我已经建立了一个带有一个隐藏层的感知器,输出层给出了预测的像素。这两层是密集的,由 sigmoid 神经元组成,我使用均方误差作为目标。由于图像相当简单且变化不大,因此效果很好:使用 200-300 个示例和 50 个隐藏单元,我得到了很好的错误值 (0.06) 和对测试数据的良好预测。网络使用梯度下降(使用学习率缩放)进行训练。以下是我得到的各种学习曲线,以及错误随时期数的演变:

在此处输入图像描述 在此处输入图像描述

我正在尝试做的事情:

这一切都很好,但现在我想减少数据集的维度,以便它可以扩展到更大的图像和更多的例子。所以我申请了PCA。但是,我没有将其应用于数据点列表,而是应用于图像列表,原因有两个:

  1. 在整个数据集上,协方差矩阵为 24000x24000,这不适合我笔记本电脑的内存;
  2. 通过对图像进行处理,我还可以压缩目标,因为它们是由相同的图像组成的。

由于图像看起来都很相似,我设法将它们的尺寸从 4800 (40x40x3) 减小到 36,同时仅损失 1e-6 的方差。

什么不起作用:

当我将缩减的数据集及其缩减的目标输入网络时,梯度下降非常快地收敛到高误差(大约 50 !)。您可以看到与上面的等效图:

在此处输入图像描述 在此处输入图像描述

我没想到学习曲线可以从一个高值开始,然后下降并回升......梯度下降如此快停止的通常原因是什么?是否可以链接到参数初始化(我使用 GlorotUniform,千层面库的默认值)。

然后我注意到,如果我提供减少的数据但原始(未压缩)目标,我会恢复初始性能。因此,在目标图像上应用 PCA 似乎不是一个好主意。这是为什么?毕竟,我只是将输入和目标乘以同一个矩阵,所以训练输入和目标仍然以神经网络应该能够计算出来的方式联系起来,不是吗?我错过了什么?

即使我引入 4800 个单元的额外层,以使 sigmoid 神经元的总数相同,我也会得到相同的结果。总结一下,我试过:

  1. 24000 像素 => 50 sigmoid => 4800 sigmoid(= 4800 像素)
  2. 180 "像素" => 50 sigmoid => 36 sigmoid (= 36 "像素")
  3. 180“像素”=> 50 sigmoid => 4800 sigmoid(= 4800 像素)
  4. 180 个“像素”=> 50 个 sigmoid => 4800 个 sigmoid => 36 个 sigmoid(= 36 个“像素”)
  5. 180 "像素" => 50 sigmoid => 4800 sigmoid => 36 线性 (= 36 "像素")

(1) 和 (3) 工作正常;但不是(2)、(4)和(5),我不明白为什么。特别是,由于(3)有效,(5)应该能够找到与(3)相同的参数以及最后一个线性层中的特征向量。这对神经网络来说是不可能的吗?

3个回答

首先,感谢您对原始问题的编辑,因为我们现在知道您正在对所有数据应用相同的转换。

Q:为什么在某些问题上perceptrons执行得这么好?A:因为它们本质上是非线性模型,具有很大的灵活性。缺点是额外的旋钮需要更多数据才能正确调整。generalized linear models

大图:

较少的数据会导致high-bias. High-bias可以通过更多的数据来克服。您已将数据从 4800 个要素数据集减少到 38 个要素数据集,因此应该会看到偏差增加。 Neural networks比没有隐藏层的模型需要更多的数据。

线性与非线性

您的artificial neural network( perceptron) 是一个固有的非线性模型,但您决定使用线性模型 ( PCA) 从数据集中删除特征。单个隐藏层的存在显式地在您的数据中创建了二阶项,并且还有两个额外的非线性变换(输入==>隐藏和隐藏==>预测),它们在每个步骤中添加了 sigmoidal 非线性。

训练数据和目标数据都乘以相同的矩阵以实现降维这一事实实际上仅意味着perceptron如果要重建原始数据的非线性方面,则需要学习矩阵。这需要更多数据,或者您需要减少更少的维度。

一个实验:

polynomial feature extraction我建议尝试一个实验,在整个数据集上执行二阶,然后PCA在该增强数据集上执行。查看您最终获得了多少特征,同时保留了增强数据集 99% 的方差。如果它大于初始数据集的维度,则坚持使用未增强和未缩减的数据集。如果它在原始数据的维度和 38 之间,则尝试perceptron使用该数据进行训练。

一个更好的主意:

与其使用(线性)方差来确定您的 PCA 投影的特征缩减,不如尝试使用不同数量的 PCA 降维来训练和交叉验证您的模型。您可能会发现给定的一组图像有一个最佳位置。例如,当使用 PCA 将 784 个像素特征减少到 50 个线性独立特征时,MNIST 数字数据上的 SVM 表现最佳。尽管从分析主成分的方差来看,这并不明显。

其他选项:

有非线性降维技术,例如isomap您可以研究非线性特征减少的使用,因为您显然会丢失已应用的线性 PCA 的信息。

您还可以研究图像特定feature extraction技术以在降低维度之前添加一些非线性。

希望这可以帮助!

数据集中的大部分方差可能存在于输入图像之间(或输入和输出图像之间)。在这种情况下,信息量最大的主成分用于分离输入示例或将输入与输出分离。

如果只有信息量较少的 PC 描述了 b/w 输出的方差,那么区分输出将比在原始特征空间中更难。

也就是说,图像中的 PCA 很少有那么大的帮助。在这个例子中,我可以看到它很吸引人,但学习不同的低维特征表示可能更有意义和记忆友好得多。您可以尝试简单的自动编码器、SIFT/SURF 功能或类似 haar 的功能。

我已经读了你的帖子几次了。但我不确定我是否完全理解你的实验。但我猜测可能会发生什么。

我认为错误隐藏在你达到这个惊人的 0.06% 的部分。您不仅要推广到新数据,还要以某种方式预测未来。这不应该起作用,但我认为它确实有效,因为您的网络严重过度拟合。所以说你的网络还是很笨的。它刚刚学会,如果你给它看图片a,b它会回答c。如果我理解正确的话,第二个实验包含一个转折点。我假设您仍然向网络提供完整的图像,但它们是根据其特征图像的系数构建的。现在它必须吐出系数来从特征图像中构建答案。但这需要对网络没有获得的过程有所了解。

所以我认为有一些建议可以改进你的实验:

完整输入图像的学习只是一个非常高维的问题,需要大量的训练数据。考虑从图像中计算特征。

我不确定你的学习问题是否合理。请考虑将您的训练数据与预测数据分开,并采用更传统的数据,例如手写数字。