在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为其模型提供了困惑度计算功能。
答案 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。我宁愿在乳胶中写下解释