多层神经网络不会预测负值

时间:2011-02-24 14:09:39

标签: perl neural-network classification backpropagation

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

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

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

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

3 个答案:

答案 0 :(得分:11)

自从我研究多层感知器以来,已经很长一段时间,因此需要用一粒盐。

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

enter image description here

它生成[0,1]之间的值。我不认为它会产生负面结果。我可能错了,很难。

修改

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

另一个选项是双曲正切,它来自[-1,+ 1]并且没有要设置的常量。

答案 1 :(得分:3)

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

答案 2 :(得分:0)

尽管问题已经得到解答,但请允许我分享我的经验。我一直在尝试使用 1--4--1 神经网络来近似正弦函数。即 enter image description here 与您的情况类似,我不允许使用任何高级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个时代之后得到的结果,在 20个培训示例上对网络进行了培训。 enter image description here

您可以看到,网络并不像负曲线。因此,我将激活功能更改为 Tanh

double tanh(double x)
{
   return (exp(x)-exp(-x))/(exp(x)+exp(-x));
}

double tanh_derivative(double x)
{
   return 1.0f - x*x ;
}

令人惊讶的是,经过半个时期(即 5000 ),我得到了更好的曲线。 enter image description here我们都知道,使用更多隐藏的神经元,更多历元和更好(以及更多)的训练示例,它将大大改善。另外,对数据进行混洗也很重要!