这里只整理 pytorch 中常见的损失函数,便于自己查阅。
BCELoss
二分类用的交叉熵,用的时候需要在之前加一层 Sigmoid 函数,因为是二分类的话,只有正例和反例,且两者的概率和为 1。所以离散的形式可以写成:
l
o
s
s
(
x
i
,
y
i
)
=
−
w
i
(
y
i
log
x
i
+
(
1
−
y
i
)
log
(
1
−
x
i
)
)
loss(x_i, y_i) = -w_i(y_i\log{x_i} + (1-y_i)\log{(1 - x_i)})
loss(xi,yi)=−wi(yilogxi+(1−yi)log(1−xi))
从式子中可以看出,为什么需要加 Sigmoid 函数了,因为需要将 x i x_i xi 转为 [0, 1] 之间的数。另外二分类时,它与交叉熵其实是等价的。
BCEWithLogitsLoss
这个从名字里就可以看出,它是相当于是 Sigmoid + BCELoss 。
CrossEntropyLoss
多分类最常用的损失函数,用这个 loss 前面不需要加 Softmax 层。
理论上它是最原始的交叉熵形式,需要注意的是,它的 target 是 LongTensor,而不是 one-hot 形式的。
l
o
s
s
(
x
,
l
a
b
e
l
)
=
−
w
l
a
b
e
l
log
e
x
l
a
b
e
l
∑
j
=
1
N
e
x
j
loss(x, label) = -w_{label}\log {\frac{e^{x_{label}}}{\sum_{j=1}^N e^{x_j}}}
loss(x,label)=−wlabellog∑j=1Nexjexlabel
就是正常的交叉熵形式,只不过它自己会做 Softmax 操作,也会自己处理 LongTensor 的 label。
NLLLoss
用于多分类的负对数似然损失函数(Negative Log Likelihood),实际上它前面加一层 LogSoftmax 就等于 CrossEntropyLoss 了,label传入的也是 LongTensor 形式(也就是直接给标签)而不是 one-hot 形式。