PyTorch 的 BCEWithLogitsLoss 类具体是如何实现的?

Ima*_*ahn 11 python implementation loss deep-learning pytorch

根据PyTorch 文档,该类的优点BCEWithLogitsLoss()是可以使用

用于数值稳定性的 log-sum-exp 技巧。

BCEWithLogitsLoss()如果我们使用参数reduction设置为 的类None,他们有一个公式:

损失

我现在简化了条款,经过几行计算后得到:

在此输入图像描述

我很好奇源代码是否是这样做的,但我找不到它。他们唯一的代码是这样的:

BCEWithLogitsLoss 的代码

Del*_*lil 16

nn.BCEWithLogitsLoss实际上只是 sigmoid 函数内部的交叉熵损失。如果模型的输出层未使用 sigmoid 封装,则可以使用它。通常与单个输出层神经元的原始输出一起使用。

简而言之,模型的输出pred将是一个原始值。为了获得概率,您必须使用torch.sigmoid(pred). (要获得实际的类标签,您需要torch.round(torch.sigmoid(pred))。)但是,当您使用 时,您不需要执行类似的操作(即采用 sigmoid)nn.BCEWithLogitsLoss。在这里你只需要做以下操作——

criterion = nn.BCEWithLogitsLoss()
loss = criterion(pred, target) # pred is just raw nn output
Run Code Online (Sandbox Code Playgroud)

因此,来到实现部分,criterion 接受两个 torch 张量 - 一个是原始 nn 输出,另一个是真实的类标签,然后使用 sigmoid 包装第一个张量 - 对于张量中的每个元素,然后计算每对的交叉熵(-(target*log(sigmoid(pred)))损失并将其简化为意思。


jod*_*dag 9

pytorch的所有功能代码都是用C++实现的。实现的源代码位于此处

pytorch 实现计算BCEWithLogitsLoss

在此输入图像描述

t_n简单地说就是哪里-relu(x)。这里的使用t_n基本上是一种避免取正值指数的巧妙方法(从而避免溢出)。t_n通过将其代入l_n产生以下等价表达式,可以使这一点更加清楚

在此输入图像描述