2017-12-29 19 views
8

私はpenn treebankで言語モデルトレーニングを実装しています。penn treebankのトレーニングLSTMのperplexityを計算する

私はタイムステップごとに損失を加えて、パープレキシティを計算しています。

これは、しばらくの間、訓練をしても何億もの錯覚を感じさせません。

損失自体は減少しますが、最大でも約20まで低下します。 (私は賢明なperplexityを得るために損失のために1桁の番号が必要です)。

これは、私の錯覚計算が誤っているかどうか疑問です。

各タイムステップの損失に基づいて、それをすべて加算するのではなく、平均化する必要がありますか?

マイ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) 
     .... 

答えて

4

です。 Perplexity、throughは、エントロピーのパワーに対して2と定義されます。

困惑(M)= 2 ^エントロピー(M)

困惑(M)= 2 ^( - 1/N)(LOG2(P(W2、W1、...、WN)))

ここで、log2 =ログベース2

したがって、合計または平均をとるのではなく、各タイムステップの損失に基づいている必要があります。あなたのような合計を取ることは、今あなたのクロスエントロピー損失を劇的に膨らませるので、その値の2乗を上げることは非常に大きくなります。

詳細はトレーニングパープレキシティを計算するにはhere

0

を見つけることができ、損失がhereで説明したように指数化する必要があります。

Tensorflowは自然対数を使用してクロスエントロピー損失を計算するため、tf.exp(accumulative_iteration_costs/accumulative_num_steps_iters)などの各タイムステップのトレーニング損失を反復的に計算するためにtf.expを使用します。

テンソルフローPTBワードの確認lstm example

関連する問題