如何在开发数据上测试word2vec?

时间:2019-04-28 20:16:53

标签: python neural-network nlp word2vec perplexity

在计算机分配中,要求使用神经网络实现word2vec算法以生成某些单词的密集向量。我实现了神经网络,并通过训练数据对其进行了训练。首先,如何在测试数据上对其进行测试?该问题要求绘制一个图表,显示训练期间(时期)训练和测试数据的困惑性。我可以为此做些损失,就像这样:

EPOCH: 0 LOSS: 27030.09155006593
EPOCH: 0 P_LOSS: 24637.964948774144
EPOCH: 0 PP: inf
/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:121: RuntimeWarning: overflow encountered in double_scalars
EPOCH: 1 LOSS: 25349.086587261085
EPOCH: 1 P_LOSS: 22956.95998596929
EPOCH: 1 PP: inf
EPOCH: 2 LOSS: 24245.455581381622
EPOCH: 2 P_LOSS: 21853.32898008983
EPOCH: 2 PP: inf
EPOCH: 3 LOSS: 23312.976009712416
EPOCH: 3 P_LOSS: 20920.849408420647

我从以下代码中获得了经验

    # CYCLE THROUGH EACH EPOCH
    for i in range(0, self.epochs):

        self.loss = 0
        self.loss_prob = 0
        # CYCLE THROUGH EACH TRAINING SAMPLE
        for w_t, w_c in training_data:

            # FORWARD PASS
            y_pred, h, u = self.forward_pass(w_t)

            # CALCULATE ERROR
            EI = np.sum([np.subtract(y_pred, word) for word in w_c], axis=0)

            # BACKPROPAGATION
            self.backprop(EI, h, w_t)

            # CALCULATE LOSS
            self.loss += -np.sum([u[word.index(1)] for word in w_c]) + len(w_c) * np.log(np.sum(np.exp(u)))
            self.loss_prob += -2*np.log(len(w_c)) -np.sum([u[word.index(1)] for word in w_c]) + (len(w_c) * np.log(np.sum(np.exp(u))))

        print('EPOCH:',i, 'LOSS:', self.loss)
        print('EPOCH:',i, 'P_LOSS:', self.loss_prob)
        print('EPOCH:',i, 'PP:', 2**self.loss_prob)

但是,我不知道如何找到每个时期的培训和发展数据的困惑。根据{{​​3}}来说,困惑度为2**loss。但是,在尝试此公式时,我获得了INF。您能指导我如何计算困惑吗?我可以在当前代码中执行此操作,还是应该对整个开发数据应用功能?

2 个答案:

答案 0 :(得分:0)

实际上,2**20000使浮点数溢出。您应该将每个示例的损失归一化,即除以您的训练数据大小。即使将它们相加也可以进行反向传播,因为除以常数不会更改导数,但是通过这种方式,损失不会随数据大小不变。

答案 1 :(得分:-1)

您可以使用十进制来解决INF问题。

import decimal
decimal.Decimal(2)**decimal.Decimal(loss)