2009-12-01 127 views
19

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

由于

回答

26

neuroevolution的大部分工作都涉及使用具有连续输入和输出的神经网络。

有几种常用的方法:

每值
  • 一个节点
    • 线性激活功能 - 正如其他人指出的那样,你可以,如果输出节点上使用非乙状结肠激活功能您担心的是sigmoid函数的范围有限。但是,这可能会导致您的输出变得任意大,这可能会在训练过程中导致问题。
    • 乙状结肠激活函数 - 简单地缩放乙状结肠输出(或移位和缩放,如果要负值)是在neuroevolution的常用方法。然而,这是值得确保你的双曲线函数是不是太陡:陡峭的激活功能是指“有用”的值范围小,这就迫使网络的权重小。 (这主要是与遗传算法,它使用一个固定的重量修饰策略,当小的权重所需的不很好地工作的问题。)

regular sigmoid http://natekohl.net/media/sigmoid-reg.gif steep sigmoid http://natekohl.net/media/sigmoid-steep.gif

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

没有规则需要的输出(*)为任何特定功能。事实上,我们通常需要添加一些算术运算在每本身在给定节点实现的功能结束后,以规模和否则输出强制到特定的形式。

使用全有或全无输出和/或0.0到1.0归一化输出的优点是它使事情更容易处理,并且还避免了溢出等问题。 (*)“输出”在这里可以理解为网络内给定节点(神经元)或整个网络的给定节点(神经元)的输出。
正如马克贝西所指出的,[整个网络]和[网络]的输出通常都会接收一些过滤/转换。正如在这个回应中以及Mark的评论中所暗示的那样,可能最好在网络的“隐藏”层中具有标准化/标准节点,并根据输入和/或输出的要求应用一些标准化/转换/离散化网络;然而,这种做法只是一个实用性的问题,而不是神经网络的一般要求。

3

您通常需要对输入和输出进行一些过滤(电平转换等)。显然,过滤输入会改变内部状态,所以需要考虑一些问题,以避免丢失你正在训练的信号。

+0

既然我敢肯定有人会提到它 - 你可以定义网络,这样你不*有*做当然的输入或输出,任何转换。但是,通用节点通常会更容易,并且会进行一些明确的过滤。 – 2009-12-01 02:14:55