Как я могу проверить word2vec над данными разработки? - PullRequest
0 голосов
/ 28 апреля 2019

В компьютерном задании требуется реализовать алгоритм 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)

Однако я не знаю, как найтирастерянность для данных обучения и развития в каждой эпохе.На основании этого вопроса сказано, что недоумение составляет 2**loss.Однако, попробовав эту формулу, я набрал INF.Не могли бы вы подсказать мне, как я могу вычислить недоумение?Могу ли я сделать это в текущем коде или применить функцию ко всем данным разработки?

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

Вы можете решить проблему INF, используя десятичную дробь.

import decimal
decimal.Decimal(2)**decimal.Decimal(loss)
0 голосов
/ 29 апреля 2019

Действительно, 2**20000 переполняет поплавок. Вы должны нормализовать потери в каждом примере, то есть разделить их на размер тренировочных данных. Обратное распространение работает, даже если вы суммируете их, потому что деление на константу не меняет производную, но в этом случае потеря не является инвариантной к размеру данных.

...