【问题标题】:Multi-layer neural network won't predict negative values多层神经网络不会预测负值
【发布时间】:2011-07-03 14:32:50
【问题描述】:

我已经实现了一个多层感知器来预测输入向量的 sin。向量由随机选择的四个 -1,0,1 和设置为 1 的偏差组成。网络应该预测向量内容之和的 sin。

例如输入 = 输出 = Sin(0+1+(-1)+0+1)

我遇到的问题是网络永远不会预测负值,并且许多向量的 sin 值都是负的。它可以完美地预测所有正输出或零输出。我假设更新权重存在问题,每个时期都会更新。有没有人遇到过NN的这个问题?任何帮助都会很棒!

注意:该网络有 5 个输入,1 个隐藏层中的 6 个隐藏单元和 1 个输出。我在激活隐藏层和输出层上使用了 sigmoid 函数,并尝试了大量的学习率(目前为 0.1);

【问题讨论】:

    标签: perl neural-network classification backpropagation


    【解决方案1】:

    自从我研究多层感知器以来已经很长时间了,因此对此持保留态度。

    我会将您的问题域重新调整为 [0,1] 域而不是 [-1,1]。如果你看一下逻辑函数图:

    它生成 [0,1] 之间的值。我不希望它产生负面结果。我可能错了,强硬。

    编辑

    您实际上可以将逻辑函数扩展到您的问题域。使用generalized logistic curve 将 A 和 K 参数设置为域的边界。

    另一个选项是双曲正切,它从 [-1,+1] 开始,没有要设置的常数。

    【讨论】:

    • 非常感谢,这确实有道理!我必须四处寻找一个可以允许负值的函数。不幸的是,我无法将问题域更改为大学作业。再次感谢!
    • @B. Bowles 用可能的解决方案更新了我的答案。
    • 太好了,我现在就试试看!该公式中有很多参数不适用于该网络,数学绝对不是我的强项。不过,这听起来确实像是前进的方向。
    • @B. Bowles 双曲正切也从 [-1,+1] 开始,没有要设置的常数。我现在才想起来。
    • 太好了,而且更容易实现!!我的 $a = exp($activation);我的 $b = exp(-$activation); $输出 = ($a-$b)/($a+$b); ...以防万一有人有兴趣在未来使用它。谢谢一百万
    【解决方案2】:

    有许多不同种类的激活函数,其中许多旨在输出 0 到 1 之间的值。如果您使用的函数只输出 0 到 1 之间的值,请尝试调整它,使其输出介于 1 之间和-1。如果你使用FANN,我会告诉你使用FANN_SIGMOID_SYMMETRIC 激活函数。

    【讨论】:

    • 不幸的是,我不能使用任何库来完成这项任务,如果只是!我看看它是如何工作的,非常感谢
    【解决方案3】:

    虽然问题已经回答了,但请允许我分享一下我的经验。我一直在尝试使用 1--4--1 神经网络来近似正弦函数。 IE, 与您的情况类似,我不允许使用任何高级 API,例如 TensorFlow。此外,我一定会在 Python3 上使用 C++! (顺便说一句,我最喜欢 C++)。

    我使用 Sigmoid 激活及其导数定义为:

    double sigmoid(double x) 
    { 
       return 1.0f / (1.0f + exp(-x)); 
    }
    
    double Sigmoid_derivative(double x)
    {
       return x * (1.0f - x);
    }
    

    这就是我在 10,000 个 epochs 之后得到的结果,在 20 个训练示例上训练了网络。

    如您所见,网络感觉不像是负曲线。所以,我把激活函数改成了Tanh

    double tanh(double x)
    {
       return (exp(x)-exp(-x))/(exp(x)+exp(-x));
    }
    
    double tanh_derivative(double x)
    {
       return 1.0f - x*x ;
    }
    

    令人惊讶的是,经过一半的 epoch(即 5000),我得到了更好的曲线。 我们都知道,使用更多的隐藏神经元、更多的 epoch 和更好(和更多)的训练示例会显着改善。另外,打乱数据也很重要!

    【讨论】:

      猜你喜欢
      • 2012-05-06
      • 1970-01-01
      • 2020-01-24
      • 2017-12-02
      • 2018-11-05
      • 2020-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多