如何设置神经网络,以便它们接受并输出连续范围的值而不是离散值?我记得几年前做神经网络课程时,激活函数是一个 sigmoid,它产生一个介于 0 和 1 之间的值。如果我希望我的神经网络产生一个实值标量,我应该做什么?我想如果我想要一个介于 0 和 10 之间的值,我可以将该值乘以 10 吗?如果我有负值怎么办?这是人们通常做的事情还是有其他方法?那输入呢?

谢谢

有帮助吗?

解决方案

大部分工作都集中在以下领域 神经进化 涉及使用具有连续输入和输出的神经网络。

有几种常见的方法:

  • 每个值一个节点
    • 线性激活函数 - 正如其他人所指出的,如果您担心 sigmoid 函数的范围有限,您可以在输出节点上使用非 sigmoid 激活函数。但是,这可能会导致您的输出变得任意大,从而在训练期间引起问题。
    • S 型激活函数 - 简单地缩放 sigmoid 输出(或者移位和缩放,如果你想要负值)是神经进化中的常见方法。然而,值得确保您的 sigmoid 函数不会太陡:陡峭的激活函数意味着“有用”的值范围很小,这迫使网络权重很小。 (这主要是遗传算法的问题,遗传算法使用固定权重修改策略,当需要较小的权重时,该策略效果不佳。)

regular sigmoid
(来源: 内特科尔网)
steep sigmoid
(来源: 内特科尔网)

  • 每个值有多个节点 - 将单个连续值分布在多个节点上是表示连续输入的常见策略。它的好处是为网络提供更多“功能”,但代价是增加网络规模。
    • 分档 - 将单个输入分布到多个节点(例如 RBF 网络, ,其中每个节点都是具有不同中心的基函数,将由输入部分激活)。您可以获得离散输入的一些好处,而不会失去平滑的表示。
    • 二进制表示 - 将单个连续值分成 2 块,然后将该值作为二进制模式馈送到网络中的 N 个节点。这种方法很紧凑,但有点脆弱,会导致输入以不连续的方式变化。

其他提示

<强>有需要的输出(*)为任何特定功能否规则。事实上,我们通常需要的添加在每本身在给定节点中实现的功能的端部的一些算术运算,以规模和以其它方式输出强制到一个特定形式。

与所有或无的输出和/或0.0〜1.0归一化输出的工作的优点是,它使事情更加容易容易处理,还可以避免溢流的问题,这样的

(*)“输出”可被理解为任一网络中的ouptut给定节点(神经元)或该网络作为一个整体的。结果 如由Mark贝西[作为一个整体的网络]输入和[网络]输出表示通常会收到某种滤波/转换。如在本反应和Mark的评论暗示,可优选具有在网络的“隐藏”层归一化/标准节点和应用一些正常化/转换/离散化所要求的输入和/或用于输出网络;然而,这样的做法是只实用性的问题,而不是神经网络在一般的必要的要求。

您通常将需要在输入和输出做一些滤波(电平转换,等)。显然,过滤输入将改变内部状态,所以需要给予不失去你想培养对信号的一些考虑。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top