【问题标题】:calculating perplexity for training LSTM on penn treebank计算在 penn treebank 上训练 LSTM 的困惑度
【发布时间】:2017-12-29 08:02:09
【问题描述】:

我正在 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)
        ....

【问题讨论】:

    标签: lstm rnn penn-treebank


    【解决方案1】:

    您似乎正在计算交叉熵损失总和的指数。困惑,通过,被定义为熵的二次方。

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

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

    其中 log2 = 对数基数 2

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

    更多详情可以查看here

    【讨论】:

      【解决方案2】:

      要计算训练的困惑度,需要按照here 中的说明对损失进行指数运算。

      Tensorflow 使用自然对数计算交叉熵损失,因此我们使用 tf.exp 迭代计算每个时间步的训练损失,例如 tf.exp(accumulative_iteration_costs / accumulative_num_steps_iters)。

      查看tensorflow PTB字lstm example

      【讨论】:

        猜你喜欢
        • 2013-05-29
        • 2016-09-02
        • 2020-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-25
        • 1970-01-01
        • 2013-12-06
        相关资源
        最近更新 更多