33

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

谢谢

4

3 回答 3

31

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

有几种常见的方法:

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

正则乙状结肠
(来源:natekohl.net(来源:natekohl.net
陡峭的乙状结肠

  • 每个值多个节点- 将单个连续值分布在多个节点上是表示连续输入的常用策略。它的好处是为网络提供更多“功能”,但以增加网络规模为代价。
    • Binning - 将单个输入分布在多个节点上(例如RBF 网络,其中每个节点都是具有不同中心的基函数,将被输入部分激活)。您可以在不丢失平滑表示的情况下获得离散输入的一些好处。
    • 二进制表示- 将单个连续值分成 2 N个块,然后将该值作为二进制模式输入网络给 N 个节点。这种方法紧凑,但有点脆弱,并导致输入以非连续方式变化。
于 2009-12-01T14:47:10.253 回答
7

没有规则要求输出 (*) 是任何特定函数。事实上,我们通常需要在给定节点中实现的函数本身的末尾添加一些算术运算,以便缩放或强制输出为特定形式。

使用全有或全无输出和/或 0.0 到 1.0 标准化输出的优点是它使事情更容易处理,并且还避免了溢出等问题。

( * ) “输出”在这里可以理解为网络中给定节点(神经元)的输出或整个网络的输出。
正如 Mark Bessey 所指出的,[整个网络的]输入和[网络的]输出通常会接受一些过滤/转换。正如此响应和 Mark 的评论中所暗示的,最好在网络的“隐藏”层中具有规范化/标准节点,并根据输入和/或输出的需要应用一些规范化/转换/离散化网络; 然而,这种做法只是实用性问题,而不是一般神经网络的必要要求。

于 2009-12-01T02:01:16.253 回答
3

您通常需要对输入和输出进行一些过滤(电平转换等)。显然,过滤输入会改变内部状态,因此需要考虑不要丢失您尝试训练的信号。

于 2009-12-01T02:03:19.320 回答