Machine learning 用于(自然语言)标注的神经网络调试

Machine learning 用于(自然语言)标注的神经网络调试,machine-learning,nlp,artificial-intelligence,neural-network,Machine Learning,Nlp,Artificial Intelligence,Neural Network,我一直在编写一个神经网络,用于识别和标记英语词类(用Java编写)。代码本身没有“错误”或明显的缺陷。然而,它不是在学习——我训练得越多,它预测测试数据的能力就不会改变。以下是关于我所做工作的信息,如果我遗漏了一些重要的事情,请让我更新这篇文章 我编写了神经网络,并在几个不同的问题上进行了测试,以确保网络本身能够工作。我训练它学习如何双倍数字、异或、立方体数字,并学习sin函数达到相当的精度。所以,我相当有信心,实际的算法是可行的 该网络采用sigmoid激活功能。学习率是。3,动量是。6。权重

我一直在编写一个神经网络,用于识别和标记英语词类(用Java编写)。代码本身没有“错误”或明显的缺陷。然而,它不是在学习——我训练得越多,它预测测试数据的能力就不会改变。以下是关于我所做工作的信息,如果我遗漏了一些重要的事情,请让我更新这篇文章

我编写了神经网络,并在几个不同的问题上进行了测试,以确保网络本身能够工作。我训练它学习如何双倍数字、异或、立方体数字,并学习sin函数达到相当的精度。所以,我相当有信心,实际的算法是可行的

该网络采用sigmoid激活功能。学习率是。3,动量是。6。权重初始化为rng.nextFloat()-.5)*4

然后我得到了布朗语料库数据集,并用NLTK将标记集简化为“通用”。我使用NLTK生成并保存所有语料库和词典数据。为了便于测试,我从语料库中删去了最后15000个句子。我使用了语料库的其余部分(约40000句带标签的单词)进行训练

神经网络布局如下:每个标签有一个输入神经元。输出层:每个标签有一个输出神经元。网络将输入3个单词:第一个:我们要标记的单词前面的单词,第二个:需要标记的单词,第三个:第二个单词后面的单词。因此,输入的总数是3倍(可能的标签总数)。输入值是介于0和1之间的数字。输入层的3个单词中的每一个都在字典中搜索(由40000个语料库组成,与用于训练的语料库相同)。词典记录了每个单词在语料库中被标记为词性的次数

例如,单词“cover”被标记为名词1次,动词3次 时代

被标记的百分比是为单词关联的每个词性计算的,这是为特定单词输入网络的百分比。因此,被指定为名词的输入神经元将接收。33而动词将接收。66。持有该单词标签的其他输入神经元接收0.0的输入。这是针对要输入的3个单词中的每一个进行的。如果一个单词是句子的第一个单词,那么第一组标记都是0。如果一个单词是一个句子的最后一个单词,那么最后一组保留下一个单词标记概率的输入神经元将保留为0。 我已经使用了10个隐藏节点(我已经阅读了许多论文,这似乎是一个开始测试的好地方)

15000个测试句子中没有一个是用来制作“词典”的。因此,当用这部分语料库测试网络时,会有一些网络从未见过的单词。未被识别的单词会去掉后缀,并在另一本“词典”中搜索它们的后缀。然后将该单词最可能的内容用作输入

这是我的设置,我开始尝试训练网络。我一直在用4万句话训练网络。1个历元=40000个训练集每个句子中每个单词的1个正向和反向传播。所以,仅仅做一个历元需要几秒钟。仅仅知道“概率”这个词,网络就做得很好,但我训练得越多,什么也没发生。纪元后面的数字是正确标记的单词数除以单词总数

首次运行50个时代:0.928218786

100个时代:0.933130661

500个时代:0.928614499花了大约30分钟来训练这个

尝试了10个时代:0.928953683

仅使用1个历元的结果在.92和.93之间变化很大

所以,它似乎不起作用

然后,我从语料库中提取55个句子,并使用同一本字典,该字典对所有40000个单词都有概率。对于这一个,我用训练XOR的方法训练它——我只使用了那55个句子,我只测试了那55个句子的训练网络权重。网络很容易就学会了这55句话。在120个历元中(需要几秒钟),网络从正确标记3768和56(在前几个历元中)到正确标记3772和错误标记52(在第120个历元中)


这就是我所处的位置,我已经试着调试了一天多,但还没有找到任何答案。

您可能会在上得到更好的响应。stackoverflow上的人会关闭它,因为它与代码本身无关=)在我的代码中,这肯定是一个问题,但是这里涉及的代码太多了,我不知道该发布哪个部分。谢谢你的建议。为什么这个问题被标记为
nltk
?是的,你用它来生成数据,但这与你的问题无关。没有人能真正帮助你从这个移除中解脱出来,但这里有一些线索可以帮助你帮助自己:如果你的结果是可重复的(即,如果你再次训练,你会得到相同的表现),你的表现不是单调的:它会在开始时上升,但从100到500个纪元开始向下。因此,要么你的学习算法是错误的(在这种情况下,训练数据的性能也会下降),要么你的网络对于你的数据集来说太大,并且随着它“过度学习”训练数据而变得越来越差。祝你好运。@alexis我删除了标记,我认为它是默认生成的,我只是继续点击它。谢谢你的反馈!