如何确定神经网络中的激活函数

时间:2014-03-06 16:23:02

标签: python neural-network backpropagation feed-forward

我正在使用前馈,反向传播,多层神经网络,我使用sigmoid函数作为激活函数,其范围为-1到1.但最小误差不会低于5.8而我想要的更少,你可以在100000次迭代后查看输出。 graph of error against iterations in NN

我认为这是因为我的输出范围大于1,而sigmoid函数范围只有-1到1.任何人都可以建议我如何克服这个问题,因为我想要的输出范围是0到2.5。建议我哪个激活功能最适合这个范围。

2 个答案:

答案 0 :(得分:2)

香草乙状结肠功能是:

def sigmoid(x):
    return 1/(1+math.e**-x)

您可以将其转换为:

def mySigmoid(x):
    return 2.5/(1+math.e**-x)

为了进行你想要的转换

答案 1 :(得分:2)

如果您正在寻求减少输出错误,那么在调整节点的激活功能之前,需要先了解一些

首先,您是否有偏置节点?偏置节点有几个含义,但是 - 与此讨论最相关 - 它们允许将网络输出转换为所需的输出范围。正如this reference所述:

  

在神经网络中使用偏差会增加网络解决问题的能力,允许将单个类别分离的超平面进行偏移以获得更好的定位。

这篇文章提供了一个非常好的讨论: Role of Bias in Neural Networks。 这个也很好:Why the BIAS is necessary in ANN? Should we have separate BIAS for each layer?

第二种方法:它通常有助于规范化您的输入和输出。如您所知,您的sigmoid提供+/- 1的范围。当尝试学习范围为0到1000(例如)的函数时,这个小范围可能会有问题。为了帮助学习,扩展和转换输入以适应节点激活功能是常见的。在此示例中,可以将范围除以500,得到0到2的范围,然后从该范围中减去1。以这种方式,输入已被归一化到-1到1的范围,这更好地适合激活函数。请注意,网络输出应该非规范化:首先,将+1添加到输出,然后乘以500.

在您的情况下,您可以考虑将输入缩放0.8,然后从结果中减去1。然后,您将向网络输出添加1,然后乘以1.25以恢复所需的范围。请注意,这种方法可能最容易实现,因为它不会像添加偏差那样直接改变您的网络拓扑结构。

最后,您是否尝试过更改隐藏节点的数量?虽然我相信前两个选项是提高性能的更好选择,但您可以尝试一下。 (作为参考点,我无法回想起一个实例,其中修改激活函数的形状比选项1和2更能改善网络响应。)

以下是隐藏层/节点配置的一些很好的讨论: multi-layer perceptron (MLP) architecture: criteria for choosing number of hidden layers and size of the hidden layer? How to choose number of hidden layers and nodes in neural network?

24个输入使您的问题成为高维问题。确保您的训练数据集充分覆盖输入状态空间,并确保您是测试数据,并且培训数据来自具有相似代表性的人群。 (在训练神经网络时,看看"交叉验证和#34;讨论)。