ish*_*ido 2 python nlp language-model keras
在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')
Run Code Online (Sandbox Code Playgroud)
如何计算这种语言模型的困惑?例如,NLTK为其模型提供了困惑度计算功能。
我发现您还遵循了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#个字符的矩阵,而目标是该序列之后的字符,则模型的输出将仅生成最后一项P(c_N | c_N-1 ... c_1 )
随之而来的困惑是P(c_1,c_2..c_N)^ {-1 / N},您将无法获得所有的条件。这就是为什么我建议使用TimeDistributedDense层的原因。它将为您提供一个sequence_length X#个字符的矩阵,其中每一行都是字符上的概率分布,称为proba
在proba的每一行中,都需要包含正确字符预测的列:
Correct_proba = proba [np.arange(maxlen),yTest],
假设yTest是一个包含每个时间步长正确字符的索引的向量
然后,序列的困惑(您必须对所有训练序列求平均值)
np.power(2,-np.sum(np.log(correct_proba),axis = 1)/ maxlen)
PS。我宁愿用乳胶写解释