我正在研究我的论文,任务之一是从以下类型的句子中提取公司名称和位置:
“ Google与日本公司共享资源。”
在这里,我希望输出为“ Google Japan”。句子结构也可能像“日本公司可以访问Google的资源”那样变化。我尝试了基于注意力的NN,但错误率约为0.4。 任何人都可以给我一些有关我应该使用哪种型号的提示吗?
我打印出了这样的验证过程: validation print
我得到了损失和准确性的图表: lass and accuracy
它显示val_acc为0.99。这是否意味着我的模型非常擅长预测?但是,当我使用自己的验证功能显示错误率时为什么会得到0.4的错误率呢?我是ML的新手。 val_acc实际是什么意思?
这是我的模特:
encoder_input = Input(shape=(INPUT_LENGTH,))
decoder_input = Input(shape=(OUTPUT_LENGTH,))
encoder = Embedding(input_dict_size, 64, input_length=INPUT_LENGTH, mask_zero=True)(encoder_input)
encoder = LSTM(64, return_sequences=True, unroll=True)(encoder)
encoder_last = encoder[:, -1, :]
decoder = Embedding(output_dict_size, 64, input_length=OUTPUT_LENGTH, mask_zero=True)(decoder_input)
decoder = LSTM(64, return_sequences=True, unroll=True)(decoder, initial_state=[encoder_last, encoder_last])
attention = dot([decoder, encoder], axes=[2, 2])
attention = Activation('softmax')(attention)
context = dot([attention, encoder], axes=[2, 1])
decoder_combined_context = concatenate([context, decoder])
output = TimeDistributed(Dense(64, activation="tanh"))(decoder_combined_context) # equation (5) of the paper
output = TimeDistributed(Dense(output_dict_size, activation="softmax"))(output)
model = Model(inputs=[encoder_input, decoder_input], outputs=[output])
model.compile(optimizer='adam', loss="binary_crossentropy", metrics=['accuracy'])
es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=200, min_delta=0.0005)
答案 0 :(得分:1)
首先,我要说的是,如果您不熟悉ML,我建议您在转向神经网络之前学习更多的“传统”算法。此外,您的任务是如此特定于公司名称和位置,以至于使用神经网络进行潜在的语义分析(或类似的统计方法)来生成您的嵌入内容,并使用SVM来确定哪些词是相关的,这可能比神经网络具有更少的实验和更少的结果训练时间。
现在所有这些,我可以收集到。如果我理解正确,那么您将获得一个单独的第二个验证集,该验证集上的错误率为40%。屏幕截图中的所有数字都非常好,这使我得出两个可能的结论:您的第二个验证集与您的第一个验证集有很大不同,并且您正遭受过度拟合的困扰,或者代码中存在某个错误,导致Keras相信您的模型做得很好,而实际上却并非如此。 (请记住,我对Keras不太熟悉,所以我不知道后一种选择的可能性如何)
现在,对于模型本身而言,您的任务显然是可提取的,这意味着您的模型不需要释义或提出源文本中没有的内容。您的模型应该考虑到这一点,并且绝对不要犯错误,例如将印度与新西兰混淆或将腾讯与Google混淆。您可能可以基于提取性摘要中的最新工作来建立模型,这是一个相当活跃的领域(除关键字和关键词提取之外)。 Here的最新文章使用神经注意模型,您可以使用Google学术搜索轻松找到更多信息。