多输出神经网络



直到我只使用神经网络对单个输出进行分类,我为每个类设置一个输出神经元,并检查哪个神经元的激活最高/最低。

我想做的是检测一个模式,而不是输出一个值(类或激活值),我想输出多个值。例如

[0,5 0,5 0,5] -> [0,5 0,5 0,5]
[1 1 1] -> [1 1 1]
[2 2 2] -> [-1 -1 -1]

所以我想知道的是,我可以使用一个有3个输出的网络,而不是检查激活,而是使用所有输出作为我的输出模式吗?

是的,您可以使用具有多个输出的神经网络。基本上,你有两种可能性:

  • 使用琐碎的分解,即根据响应分离训练集,并训练三个Ann,其中每个Ann都有一个输出。但我想这不是你想要的。

  • 训练真实多输出神经网络。在这种情况下,对于两个隐藏层的ANN,对于每个输出,输入层的神经元权重是相同的,而输出层的权重对于每个输出是特定的。在这种情况下,您必须结合三个输出的反向传播过程。在一个简单的方法中,您可以通过随后对每个输出应用一个反向传播迭代来实现,直到您有望获得收敛。为了以合理的方式做到这一点,您可能必须以适当的方式缩放您的响应(否则,一个输出可能会主导其他输出)。

因此,这里是三个输出的基本过程:

  1. 将训练集分为三组,每组有一个回应。标准化每套。

  2. 将一次反向传播迭代应用于第一个数据集,然后将一次应用于第二个数据集。对于每个,使用相同的输入层权重。

  3. 重复2。直到收敛(不管你怎么定义它。应该类似于一维输出过程。)

然而,如前所述,这只是各种优化方法中的一种可能性。


编辑:以上是简单的一维反向传播过程的扩展。这里的自由度是

(i) 处理输入和计算误差项的顺序,以及
(ii)何时进行隐藏神经元的更新。

上面描述的变体将数据作为[x_1, ..., x_N, y_1, ..., y_N, z_1, ..., z_N]进行处理,并在每个步骤之后进行更新(这种更新方案通常被称为Gauss-Seidel)。另一个极端是存储错误项,并在处理完整个集合后只更新一次。(高斯-塞德尔版本通常收敛得更快)。

另一种可能与标准反向传播最相似的变体是处理每个数据点的三维,即[x_1, y_1, z_1, ..., x_N, y_N, z_N],并在每个数据点之后(即在每个第三次迭代之后)进行更新。实际上,进行一次三维梯度更新(由于梯度的线性性质,可以作为三次一维误差评估进行)。

总之,我们可以看到有各种各样的可能的优化方案,它们都非常相似,并且可能都会导致相当相似的结果。


作为替代方案,您也可以考虑使用极限学习机。在这里,您只需要训练输出权重,而您可以随机选择输入权重。由此,多响应情况自然地分离为三个一维优化问题。