神经网络中的连续输出

34
我怎样设置神经网络,使其接受和输出连续值而非离散值? 我回忆起几年前学习神经网络课程时,激活函数应该是sigmoid函数,它产生介于0和1之间的值。如果我想要神经网络产生实数标量,我该怎么做?我在想,如果我想要一个介于0和10之间的值,我可以将该值乘以10?如果有负值呢?人们通常这样做吗?还是有其他方法?对于输入呢?
谢谢
3个回答

32
神经进化领域的许多工作都涉及使用具有连续输入和输出的神经网络。有几种常见的方法:
- 每个值一个节点 - 线性激活函数 - 正如其他人所指出的,如果您担心S形函数的有限范围,则可以在输出节点上使用非S形激活函数。但是,这可能会导致您的输出任意变大,这可能会在训练过程中引起问题。 - Sigmoid激活函数 - 在神经进化中,简单地缩放Sigmoid输出(或移动和缩放,如果您想要负值)是一种常见的方法。然而,值得确保您的Sigmoid函数不太陡峭:陡峭的激活函数意味着“有用”的值范围很小,这迫使网络权重变小。(这主要是遗传算法的问题,它使用固定的权重修改策略,当需要较小的权重时,该策略不起作用。)

常规 sigmoid
(来源: natekohl.net)
陡峭 sigmoid
(来源: natekohl.net)

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

你确定径向基函数网络只有一个输入节点吗?据我理解,它们可以有任意多个输入节点,但只有一个输出。 - dpelisek

7

没有规定输出(*)必须是任何特定的函数。实际上,我们通常需要在给定节点实现的函数本身末尾添加一些算术运算,以便将输出按比例缩放并强制转换为特定形式。

使用全有或全无的输出和/或0.0到1.0的归一化输出的优点在于,它使事情更易于跟踪,并避免了溢出等问题。

(*)“输出”可以被理解为网络中给定节点(神经元)的输出或整个网络的输出。
正如马克·贝西(Mark Bessey)所指出的那样,网络的输入和输出通常接受一些过滤/转换。正如这个回答和马克的评论所暗示的那样,在网络的“隐藏”层中使用标准化节点可能更可取,并根据需要对网络的输入和/或输出进行一些标准化/转换/离散化;然而,这种做法只是实用性的问题,而不是神经网络的普遍要求。


3

通常情况下,您需要对输入和输出进行一些过滤(级别转换等)。显然,过滤输入将改变内部状态,因此需要考虑如何不丢失您正在训练的信号。


既然我确定有人会提到它 - 当然,您可以定义网络,使得您不必在输入或输出上进行任何转换。然而,通常更容易拥有通用节点,并进行一些显式过滤。 - Mark Bessey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接