如何选择神经网络中的激活函数

0 投票
2 回答
5688 浏览
提问于 2025-04-17 21:08

我正在使用前馈神经网络、反向传播和多层神经网络,并且我用的是 sigmoid 函数作为激活函数,这个函数的输出范围是 -1 到 1。但是,我的最小误差始终在 5.8 以上,我希望能更低一些。你可以看到经过 100000 次迭代后的输出结果。

神经网络的误差与迭代次数的图

我觉得这可能是因为我的输出范围超过了 1,而 sigmoid 函数的输出范围只有 -1 到 1。有没有人能建议我如何解决这个问题,因为我希望的输出范围是 0 到 2.5。请告诉我哪个激活函数最适合这个范围。

2 个回答

2

普通的sigmoid函数是:

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

你可以把它转换成:

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

这样做是为了实现你想要的转换

2

如果你想减少输出错误,有几个方面可以先看看,再考虑调整节点的激活函数

首先,你有偏置节点吗?偏置节点有很多作用,但最相关的是,它们可以让网络的输出调整到你想要的范围。正如这个参考资料所说:

在神经网络中使用偏置可以提高网络解决问题的能力,因为它允许将不同类别之间的超平面进行偏移,从而获得更好的位置。

这篇文章讨论得很好:神经网络中偏置的作用。这篇也不错:为什么在人工神经网络中需要偏置?每一层应该有单独的偏置吗?

第二种方法:通常对输入和输出进行归一化会有帮助。正如你所提到的,你的sigmoid函数的范围是+/- 1。当你试图学习范围在0到1000之间的函数时,这个小范围可能会造成问题。为了帮助学习,通常会对输入进行缩放和转换,以适应节点的激活函数。在这个例子中,可以将范围除以500,得到0到2的范围,然后再减去1。这样,输入就被归一化到了-1到1的范围,更适合激活函数。需要注意的是,网络输出应该进行反归一化:首先在输出上加1,然后乘以500。

在你的情况下,可以考虑将输入缩放为0.8,然后从结果中减去1。接着在网络输出上加1,再乘以1.25,以恢复到你想要的范围。注意,这种方法可能是最简单的,因为它不会像添加偏置那样直接改变你的网络结构。

最后,你有没有尝试过改变隐藏节点的数量?虽然我认为前两种方法更适合提高性能,但你可以试试这个方法。(作为参考,我不记得有哪个例子是修改激活函数的形状比前两种方法更能改善网络响应的。)

这里有一些关于隐藏层/节点配置的好讨论:多层感知器(MLP)架构:选择隐藏层数量和隐藏层大小的标准? 如何选择神经网络中的隐藏层和节点数量?

24个输入使你的问题变得高维。确保你的训练数据集能够充分覆盖输入状态空间,并确保你的测试数据和训练数据来自相似的代表性人群。(在训练神经网络时,可以看看“交叉验证”的讨论)。

撰写回答