我已经实现了多层感知器来预测输入向量的罪。向量由随机选择的四个-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);
答案 0 :(得分:11)
自从我研究多层感知器以来,已经很长一段时间,因此需要用一粒盐。
我会将您的问题域重新调整为[0,1]域而不是[-1,1]。如果你看一下逻辑函数图:
它生成[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 神经网络来近似正弦函数。即 与您的情况类似,我不允许使用任何高级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个培训示例上对网络进行了培训。
您可以看到,网络并不像负曲线。因此,我将激活功能更改为 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 ),我得到了更好的曲线。 我们都知道,使用更多隐藏的神经元,更多历元和更好(以及更多)的训练示例,它将大大改善。另外,对数据进行混洗也很重要!