我正在Penn Treebank上进行语言模型培训。

我正在为每个时间步增加损失,然后计算困惑度。

即使经过一段时间的训练,这也给我带来了数千亿美元的毫无意义的困惑。

损失本身会减少,但最多只能减少到约20个。 (我需要一位数字的损失才能得到理智的困惑)。

这使我想知道我的困惑计算是否被误导了。

是否应该基于每个时间步长的损失,然后求平均值而不是将它们相加?

我的batch_size是20,num_steps是35。

def perplexity(loss):
    perplexity = np.exp(loss)
    return perplexity

...
loss = 0
x = nn.Variable((batch_size, num_steps))
t = nn.Variable((batch_size, num_steps))
e_list = [PF.embed(x_elm, num_words, state_size, name="embed") for x_elm in F.split(x, axis=1)]
t_list = F.split(t, axis=1)

for i, (e_t, t_t) in enumerate(zip(e_list, t_list)):
    h1 = l1(F.dropout(e_t,0.5))
    h2 = l2(F.dropout(h1,0.5))
    y = PF.affine(F.dropout(h2,0.5), num_words, name="pred")
    t_t = F.reshape(t_t,[batch_size,1])
    loss += F.mean(F.softmax_cross_entropy(y, t_t))

for epoch in range(max_epoch):
    ....
    for i in range(iter_per_epoch):
        x.d, t.d = get_words(train_data, i, batch_size)
        perp = perplexity(loss.d)
        ....

最佳答案

看来您正在计算交叉熵损失之和的指数。困惑度被定义为熵的幂的两倍。

困惑度(M)= 2 ^熵(M)

困惑度(M)= 2 ^(-1/n)(log2(P(w1,w2,...,wn)))

其中log2 =以2为底的对数

所以是的,它应该基于每个时间步长的损失,而不是求和或取平均值。像现在这样计算总和会极大地增加交叉熵损失,因此将2乘以该值的幂将是非常大的。

可以找到更多详细信息here

关于lstm - 计算在Penn树库上训练LSTM的困惑度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48019423/

10-12 19:32