21

我已经实现了一个多层感知器来预测输入向量的 sin。向量由随机选择的四个 -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);

4

3 回答 3

13

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

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

在此处输入图像描述

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

编辑

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

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

于 2011-02-24T14:30:46.157 回答
4

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

于 2011-02-24T14:40:28.370 回答
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 个 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 ;
}

令人惊讶的是,经过一半的时期(即5000),我得到了更好的曲线。 在此处输入图像描述而且我们都知道,使用更多的隐藏神经元、更多的 epoch 和更好(和更多)的训练示例会显着改善。此外,改组数据也很重要!

于 2019-11-24T18:10:32.263 回答