Функция F.kl_div
Функция F.kl_div вычисляет дивергенцию Кульбака-Лейблера
между двумя распределениями вероятностей. Первым параметром
функция принимает тензор с логарифмами вероятностей первого
распределения, вторым параметром - тензор с вероятностями
второго распределения. Третьим параметром можно указать
способ редукции результата.
Синтаксис
torch.nn.functional.kl_div(input, target, reduction='mean')
Пример
Давайте вычислим дивергенцию Кульбака-Лейблера между двумя распределениями с редукцией по умолчанию:
import torch
import torch.nn.functional as F
# Логарифмы вероятностей первого распределения
log_p = torch.tensor([-1.0, -2.0, -3.0])
# Вероятности второго распределения
q = torch.tensor([0.5, 0.3, 0.2])
res = F.kl_div(log_p, q)
print(res)
Результат выполнения кода:
tensor(0.7155)
Пример
Давайте используем редукцию суммы для получения общего значения дивергенции:
import torch
import torch.nn.functional as F
torch.manual_seed(0)
log_p = torch.tensor([-0.5, -0.8, -1.2])
q = torch.tensor([0.6, 0.2, 0.2])
res = F.kl_div(log_p, q, reduction='sum')
print(res)
Результат выполнения кода:
tensor(0.7116)
Пример
Рассмотрим использование редукции без суммирования для получения поэлементных значений дивергенции:
import torch
import torch.nn.functional as F
log_p = torch.tensor([[-1.5, -2.5], [-0.5, -1.0]])
q = torch.tensor([[0.7, 0.3], [0.4, 0.6]])
res = F.kl_div(log_p, q, reduction='none')
print(res)
Результат выполнения кода:
tensor([
[-0.3920, -1.2040],
[-0.1833, -0.3065],
])
Пример
Покажем правильный способ использования функции с
логарифмическими вероятностями через F.log_softmax:
import torch
import torch.nn.functional as F
torch.manual_seed(0)
# Исходные логиты
logits = torch.tensor([2.0, 1.0, 0.5])
# Целевое распределение
target = torch.tensor([0.4, 0.3, 0.3])
# Преобразование логитов в логарифмы вероятностей
log_p = F.log_softmax(logits, dim=0)
res = F.kl_div(log_p, target)
print(res)
Результат выполнения кода:
tensor(0.0537)
Смотрите также
-
функцию
log_softmax,
которая преобразует логиты в логарифмы вероятностей -
функцию
softmax,
которая преобразует логиты в распределение вероятностей -
функцию
cross_entropy,
которая вычисляет перекрёстную энтропию между распределениями -
функцию
nll_loss,
которая вычисляет отрицательную логарифмическую вероятность