2

在 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 为其模型提供了困惑度计算功能。

4

1 回答 1

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 的每一行中,您需要包含正确字符预测的列:

正确概率=概率[np.arange(maxlen),yTest],

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

然后是序列的困惑(并且你必须对所有训练序列进行平均)

np.power(2,-np.sum(np.log(correct_proba),axis=1)/maxlen)

PS。我宁愿用乳胶写解释

于 2016-05-15T19:51:36.667 回答