如何计算使用keras训练的语言模型的困惑?

时间:2016-05-07 13:33:41

标签: python nlp keras language-model

在Windows 10上使用Python 2.7 Anaconda

我已经训练了一个GRU神经网络来使用keras构建语言模型:

print('Build model...')
model = Sequential()
model.add(GRU(512, return_sequences=True, input_shape=(maxlen, len(chars))))
model.add(Dropout(0.2))
model.add(GRU(512, return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(len(chars)))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy', optimizer='rmsprop')

如何计算这种语言模型的困惑?例如,NLTK为其模型提供了困惑度计算功能。

1 个答案:

答案 0 :(得分:5)

我看到你也遵循了关于语言模型的Keras教程,这对我的理解并不完全正确。这是因为语言模型应该估计每个子序列的概率,例如P(c_1,c_2..c_N)= P(c_1)P(c_2 | c_1)... P(c_N | c_N-1。 ..c_1) 但是,假设您的输入是一个形状为sequence_length X #characters的矩阵,并且您的目标是序列后面的字符,则模型的输出将只产生最后一个项P(c_N | c_N-1 ... c_1)

在此之后,困惑是P(c_1,c_2..c_N)^ { - 1 / N},您无法获得所有条款。这就是我建议使用TimeDistributedDense图层的原因。它会给你一个sequence_length X #characters的矩阵,其中每一行都是字符上的概率分布,称之为proba

从proba的每一行开始,您需要包含正确字符预测的列:

correct_proba = proba [np.arange(maxlen),yTest],

假设yTest是一个包含每个时间步的正确字符索引的向量

然后是一个序列的困惑(你必须平均所有的训练序列)

np.power(2,-np.sum(np.log(correct_proba),轴= 1)/ MAXLEN)

PS。我宁愿在乳胶中写下解释