Como calcular perplexidade para um modelo de linguagem treinado usando keras?

votos
2

Usando Python 2.7 Anaconda no Windows 10

Eu tenho treinado uma rede neural GRU para construir um modelo de linguagem usando 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')

Como faço para calcular a perplexidade deste modelo de linguagem? Por exemplo, NLTK oferece uma função de cálculo de perplexidade para os seus modelos.

Publicado 07/05/2016 em 12:33
fonte usuário
Em outras línguas...                            


1 respostas

votos
3

Vejo que você também têm seguido o tutorial Keras no modelo de linguagem, que o meu entendimento não é inteiramente correcto. Isto é devido ao fato de que o modelo de linguagem deve ser estimar a probabilidade de cada subsequence por exemplo, P (c_1, c_2..c_N) = P (c_1) P (c_2 | c_1) .. P (c_N | c_N-1. ..c_1) no entanto, assumindo que a sua entrada é uma matriz com #characters forma sequence_length X e o seu objectivo é o de caracteres seguinte a sequência, a saída do seu modelo só irá produzir o último termo P (c_N | c_N-1 ... c_1 )

Seguindo que a perplexidade é P (c_1, c_2..c_N) ^ {- 1 / N}, você não pode obter todos os termos. É por isso que eu recomendo usar a camada TimeDistributedDense. Ele lhe dará uma matriz de #characters X sequence_length, onde cada linha é uma distribuição de probabilidade sobre os personagens, chamá-lo proba

De cada fileira de proba, você precisa da coluna que contém a previsão para o caractere correto:

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

assumindo yTest é um vector contendo o índice do carácter correcto a cada passo de tempo

Em seguida, a perplexidade de uma seqüência (e você tem a média sobre todas as suas seqüências de treinamento é)

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

PS. Gostaria que em vez escrita a explicação em latex

Respondeu 15/05/2016 em 18:51
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more