使用LSTM构建聊天机器人,无论输入是什么,就算输入完全不符合语法,模型都会给出一个输出,显然,这个输出不是我们想要的,如何识别模型输出是不是我们想要的?我们需要一种评估指标,评估模型输出的置信度。那能不能使用模型最后一层softmax值做为置信度指标?分析 LSTM网络模型图,可以知道,LSTM模型的本质是通过训练给定的语料集,找到合适的权重值,建立了一种映射关系,把输入映射到输出。对于语料集中列出的对话,模型建立了合适的权重值,输入能正确的映射到输出,对于语料集中没有的对话,模型没有得到训练,自然没有建立合适的权重值,模型的输出是随机的,最后一层softmax值自然也是随机的,所以最后一层softmax值不能做为LSTM模型的置信度指标。
下面对“最后一层softmax值不能做为LSTM模型的置信度指标”进行实测验证,选取129条对话的小语料集训练LSTM模型,进行了150轮训练,精准度达到了1.0。从下面的测试结果图可以看到,使用训练集中的对话测试的softmax值分别是:0.999,1.0,0.992,非训练集中的对话结果是:0.769,0.999,1.0,结果符合之前的判断,是随机的,最后一层softmax值不能做为LSTM模型的置信度指标。
##模型计算softmax值代码:
decode_pred = sess.run(self.decoder_outputs_decode, input_feed)
pred = decode_pred.sample_id
if self.time_major:
pred = tf.transpose(pred, (1, 0))
pred = sess.run(pred)
decode_rnn_output = decode_pred.rnn_output
if self.time_major:
decode_rnn_output = tf.transpose(decode_rnn_output,(1, 0, 2))
decode_softmax = tf.nn.softmax(decode_rnn_output,axis=2)
decode_softmax_val = sess.run(decode_softmax)
code_id = int(pred[0][0])
print("confidence:", decode_softmax_val[0][0][code_id])
测试结果:
使用训练语料集之内的对话进行测试:
使用训练语料集之外的对话进行测试: