如何设置神经网络,使其接受和输出连续范围的值,而不是离散的值?我记得几年前上神经网络课程时,激活函数是 sigmoid 函数,它会产生一个介于 0 和 1 之间的值。如果我希望我的神经网络产生一个实值标量,我应该怎么做?我想,如果我想要一个介于 0 和 10 之间的值,我可以简单地将该值乘以 10 吗?如果我有负值呢?人们通常这样做,还是有其他方法?输入又该怎么办?
谢谢
回答:
神经进化领域的大部分工作都涉及到使用具有连续输入和输出的神经网络。
有几种常见的方法:
- 每个值一个节点
- 线性激活函数 – 正如其他人所指出的,如果您担心 sigmoid 函数的有限范围,您可以在输出节点上使用非 sigmoid 激活函数。但是,这可能会导致您的输出变得任意大,从而在训练期间导致问题。
- Sigmoid 激活函数 – 简单地缩放 sigmoid 输出(或者,如果您想要负值,则进行平移和缩放)是神经进化中的一种常见方法。但是,值得确保您的 sigmoid 函数不要太陡峭:陡峭的激活函数意味着“有用”的值范围很小,这会迫使网络权重变小。(这主要是遗传算法的问题,遗传算法使用固定的权重修改策略,当需要小权重时,该策略效果不佳。)
(来源: natekohl.net)
(来源: natekohl.net)
- 每个值多个节点 – 将单个连续值分布在多个节点上是表示连续输入的常用策略。它具有为网络提供更多“特征”的优点,但代价是增加了网络规模。
- 分箱 (Binning) – 将单个输入分布在多个节点上(例如,RBF 网络,其中每个节点都是一个具有不同中心的基函数,该中心将被输入部分激活)。您可以获得离散输入的一些好处,而不会丢失平滑的表示。
- 二进制表示 – 将单个连续值分成 2N 块,然后将该值作为二进制模式输入到 N 个节点。这种方法很紧凑,但有点脆弱,并且会导致输入以非连续的方式变化。