我正在尝试使用Chen和Manning(2014)的神经网络解析器的Stanford CoreNLP实现来训练一个新模型。在培训期间,我使用-devFile
选项每100次迭代对开发集进行UAS评估。经过几千次迭代后,我获得了相当不错的UAS(大约86%)。然而,在培训完成后我尝试在同一个开发集上进行测试时,我获得了大约15%的UAS。我正在使用英语Universal Dependencies树库。
培训的命令行选项:
java edu.stanford.nlp.parser.nndep.DependencyParser -trainFile ~/Datasets/universal-dependencies-1.2/UD_English/en-ud-train.conllu -devFile ~/Datasets/universal-dependencies-1.2/UD_English/en-ud-dev.conllu -embedFile path/to/wordvecs -embeddingSize 100 -model nndep.model.txt.gz -trainingThreads 2
用于测试的命令行选项:
java edu.stanford.nlp.parser.nndep.DependencyParser -model nndep.model.txt.gz -testFile ~/Datasets/universal-dependencies-1.2/UD_English/en-ud-dev.conllu
当我使用提供的UD模型进行英语时,一切正常,我在开发集上获得了大约80%的UAS。这让我相信我训练有素的模型是低于标准的,而且我可能错过了一些必要的步骤或选项。但由于在训练期间的评估给出了相当不错的结果,我有点困惑。根据我的理解,这两个评估之间不应该存在很大差异。
那么,在培训期间评估与测试时评估之间存在巨大差异的原因可能是什么?
答案 0 :(得分:0)
回答我自己的问题。 我在another thread找到了这个问题的答案,尽管他们的问题有点不同。
当您使用与默认值50不同的嵌入大小时,您还需要在解析时传递-embeddingSize标志。如上面链接的线程所述,这也适用于隐藏的大小参数。
这样做解决了这个问题,我得到的UAS等同于训练期间的UAS。
因此,如果您使用与默认值不同的单词嵌入或隐藏图层大小,则需要在使用模型进行分析时传递这些参数。
答案 1 :(得分:0)
我认为你有错误,我不知道是否是复制粘贴,而是在:
“用于测试的命令行选项:”
java edu.stanford.nlp.parser.nndep.DependencyParser -model nndep.model.txt.gz -testFile ~/Datasets/universal-dependencies-1.2/UD_English/en-ud-**dev**.conllu
我认为应该是:
java edu.stanford.nlp.parser.nndep.DependencyParser -model nndep.model.txt.gz -testFile ~/Datasets/universal-dependencies-1.2/UD_English/en-ud-**test**.conllu