BCEWithLogitsLoss

classtorch.nn.BCEWithLogitsLoss(weight=None, size_average=None, reduce=None, reduction='mean', pos_weight=None)[源代码]

此损失函数结合了一个Sigmoid层和一个BCELoss层于一体。相比先使用简单的Sigmoid层再接BCELoss层,这种版本在数值稳定性方面更优。通过将操作合并到一层中,我们利用了log-sum-exp技巧来提高数值稳定性。

reduction设置为'none'时,损失可以描述为未减少的:

(x,y)=L={l1,,lN},ln=wn[ynlogσ(xn)+(1yn)log(1σ(xn))],\ell(x, y) = L = \{l_1,\dots,l_N\}^\top, \quad l_n = - w_n \left[ y_n \cdot \log \sigma(x_n) + (1 - y_n) \cdot \log (1 - \sigma(x_n)) \right],

其中NN 表示批量大小。如果reduction 不是'none'(默认为'mean'),则

(x,y)={mean(L),if reduction=‘mean’;sum(L),if reduction=‘sum’.\ell(x, y) = \begin{cases} \operatorname{mean}(L), & \text{if reduction} = \text{`mean';}\\ \operatorname{sum}(L), & \text{if reduction} = \text{`sum'.} \end{cases}

这用于测量如自编码器中的重构误差。请注意,目标t[i]应为0到1之间的数值。

可以通过为正例分配权重来平衡召回率和精确率。在多标签分类的情况下,损失函数可以表示为:

c(x,y)=Lc={l1,c,,lN,c},ln,c=wn,c[pcyn,clogσ(xn,c)+(1yn,c)log(1σ(xn,c))],\ell_c(x, y) = L_c = \{l_{1,c},\dots,l_{N,c}\}^\top, \quad l_{n,c} = - w_{n,c} \left[ p_c y_{n,c} \cdot \log \sigma(x_{n,c}) + (1 - y_{n,c}) \cdot \log (1 - \sigma(x_{n,c})) \right],

其中cc表示类别编号(对于多标签二分类问题,c>1c > 1;对于单标签二分类问题,c=1c = 1),nn表示批次中的样本数量,而pcp_c是类别cc的正例权重。

pc>1p_c > 1时提高召回率,当pc<1p_c < 1时提高精确度。

例如,如果一个数据集包含单个类别的100个正样本和300个负样本,则该类的pos_weight 应设置为300100=3\frac{300}{100}=3。损失函数会将数据集中的正样本数量视为3×100=3003\times 100=300个进行计算。

示例:

>>> target = torch.ones([10, 64], dtype=torch.float32)  # 64 classes, batch size = 10
>>> output = torch.full([10, 64], 1.5)  # A prediction (logit)
>>> pos_weight = torch.ones([64])  # All weights are equal to 1
>>> criterion = torch.nn.BCEWithLogitsLoss(pos_weight=pos_weight)
>>> criterion(output, target)  # -log(sigmoid(1.5))
tensor(0.20...)

在上述示例中,pos_weight 张量的元素对应于多标签二元分类场景中的 64 个不同类别。每个 pos_weight 元素旨在根据各自类别的正负样本不平衡情况调整损失函数。这种方法在具有不同程度类别不平衡的数据集中非常有用,确保损失计算准确地反映每个类别的分布。

参数
  • weight (Tensor, 可选) – 每个批次元素损失的手动重缩放权重。如果提供,必须是一个大小为 nbatch 的 Tensor。

  • size_average (bool, optional) – 已弃用(请参见reduction)。默认情况下,损失值会在批次中的每个损失元素上进行平均计算。需要注意的是,对于某些损失函数,每个样本包含多个损失元素。如果将字段 size_average 设置为 False,则损失值会针对每个小批量求和。当reduceFalse时,此设置会被忽略。默认值: True

  • reduce (bool, optional) – 已弃用(请参见reduction)。默认情况下,损失值会根据size_average参数在每个小批量中进行平均或求和。当reduceFalse时,返回每批元素的单独损失值,并忽略size_average设置。默认值:True

  • reduction (str, 可选) – 指定要应用于输出的缩减方式:'none' | 'mean' | 'sum'
    'none': 不进行任何缩减,'mean': 输出总和除以元素数量,'sum': 对输出求和。注意:size_averagereduce 正在被弃用,在此期间,指定这两个参数中的任何一个将覆盖 reduction 参数。默认值: 'mean'

  • pos_weight (Tensor, optional) – 正例的权重,与目标进行广播。必须是一个张量,在类别维度上的大小要和类的数量相等。请注意 PyTorch 的广播语义以实现所需的运算。对于一个大小为 [B, C, H, W](其中 B 是批量大小)的目标,pos_weight 大小为 [B, C, H, W] 将对每个批次中的元素应用不同的正权重;或者 [C, H, W] 对整个批次使用相同的正权重。对于一个 2D 多类目标 [C, H, W],若要在所有空间维度上应用相同的正权重,请使用:[C, 1, 1]。默认值:None

形状:
  • 输入: ()(*),其中*表示任意维度的数量。

  • 目标: ()(*),形状与输入相同。

  • 输出:标量。如果 reduction'none',那么结果为 ()(*),其形状与输入相同。

示例:

>>> loss = nn.BCEWithLogitsLoss()
>>> input = torch.randn(3, requires_grad=True)
>>> target = torch.empty(3).random_(2)
>>> output = loss(input, target)
>>> output.backward()
本页目录