【问题标题】:Using large input values with Auto Encoders使用带有自动编码器的大输入值
【发布时间】:2014-09-04 03:42:17
【问题描述】:

我在 MATLAB 中创建了一个自动编码器神经网络。我在第一层有相当大的输入,我必须通过网络的输出层进行重建。我不能按原样使用大输入,所以我使用 MATLAB 的 sigmf 函数将其转换为 [0, 1] 之间。对于所有大值,它为我提供了 1.000000 的值。我尝试使用设置格式,但没有帮助。

在我的自动编码器中使用大值是否有解决方法?

【问题讨论】:

  • 您是否考虑过在层的输出使用其他非线性,例如将sigmf 更改为其他内容,例如log 可能吗?
  • 由于我在网络中使用sigmoid函数,所以输出值不能超过1。使用log会给我比这更大的值。
  • 我了解到您的问题是输入太大,并且您在使用自动编码器之前使用 sigmf 对输入进行预处理,对吧?
  • 是的。输入不是太大,但足以让 sigmoid 函数为多个值生成相同的映射。
  • @Sasha 在网络应用 sigmoid 函数之前,您的输入不会乘以权重吗?因此,权重可以将值降低到 1 以下。听起来您正在寻找标准化数据,以便所有输入具有相似的幅度范围,您可以通过减去每个变量的平均值然后除以标准偏差来做到这一点。这个过程通常被称为标准化输入。

标签: matlab autoencoder


【解决方案1】:

在我给你答案之前,让我们先思考一下自动编码器 (AE) 背后的基本原理:
自动编码器的目的是以无监督的方式学习输入数据的底层结构。 AE如何实现这一目标?如果它设法从其输出信号(通常是较低维度的)重构输入信号,则意味着它没有丢失信息,并且它有效地设法学习了更紧凑的表示。

在大多数示例中,为简单起见假设输入信号和输出信号的范围都在 [0..1] 范围内。因此,相同非线性 (sigmf) 既可用于获取输出信号,也可用于从输出中重建输入。
类似的东西

output = sigmf( W*input + b ); % compute output signal
reconstruct = sigmf( W'*output + b_prime ); % notice the different constant b_prime

然后AE学习阶段尽量减少训练误差|| output - reconstruct ||

但是,谁说重构非线性必须与用于计算输出的非线性相同?

在您的情况下,输入范围在 [0..1] 的假设不成立。因此,您似乎需要使用不同的非线性进行重建。您应该选择与您输入的实际范围一致的一个。

例如,如果您的输入范围在 (0..inf),您可以考虑使用 exp().^2 作为重构非线性。您可以使用不同次数的多项式、log 或任何您认为适合输入数据分布的函数。


免责声明:我从未真正遇到过这种情况,也没有在文献中看到过这种解决方案。不过,我相信这是有道理的,至少值得一试。

【讨论】:

    【解决方案2】:

    将输入转换为 [0,1] 范围的过程称为标准化,但是,正如您所注意到的,sigmf 函数不足以完成此任务。这个link 可能对你有用。

    假设您的输入由 N 行和 M 列的矩阵给出,其中每一行代表一个输入模式,每一列是一个特征。如果您的第一列是:

    vec =
    
       -0.1941
       -2.1384
       -0.8396
        1.3546
       -1.0722
    

    然后您可以使用以下方法将其转换为范围 [0,1]:

    %# get max and min
    maxVec = max(vec);
    minVec = min(vec);
    
    %# normalize to -1...1
    vecNormalized = ((vec-minVec)./(maxVec-minVec))
    
    vecNormalized =
    
        0.5566
             0
        0.3718
        1.0000
        0.3052
    

    正如@Dan 在 cmets 中指出的那样,另一种选择是标准化数据。此过程的目标是将输入缩放为均值为 0,方差为 1。在这种情况下,您需要减去列的平均值并除以标准差:

    meanVec = mean(vec);
    stdVec = std(vec);
    
    vecStandarized = (vec-meanVec)./ stdVec
    
    vecStandarized =
    
        0.2981
       -1.2121
       -0.2032
        1.5011
       -0.3839
    

    【讨论】:

    • 请在您的实际答案中包含该链接中解决方案的简要说明 - 否则我同意这是正确的方法
    • @Dan 对每个样本应用不同的标准化/标准化可能会有点问题:您可能会更改样本的基础分布。将 same 标准化应用于所有(训练和测试)输入可能会更好。您可以学习一个 global minVal 和一个 global maxVal 用于规范化所有输入训练和测试。
    • @Shai 您绝对应该对测试集应用与训练集相同的归一化参数,但这是针对每个输入的。然而,每个输入变量都应该独立于另一个输入变量进行归一化。这是学习算法中非常标准的做法。实际上,我认为有一个隐含的假设,即所有输入变量都是独立的,统计学家通常将这些称为独立变量。如果要对依赖项建模,通常必须包含一个交互项(例如 X1*X2)作为单独的新输入变量。
    • @Dan 我怀疑我们有一点误解。 “每个输入”是什么意思?假设我们有维度为pn 样本。是“每个训练样本”,即您有n 不同的归一化参数吗?或者,它是“每个输入维度”,在这种情况下你有p 不同的规范化参数?
    • @Shai 我指的是“每个输入维度”
    猜你喜欢
    • 1970-01-01
    • 2017-11-27
    • 2013-12-21
    • 2022-01-11
    • 2019-10-13
    • 2023-03-04
    • 1970-01-01
    • 2020-01-29
    • 2019-07-02
    相关资源
    最近更新 更多