我正在做一个项目,在这个项目中,我需要降低我的观察的维度,并且仍然有一个有意义的表示它们。由于许多原因,强烈建议使用自动编码器,但我不太确定这是最好的方法。
我有1400个~ 60000维的样本,这太高了,我试图将它们的维数降低到原来的10%。我正在使用 ano自动编码器[链接],似乎成本一直在30,000左右(这是非常高的)。我尝试过增加epoch的数量或降低学习率,但都没有成功。我不是自动编码器的大专家,所以我不确定如何从这里开始,或者什么时候停止尝试。
我可以运行其他测试,但是,在进一步进行之前,我想从您那里得到一个输入。
-
你认为数据集太小了吗(我可以再增加600个样本,总共约2000个)?
-
你认为使用堆叠式自动打码机会有帮助吗?
-
我应该继续调整参数(epoch和学习率)吗?
由于数据集是图片的集合,我试图可视化自编码器的重建,所有我得到的是每个样本的相同输出。这意味着给定输入,自动编码器试图重建输入,但我得到的是相同的(几乎完全)图像对于任何输入(这看起来像数据集中所有图像的平均值)。这意味着内部表示不够好,因为自编码器无法从中重建图像。
数据集: 1400 - 2000张扫描图书的图像(包括封面),每张图像约为~ 60000像素(转换为60000个元素的特征向量)。每个特征向量在[0,1]中被归一化,初始值在[0,255]中。
问题:使用自动编码器(如果可能的话)降低它们的维数
如果你需要任何额外的信息,或者如果我错过了一些可能对更好地理解问题有用的东西,请添加评论,我很乐意帮助你帮助我=)。
注意:我目前正在整个数据集上运行一个具有更高epoch数量的测试,我会根据结果更新我的帖子,虽然可能需要一段时间。
自动编码器很有用,部分原因是它们可以学习非线性降维。然而,还有其他的降维技术,它们比自动编码器快得多。扩散贴图是很受欢迎的一种;局部线性嵌入是另一种方法。我已经在>2000 60k维数据(也包括图像)上使用了扩散图,它在一分钟内就能工作。
下面是使用numpy等函数的简单Python实现:
def diffusion_maps(data, d, eps=-1, t=1):
"""
data is organized such that columns are points. so it's 60k x 2k for you
d is the target dimension
eps is the kernel bandwidth, estimated automatically if == -1
t is the diffusion time, 1 is usually fine
"""
from scipy.spatial import pdist, squareform
from scipy import linalg as la
import numpy as np
distances = squareform(pdist(data.T))
if eps == -1:
# if a kernel bandwidth was not supplied,
# just use the distance to the tenth-nearest neighbor
k = 10
nn = np.sort(distances)
eps = np.mean(nn[:, k + 1])
kernel = np.exp(-distances ** 2 / eps ** 2)
one = np.ones(n_samples)
p_a = np.dot(kernel, one)
kernel_p = walk / np.outer(p_a, p_a)
dd = np.dot(kernel_p, one) ** 0.5
walk = kernel_p / np.outer(dd, dd)
vecs, eigs, _ = la.svd(walk, full_matrices=False)
vecs = vecs / vecs[:, 0][:, None]
diffusion_coordinates = vecs[:, 1:d + 1].T * (eigs[1:d + 1][:, None] ** t)
return diffusion_coordinates
扩散图的要点是你在你的数据上形成一个随机漫步,这样你更有可能访问附近的点而不是远处的点。然后你可以定义点之间的距离(扩散距离),它本质上是两个点之间在所有可能路径上移动的平均概率。关键是这其实非常容易计算;你所需要做的就是对角化一个矩阵,然后用它的特征向量将你的数据嵌入到低维空间。在这个嵌入中,欧氏距离就是扩散距离,直到一个近似误差。
除非对情况的了解比问题中描述的更多,否则没有理由认为30,000的成本是"高"的。例如,如果隐藏层的大小特别小,并且数据中几乎没有冗余,则全局最小成本实际上可能在30,000左右。
如果训练前的成本是30,000(即随机编码器和解码器的权重),并且在一些训练后仍然保持在这个水平附近,那么可能有什么问题。
你应该期望在第一次更新后成本会降低(如果你使用的是minibatch随机梯度下降,那么每个epoch会有很多更新)。你还应该期望收敛成本会随着隐藏层大小的增加而降低。
其他可能在这种情况下有所帮助的技术包括去噪自编码器(可以被认为是通过重复应用随机噪声来人为地增加训练数据集的大小)和收缩自编码器,它将正则化能力集中在编码器上,这是你关心的部分。两者都可以在Theano中实现,第一个是本教程的主题(使用代码)。
简单的事情先…请注意,如果您在60,000维空间中只有1400个点,那么您可以在不损失的情况下将维数降至size <=1400。这是一个简单的数学事实:您的数据矩阵是1400x60000,因此它的秩(维数)最多为1400。因此,主成分分析(PCA)将在1400维空间中产生1400个点,没有损失。我强烈建议在考虑其他方法之前,先使用PCA来降低数据的维数。