为(自然语言)标记调试神经网络

时间:2015-06-20 23:07:02

标签: machine-learning nlp artificial-intelligence neural-network

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

我编写了神经网络,并在几个不同的问题上进行了测试,以确保网络本身有效。我训练它学习如何将数字,XOR,立方体数字加倍,并学习sin函数以获得相当高的准确度。所以,我相信实际的算法是有效的。

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

然后我获得了布朗语料库的数据集,并使用NLTK将标签集简化为“通用”。我使用NLTK生成并保存所有语料库和字典数据。为了测试目的,我从语料库中删除了最后15,000个句子。我使用语料库的其余部分(大约40,000个标记词语句)进行训练。

神经网络布局如下:每个标签都有一个输入神经元。输出层:每个标签有一个输出神经元。网络正在输入3个字:第一个:在我们想要标记的单词之前的单词,第二个:需要标记的单词,第三个:在第二个单词之后的单词。因此,输入总数为3x(可能的标签总数)。输入值是0到1之间的数字。在字典中搜索输入到输入层的3个单词中的每一个(由40,000个语料库组成,用于训练的相同语料库)。字典保存每个单词在语料库中被标记为单词的多少次。

  

例如,单词'cover'被标记为名词1次和动词3   次。

为该词所关联的每个词性计算被标记的百分比,并且这是为该特定词提供给网络的内容。因此,指定为NOUN的输入神经元将接收.33,而VERB将接收.66。保存该单词标签的其他输入神经元接收0.0的输入。这是针对要输入的3个单词中的每一个进行的。如果单词是句子的第一个单词,则第一组标签全部为0.如果单词是句子的最后一个单词,则保留后续单词的标签概率的最后一组输入神经元保留为0 。 我一直在使用10个隐藏节点(我已经阅读了很多论文,这似乎是开始测试的好地方)

15,000个测试句中没有一个被用来制作'字典'。因此,当使用这个部分语料库测试网络时,网络将会有一些单词从未见过。未识别的单词的后缀被剥离,其后缀在另一个“词典”中搜索。然后将该词最可能的内容用作它的输入。

这是我的设置,我开始尝试训练网络。我一直用40,000个句子训练网络。 1个时代= 1个40,000训练集的每个句子中每个单词的前向和后向传播。所以,只做一个纪元需要几秒钟。只要知道网络表现得很好的概率,但我训练得越多,就没有任何反应。时期之后的数字是正确标记的单词数除以单词总数。

首次运行50个时期:0.928218786

100个时代:0.933130661

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

尝试了10个时代:0.928953683

仅使用1个纪元的结果几乎在.92和.93之间变化

所以,它似乎没有起作用......

然后,我从语料库中取出了55个句子,并使用了具有所有40,000个单词概率的相同词典。对于这个,我训练它的方式与我训练XOR的方式相同 - 我只使用了55个句子而且我只测试了55个句子的训练网络权重。网络能够很容易地学习这55个句子。有120个时期(需要几秒钟),网络从错误地标记3768和正确地标记56(在前几个时期)到正确地标记3772和在第120个时期错误地标记52。

这就是我所处的地方,我一直试图调试这一天超过一天,并且没有想出任何事情。

0 个答案:

没有答案