我所见过的 Encog 神经网络的示例都涉及到 XOR 或非常简单的例子。我有大约 10,000 个句子,每个句子中的每个单词都带有一些类型的标签。输入层需要接受两个输入,前一个单词和当前单词。如果没有前一个单词,那么第一个输入完全不被激活。我需要像这样处理每个句子。每个单词都依赖于前一个单词,所以我不能仅仅使用一个类似于 XOR 例子的数组。此外,我并不想将 10,000 多个句子的所有单词都加载到一个数组中,我更希望一次扫描一个句子,当到达文件末尾时,再从头开始。
我应该如何进行操作?我对 Encog 不是很熟悉,因为我见过的所有示例要么是 XOR,要么非常复杂。
有两个输入…每个输入由 30 个神经元组成。单词属于某个特定标签的概率被用作输入。因此,大多数神经元的输入为 0,其余的神经元则输入概率值如 0.5、0.3 和 0.2。当我说“未被激活”时,我的意思是所有神经元都被设置为 0。输出层代表所有可能的标签,所以有 30 个。输出神经元中数值最高的那个所对应的就是选择的标签。
我不确定如何处理所有 10,000 个句子,并在每个句子中查找每个单词(用于输入并激活该输入),在我在 Encog 的“演示”中看到的那些示例中没有找到方法。
似乎这些网络是通过一个包含所有训练数据的单一数组来训练的,并且会一直循环直到网络被训练。我希望使用许多不同的数组来训练网络(每个句子一个数组),然后再遍历它们。
显然,这种格式不适合我所做的事情:
do { train.iteration(); System.out.println( "Epoch #" + epoch + " Error:" + train.getError()); epoch++; } while(train.getError() > 0.01);
回答:
所以,我不太确定该如何告诉你,但神经网络的运行方式并非如此。你不能直接使用单词作为输入,也不能简单地“未激活”某个输入。从最基本的层面来说,要在某个问题上运行神经网络,你需要以下内容:
- 一个固定长度的输入向量(无论你输入什么,都必须以固定长度的数值形式表示。向量中的每个条目都是一个单一的数字)
- 一组标签(每个输入向量必须对应一个单一的、固定长度的输出向量)
一旦你有了这两者,神经网络就会对一个示例进行分类,然后调整自己以尽可能接近标签。
如果你想使用单词和深度学习框架,你应该将你的单词映射到现有的向量表示(我强烈推荐 glove,但 word2vec 也还不错),然后在这个表示上进行学习。
在更深入了解你试图做的事情后,我认为问题在于你实际上在处理 60 个输入,而不是一个。这些输入是两个单词现有预测的连接(在没有第一个单词的情况下,前 30 个条目为 0)。你应该自己处理映射(这应该是非常简单的),然后将其视为用 60 个数字预测 30 个数字的问题。
我有义务告诉你,你所描述的问题将会导致非常糟糕的性能。在处理一个稀疏(大部分为零)的向量和如此小的数据集时,深度学习技术的表现将远不如其他方法。你最好使用 glove + svm 或在现有数据上使用随机森林模型。