Выход PyTorch Softmax не суммируется с 1 - PullRequest
1 голос
/ 30 октября 2019

Перекрестная публикация мой вопрос с форума PyTorch :

Я начал получать отрицательные расхождения KL между целевым распределением Дирихле и выходным распределением Дирихле моей модели. Кто-то в сети предположил, что это может свидетельствовать о том, что параметры распределения Дирихле не равны 1. Я подумал, что это нелепо, поскольку выходные данные модели передаются через

output = F.softmax(self.weights(x), dim=1)

Но после более тщательного изучения я обнаружил, что torch.all(torch.sum(output, dim=1) == 1.) возвращает значение False! Глядя на проблемный ряд, я вижу, что это tensor([0.0085, 0.9052, 0.0863], grad_fn=<SelectBackward>). Но torch.sum(output[5]) == 1. производит tensor(False).

Что я неправильно использую в softmax, так что выходные вероятности не составляют 1?

Это версия PyTorch 1.2.0 + процессор. Полная модель скопирована ниже:

import torch
import torch.nn as nn
import torch.nn.functional as F



def assert_no_nan_no_inf(x):
    assert not torch.isnan(x).any()
    assert not torch.isinf(x).any()


class Network(nn.Module):
    def __init__(self):
        super().__init__()
        self.weights = nn.Linear(
            in_features=2,
            out_features=3)

    def forward(self, x):
        output = F.softmax(self.weights(x), dim=1)
        assert torch.all(torch.sum(output, dim=1) == 1.)
        assert_no_nan_no_inf(x)
        return output

1 Ответ

1 голос
/ 30 октября 2019

Это, скорее всего, связано с числовыми ошибками с плавающей запятой из-за конечной точности.

Вместо проверки строгого неравенства вы должны проверить среднеквадратичную ошибку или что-то в пределах допустимого предела.

Например, я получаю torch.norm(output.sum(dim=1)-1)/N меньше 1e-8. N - размер партии.

...