KLDivLoss
-
class torch.nn.modules.loss.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”, которое соответствует математическому определению.- Параметры:
-
-
size_average (bool, optional) – Устарел (см.
reduction). По умолчанию потери усредняются по всем элементам потерь в пакете. Обратите внимание, что для некоторых функций потерь на один образец приходится несколько элементов. Если параметрsize_averageустановлен вFalse, вместо этого потери суммируются для каждого мини-пакета. Игнорируется, еслиreduceравенFalse. По умолчанию:True -
reduce (bool, optional) – Устарел (см.
reduction). По умолчанию потери усредняются или суммируются по наблюдениям для каждого мини-пакета в зависимости отsize_average. ЕслиreduceравенFalse, вместо этого возвращает потери для каждого элемента пакета и игнорируетsize_average. По умолчанию:True -
reduction (str, optional) – Задает способ сведения выходных данных. По умолчанию:
“mean” -
log_target (bool, optional) – Указывает, задан ли
targetв логарифмическом пространстве. По умолчанию:False
-
size_average (bool, optional) – Устарел (см.
- Форма:
-
- Входные данные: , где означает любое количество измерений.
- Целевые данные: , той же формы, что и входные данные.
- Выходные данные: по умолчанию скаляр. Если
reductionравен‘none’, то , той же формы, что и входные данные.
Примеры
>>> 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)
-
forward(input, target)[source] -
Выполняет прямой проход.
- Тип возвращаемого значения:
© 2026, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://docs.pytorch.org/docs/2.14/generated/torch.nn.modules.loss.KLDivLoss.html