Класс GaussianNLLLoss
Класс GaussianNLLLoss вычисляет отрицательное логарифмическое правдоподобие для данных, предполагая, что целевые значения имеют гауссовское распределение с заданными средними значениями и дисперсией. Этот класс используется для обучения моделей, которые предсказывают не только целевые значения, но и неопределенность предсказаний.
На вход класс принимает предсказанные средние значения и дисперсии, а также истинные целевые значения. Потери вычисляются по формуле, учитывающей как ошибку предсказания среднего, так и неопределенность.
Синтаксис
torch.nn.GaussianNLLLoss(full=False, eps=1e-06, reduction='mean')
Параметры класса:
-
full- флаг, определяющий учет константных членов в формуле потерь. По умолчаниюFalse. -
eps- небольшое значение, добавляемое к дисперсии для численной стабильности. По умолчанию1e-06. -
reduction- способ агрегации потерь:'none','mean'или'sum'. По умолчанию'mean'.
Метод forward
loss(input, target, var, ...)
Параметры метода:
-
input- предсказанные средние значения. -
target- истинные целевые значения. -
var- предсказанная дисперсия.
Пример работы
Создадим функцию потерь и применим ее к тензорам предсказаний и истинных значений:
import torch
import torch.nn as nn
torch.manual_seed(0)
loss = nn.GaussianNLLLoss()
input = torch.tensor([1.0, 2.0, 3.0, 4.0, 5.0])
target = torch.tensor([1.5, 2.5, 3.5, 4.5, 5.5])
var = torch.tensor([0.5, 0.5, 0.5, 0.5, 0.5])
res = loss(input, target, var)
print(res)
Результат выполнения кода:
tensor(0.2459)
Пример с batch-обработкой
Используем тензоры с размерностью батча для моделирования реального обучения:
import torch
import torch.nn as nn
torch.manual_seed(0)
loss = nn.GaussianNLLLoss()
batch_size = 4
input = torch.randn(batch_size, 5)
target = torch.randn(batch_size, 5)
var = torch.abs(torch.randn(batch_size, 5)) + 0.5
res = loss(input, target, var)
print(res)
Результат выполнения кода:
tensor(1.5894)
Пример с различными значениями reduction
Рассмотрим, как влияет параметр reduction на результат функции потерь:
import torch
import torch.nn as nn
torch.manual_seed(0)
input = torch.tensor([1.0, 2.0, 3.0, 4.0])
target = torch.tensor([1.2, 2.3, 3.1, 4.4])
var = torch.tensor([0.2, 0.3, 0.4, 0.5])
loss_none = nn.GaussianNLLLoss(reduction='none')
loss_mean = nn.GaussianNLLLoss(reduction='mean')
loss_sum = nn.GaussianNLLLoss(reduction='sum')
res_none = loss_none(input, target, var)
res_mean = loss_mean(input, target, var)
res_sum = loss_sum(input, target, var)
print(res_none)
print(res_mean)
print(res_sum)
Результат выполнения кода:
tensor([-0.1222, -0.0237, 0.2383, 0.2351])
tensor(0.0819)
tensor(0.3276)
Пример с параметром full
Используем параметр full=True для учета константных членов в формуле потерь:
import torch
import torch.nn as nn
torch.manual_seed(0)
input = torch.tensor([1.0, 2.0, 3.0, 4.0, 5.0])
target = torch.tensor([1.5, 2.5, 3.5, 4.5, 5.5])
var = torch.tensor([0.5, 0.5, 0.5, 0.5, 0.5])
loss = nn.GaussianNLLLoss(full=True)
res = loss(input, target, var)
print(res)
Результат выполнения кода:
tensor(1.5544)
Пример с предсказанием дисперсии моделью
Создадим простую модель, которая предсказывает как среднее, так и дисперсию гауссовского распределения:
import torch
import torch.nn as nn
import torch.nn.functional as F
torch.manual_seed(0)
class GaussianModel(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super().__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.fc_mean = nn.Linear(hidden_size, output_size)
self.fc_var = nn.Linear(hidden_size, output_size)
def forward(self, x):
x = F.relu(self.fc1(x))
mean = self.fc_mean(x)
var = F.softplus(self.fc_var(x)) + 1e-6
return mean, var
model = GaussianModel(10, 20, 5)
loss = nn.GaussianNLLLoss()
x = torch.randn(4, 10)
target = torch.randn(4, 5)
mean, var = model(x)
res = loss(mean, target, var)
print(res)
Результат выполнения кода:
tensor(2.4937)
Смотрите также
-
класс
MSELoss,
который вычисляет среднеквадратичную ошибку -
класс
PoissonNLLLoss,
который вычисляет отрицательное логарифмическое правдоподобие для распределения Пуассона -
класс
CrossEntropyLoss,
который вычисляет кросс-энтропийную потерю для классификации -
класс
L1Loss,
который вычисляет среднеабсолютную ошибку