KLDivLoss
-
class torch.nn.KLDivLoss(size_average=None, reduce=None, reduction='mean', log_target=False)[source] -
Функция потерь расхождения Кульбака-Лейблера.
Для тензоров одинаковой формы , где является
inputи являетсяtarget, мы определяем точечное расхождение Кульбака-Лейблера какДля предотвращения проблем с недостаточным потоком при вычислении этой величины, эта функция потерь ожидает аргумент
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, будет наблюдениями в наборе данных. Это отличается от стандартной математической записи , где обозначает распределение наблюдений, а обозначает модель.Предупреждение
reduction= “mean”не возвращает истинное значение расхождения Кульбака-Лейблера, пожалуйста, используйтеreduction= “batchmean”, которое соответствует математическому определению. В будущей версии“mean”будет изменено, чтобы совпадать с“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
-
size_average (bool, необязательно) – Устарело (см.
- Форма:
-
- Вход: , где означает любое количество измерений.
- Цель: , такая же форма, как вход.
- Выход: скаляр по умолчанию. Если
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/1.13/generated/torch.nn.KLDivLoss.html