当输入数量可能是可变的时,神经网络如何被使用?

60

我看到的所有神经网络示例都是针对固定输入集合设计的,这在处理图像和固定长度数据时效果很好。但如何处理变长数据,例如句子、查询或源代码呢?是否有一种方法将变长数据编码为固定长度的输入,并仍然获得神经网络的泛化性能?


1
我投票关闭此问题,因为它与[帮助中]定义的编程无关,而是涉及ML理论和/或方法 - 请参见https://stackoverflow.com/tags/machine-learning/info中的介绍和注意事项。 - desertnaut
6个回答

34

我曾经遇到过这个问题。ANN是为固定的特征向量长度而设计的,许多其他分类器如KNN、SVM、贝叶斯等也是如此。即输入层应该定义明确,不应该变化,这是一个设计问题。然而,一些研究人员选择添加零来填补缺失的间隙,我个人认为这不是一个好的解决方案,因为那些零(虚构值)将影响网络收敛到的权重。此外,可能会有以零结尾的真实信号。

ANN并不是唯一的分类器,还有更好的方法,例如随机森林。这种分类器被认为是研究人员中最好的,它使用少量的随机特征,使用自助法和装袋法创建数百个决策树,这可能效果很好,所选特征的数量通常是特征向量大小的平方根,这些特征是随机的。每个决策树都会收敛到一个解决方案,使用多数规则选择最可能的类别。

另一个解决方案是使用动态时间规整DTW,或者更好的方法是使用隐马尔可夫模型HMM。

另一个解决方案是插值,将所有小信号插值(补偿缺失值)到与最大信号相同的大小,插值方法包括但不限于平均值、B样条、三次函数等。

另一个解决方案是使用特征提取方法来使用最佳特征(最具有区分性),这次使它们具有固定的大小,这些方法包括PCA、LDA等。

另一个解决方案是使用特征选择(通常在特征提取之后),一种简单的选择给出最佳准确性的最佳特征的方法。

现在就这些了,如果以上方法都无法解决您的问题,请与我联系。


32
您通常会从数据中提取特征并将其馈送到网络中。不建议只是将一些数据直接馈送到网络中。在实践中,预处理和选择正确的特征将决定您的成功以及神经网络的性能。不幸的是,我认为这需要经验才能培养感觉,而这是无法从书本中学习的。
总之:“垃圾进,垃圾出”。

27
如果你希望神经网络提取特征并将其馈送到另一个网络进行分类/解释,或者想要网络从一组示例中学习语法,该怎么办?在这两种情况下,网络需要处理可变长度的数据集。 - Jeremy E
有时候你需要一个双向关联内存,并且要关联的项目大小不同。(人名,人物图片) - Jeremy E

19

一些问题可以通过循环神经网络来解决。 例如,它非常适合在一系列输入上计算奇偶校验。

用于计算奇偶校验的循环神经网络只需要一个输入特征。 比特可以随着时间被输入。其输出也被反馈回隐藏层。 这使得学习奇偶性只需两个隐藏单元。

普通的前馈两层神经网络需要2 ** sequence_length个隐藏单元来表示奇偶校验。这个限制对于任何仅有2层(例如SVM)的架构都是成立的。


1
这是否类似于仅使用神经网络的隐马尔可夫模型? - Jeremy E
3
它更类似于一个神经网络,其中一些输出被馈送到下一个输入。不重要的历史会随着时间的推移而被遗忘。 - Ivo Danihelka

2

我想,一种方法是在输入中添加时间组件(循环神经网络),并将输入分块流式传输到网络中(基本上创建了神经网络的词法分析器和解析器等效物)。这将允许输入相当大,但缺点是可能没有停止符来将不同的输入序列从彼此分开(句子中的句号等效物)。


1
为了在不同大小的图像上使用神经网络,通常需要对图像进行裁剪和上下缩放,以更好地适应网络的输入。我知道这并没有真正回答你的问题,但也许对于其他类型的输入,可以使用某种转换函数来处理输入?

0

我不是完全确定,但我建议使用最大数量的输入(例如对于单词,假设没有单词超过45个字符(根据维基百科中发现的最长单词),如果遇到较短的单词,则将其他输入设置为空格字符。

或者对于二进制数据,将其设置为0。这种方法唯一的问题是如果填充了空格字符/零/任何东西的输入与有效的完整长度输入碰撞(对于数字不太问题,但对于单词可能会出现)。


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