我在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)
....
答案 0 :(得分:6)
看起来你正在计算交叉熵损失之和的指数。困惑,通过,被定义为熵的力量的两个。
困惑(M)= 2 ^熵(M)
困惑(M)= 2 ^( - 1 / n)(log2(P(w1,w2,...,wn)))
其中log2 = log base 2
所以是的,它应该基于每个时间步的损失,而不是取总和或均值。像你现在这样的总和将大大夸大你的交叉熵损失,所以那么将2增加到该值的功率将是非常大的。
可以找到更多详细信息here
答案 1 :(得分:1)
要计算训练困惑,需要按照here中所述对指数进行取幂。
Tensorflow使用自然对数计算交叉熵损失,因此我们使用tf.exp迭代计算每个时间步的训练损失,例如tf.exp(accumulative_iteration_costs / accumulative_num_steps_iters)。
检查张量流PTB字lstm example