【问题标题】:How to calculate perplexity for a language model trained using keras?如何计算使用 keras 训练的语言模型的困惑度?
【发布时间】:2016-09-02 12:28:53
【问题描述】:

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

【问题讨论】:

标签: python nlp keras language-model


【解决方案1】:

我看到您也遵循了 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

从概率的每一行中,您需要包含正确字符预测的列:

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

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

那么序列的困惑度(你必须对所有训练序列进行平均)

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

PS。我宁愿用乳胶写解释

【讨论】:

  • 您好,感谢您回答这个问题!这变化太大了。您是否在数据集上实现了您的版本?我可以联系你吗?
  • 我很高兴 :) 是的,我正在对公共 FCE 数据集进行培训 - 发送电子邮件至 btd26 at cam dot ac dot uk
  • @layser 谢谢你的回答。我想知道 maxlen 是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 2017-09-20
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多