为什么我的神经网络无法训练?

Why won't my neural network train?

我收集了 20,000 多份 PDF 格式的诉状。我是一名律师,但我也编写计算机程序来帮助我在 MFC/VC++ 中进行实践。我想学习使用神经网络(不幸的是我的数学技能仅限于大学代数)来对诉讼文件进行分类。

我的第一个目标是训练一个三层前馈神经网络来识别文件是小额索赔文件(案件编号中带有字母 "SP"),还是普通文件(案例编号中带有字母 "CC")。每个律师都会使用 "Case:" 或 "Case No" 或 "Case Number" 这个词的一些变体,或者它的无限变体之一。所以我取了前 600 个字符(所有律师都会将案件编号放在前 600 个字符内),并制作了一个 CSV 数据库,每一行都是一个文档,600 列包含前 600 个字符的 ASCII 代码,并且第 601 个字符是“1”代表普通案件,“0”代表小额索赔。

然后我运行它通过这里编码的神经网络程序: https://takinginitiative.wordpress.com/2008/04/23/basic-neural-network-tutorial-c-implementation-and-source-code/ (自然地,我更新了程序以处理 600 个神经元,只有一个输出),但是当我 运行 通过时,准确度是可怕的——大约在训练数据上为 2%,在通用集上为 0%。 1/8 的文件用于非小额索赔案件。

这是神经网络可以处理的那种问题吗?我做错了什么?

So I've taken the first 600 characters (all attorneys will put the case number within the first 600 chars), and made a CSV database with each row being one document, with 600 columns containing the ASCII codes of the first 600 characters, and the 601st character is either a "1" for regular cases, or a "0" for small claims.

单独查看文档开头的每个字符是非常不准确的。与其单独考虑 个字符 ,不如先将前 600 个字符标记为单词。使用这些词作为神经网络的输入,而不是单个字符。

请注意,一旦您标记了前 600 个字符,您可能会发现一个明显有限的标记列表,这意味着 "case number",不再需要神经网络。

Standford Natural Language Processor provides this functionality. You can find a .NET compatible implementation available in NuGet.