Spec-Zone.ru › PyTorch 2

KLDivLoss

class torch.nn.KLDivLoss(size_average=None, reduce=None, reduction='mean', log_target=False) [source]

Потеря расхождения Кульбака-Лейблера.

Для тензоров одинаковой формы ypred,ytruey_{\text{pred}},\ y_{\text{true}}, где ypredy_{\text{pred}} является input и ytruey_{\text{true}} является target, мы определяем точечное расхождение Кульбака-Лейблера как

L(ypred,ytrue)=ytrue⋅log⁡ytrueypred=ytrue⋅(log⁡ytrue−log⁡ypred)L(y_{\text{pred}},\ y_{\text{true}}) = y_{\text{true}} \cdot \log \frac{y_{\text{true}}}{y_{\text{pred}}} = y_{\text{true}} \cdot (\log y_{\text{true}} - \log y_{\text{pred}})

Для избежания проблем с потерей точности при вычислении этой величины, эта потеря ожидает аргумент input в логарифмическом пространстве. Аргумент target также может быть предоставлен в логарифмическом пространстве, если log_target= True.

Вкратце, эта функция примерно эквивалентна вычислению

if not log_target: # default
    loss_pointwise = target * (target.log() - input)
else:
    loss_pointwise = target.exp() * (target - input)

а затем сокращению этого результата в зависимости от аргумента reduction как

if reduction == "mean":  # default
    loss = loss_pointwise.mean()
elif reduction == "batchmean":  # mathematically correct
    loss = loss_pointwise.sum() / input.size(0)
elif reduction == "sum":
    loss = loss_pointwise.sum()
else:  # reduction == "none"
    loss = loss_pointwise

Примечание

Как и все другие потери в PyTorch, эта функция ожидает, что первый аргумент, input, будет выходом модели (например, нейронной сети), а второй, target, — наблюдениями в наборе данных. Это отличается от стандартной математической нотации KL(P∣∣Q)KL(P\ ||\ Q), где PP обозначает распределение наблюдений, а QQ обозначает модель.

Предупреждение

reduction= “mean” не возвращает истинное значение расхождения Кульбака-Лейблера, пожалуйста, используйте reduction= “batchmean”, что соответствует математическому определению.

Параметры
  • size_average (bool, необязательно) – Устарело (см. reduction). По умолчанию потери усредняются по каждому элементу потери в пакете. Обратите внимание, что для некоторых потерь существует несколько элементов на образец. Если поле size_average установлено в False, потери вместо этого суммируются для каждой мини-пачки. Игнорируется, когда reduce равно False. По умолчанию: True
  • reduce (bool, необязательно) – Устарело (см. reduction). По умолчанию потери усредняются или суммируются по наблюдениям для каждой мини-пачки в зависимости от size_average. Когда reduce равно False, возвращает потерю на элемент пакета вместо этого и игнорирует size_average. По умолчанию: True
  • reduction (str, необязательно) – Указывает операцию, которую нужно применить к выводу. По умолчанию: “mean”
  • log_target (bool, необязательно) – Указывает, является ли target логарифмическим пространством. По умолчанию: False
Форма:
  • Вход: (∗)(*), где ∗* означает любое количество измерений.
  • Цель: (∗)(*), форма такая же, как у входных данных.
  • Вывод: скаляр по умолчанию. Если reduction равно ‘none’, тогда (∗)(*), форма такая же, как у входных данных.

Примеры:

>>> import torch.nn.functional as F
>>> kl_loss = nn.KLDivLoss(reduction="batchmean")
>>> # input should be a distribution in the log space
>>> input = F.log_softmax(torch.randn(3, 5, requires_grad=True), dim=1)
>>> # Sample a batch of distributions. Usually this would come from the dataset
>>> target = F.softmax(torch.rand(3, 5), dim=1)
>>> output = kl_loss(input, target)

>>> kl_loss = nn.KLDivLoss(reduction="batchmean", log_target=True)
>>> log_target = F.log_softmax(torch.rand(3, 5), dim=1)
>>> output = kl_loss(input, log_target)

© 2024, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://pytorch.org/docs/2.1/generated/torch.nn.KLDivLoss.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API