loss函数之KLDivLoss

作者: ltochange | 来源:发表于2021-07-18 22:26 被阅读0次

KL散度

KL散度,又叫相对熵,用于衡量两个分布(离散分布和连续分布)之间的距离。

p(x)q(x) 是离散随机变量X的两个概率分布,则pq 的KL散度是:

D_{K L}(p \| q)=E_{p(x)} \log \frac{p(x)}{q(x)}=\sum_{i=1}^{N} p\left(x_{i}\right) \cdot\left(\log p\left(x_{i}\right)-\log q\left(x_{i}\right)\right)

KLDivLoss

对于包含N个样本的batch数据 D(x, y)x是神经网络的输出,并且进行了归一化和对数化;y是真实的标签(默认为概率),xy同维度。

n个样本的损失值l_{n}计算如下:

l_{n}=y_{n} \cdot\left(\log y_{n}-x_{n}\right)

class KLDivLoss(_Loss):
    __constants__ = ['reduction']
    def __init__(self, size_average=None, reduce=None, reduction='mean'):
        super(KLDivLoss, self).__init__(size_average, reduce, reduction)
    def forward(self, input, target):
        return F.kl_div(input, target, reduction=self.reduction)

pytorch中通过torch.nn.KLDivLoss类实现,也可以直接调用F.kl_div 函数,代码中的size_averagereduce已经弃用。reduction有四种取值mean,batchmean, sum, none,对应不同的返回\ell(x, y)。 默认为mean

L=\left\{l_{1}, \ldots, l_{N}\right\}

\ell(x, y)=\left\{\begin{array}{ll}L, & \text { if reduction }=\text { 'none' } \\ \operatorname{mean}(L), & \text { if reduction }=\text { 'mean' } \\ N*\operatorname {mean}(L), & \text { if reduction }=\text { 'batchmean' } \\ \operatorname{sum}(L), & \text { if reduction }=\text { 'sum' }\end{array} \right.

例子:

import torch
import torch.nn as nn
import math

def validate_loss(output, target):
    val = 0
    for li_x, li_y in zip(output, target):
        for i, xy in enumerate(zip(li_x, li_y)):
            x, y = xy
            loss_val = y * (math.log(y, math.e) - x)
            val += loss_val
    return val / output.nelement()

torch.manual_seed(20)
loss = nn.KLDivLoss()
input = torch.Tensor([[-2, -6, -8], [-7, -1, -2], [-1, -9, -2.3], [-1.9, -2.8, -5.4]])
target = torch.Tensor([[0.8, 0.1, 0.1], [0.1, 0.7, 0.2], [0.5, 0.2, 0.3], [0.4, 0.3, 0.3]])
output = loss(input, target)
print("default loss:", output)

output = validate_loss(input, target)
print("validate loss:", output)

loss = nn.KLDivLoss(reduction="batchmean")
output = loss(input, target)
print("batchmean loss:", output)

loss = nn.KLDivLoss(reduction="mean")
output = loss(input, target)
print("mean loss:", output)

loss = nn.KLDivLoss(reduction="none")
output = loss(input, target)
print("none loss:", output)

输出:

default loss: tensor(0.6209)
validate loss: tensor(0.6209)
batchmean loss: tensor(1.8626)
mean loss: tensor(0.6209)
none loss: tensor([[1.4215, 0.3697, 0.5697],
        [0.4697, 0.4503, 0.0781],
        [0.1534, 1.4781, 0.3288],
        [0.3935, 0.4788, 1.2588]])

相关文章

  • loss函数之KLDivLoss

    KL散度 KL散度,又叫相对熵,用于衡量两个分布(离散分布和连续分布)之间的距离。 设 、 是离散随机变量的两个概...

  • Center Loss

    损失函数改进之Center Loss

  • loss函数之triplet loss

    不同于交叉熵损失仅仅考虑样本与类别标签之间误差,triplet loss关注样本与其他样本之间距离。来自论文Lea...

  • loss函数之BCELoss

    BCELoss 二分类交叉熵损失 单标签二分类 一个输入样本对应于一个分类输出,例如,情感分类中的正向和负向 对于...

  • loss函数之SoftMarginLoss

    SoftMarginLoss 用于二分类任务 对于包含个样本的batch数据 , 代表模型输出,代表真实的类别标签...

  • loss函数之SoftMarginLoss

    SoftMarginLoss 用于二分类任务 对于包含个样本的batch数据 , 代表模型输出,代表真实的类别标签...

  • loss函数之MarginRankingLoss

    MarginRankingLoss 排序损失函数 对于包含个样本的batch数据 , , 是给定的待排序的两个输入...

  • 逻辑回归

    逻辑回归: 公式 loss函数 非凸函数,容易造成局部最优 Minimizing the loss corresp...

  • region_layer

    一言蔽之,这个层就是用来算loss的,作者定义的multi task loss 对外主要提供6个函数: layer...

  • [ML] Loss_Function

    1. Loss Function(损失函数) 损失函数可以看做误差部分(loss term)+正则化部分(regu...

网友评论

    本文标题:loss函数之KLDivLoss

    本文链接:https://www.haomeiwen.com/subject/qpvzpltx.html