Как бороться с потерей мини-партии в Pytorch? - PullRequest
1 голос
/ 27 марта 2019

Я передаю данные мини-партии в модель, и я просто хочу знать, как бороться с потерей. Могу ли я накопить убыток, а затем отозвать назад, как:

    ...
    def neg_log_likelihood(self, sentences, tags, length):
        self.batch_size = sentences.size(0)

        logits = self.__get_lstm_features(sentences, length)
        real_path_score = torch.zeros(1)
        total_score = torch.zeros(1)
        if USE_GPU:
            real_path_score = real_path_score.cuda()
            total_score = total_score.cuda()

        for logit, tag, leng in zip(logits, tags, length):
            logit = logit[:leng]
            tag = tag[:leng]
            real_path_score += self.real_path_score(logit, tag)
            total_score += self.total_score(logit, tag)
        return total_score - real_path_score
    ...
loss = model.neg_log_likelihood(sentences, tags, length)
loss.backward()
optimizer.step()

Интересно, а если накопление может привести к градиентному взрыву?

Итак, я должен вызвать обратный цикл:

for sentence, tag , leng in zip(sentences, tags, length):
    loss = model.neg_log_likelihood(sentence, tag, leng)
    loss.backward()
    optimizer.step()

Или используйте среднее значение потерь, как redu_mean в тензорном потоке

loss = reduce_mean(losses)
loss.backward()

1 Ответ

0 голосов
/ 27 марта 2019

Значение loss должно быть уменьшено на mean с использованием размера мини-партии.Если вы посмотрите на собственные функции потери PyTorch, такие как CrossEntropyLoss , то для этого есть отдельный параметр reduction, и по умолчанию используется размер mean для размера мини-пакета.

...