nn.CrossEntropyLoss()
$$
softmax(x)=\frac{e^{x_{i}}}{\sum_{j}e^{x_{j}}}
$$
$$
logsoftmax(x)=log\frac{e^{x_{i}}}{\sum_{j}e^{x_{j}}}
$$
logsoftmax能够解决函数上溢和下溢的问题,加快运算速度,提高数据稳定性。简单说,因为softmax会进行指数操作,当$x_{i}$的值过大或者过小的时候$e^{x_{i}}$可能会超过float的表示范围(即上溢),也可能四舍五入为0,导致下溢。
NLLLoss(),即负对数似然损失函数(Negtive Log Likehood)
$$
nllloss=-\frac{1}{N}\sum_{i=1}^{N}y_{i}(logsoftmax)
$$
$y_{i}$是one_hot编码后的数据标签
CrossEntropyLoss其实是LogSoftMax和NLLLoss的合体
- 分类任务
- 向更高精度和召回值优化
detach()
从计算图中脱离出来。
假设有模型A和模型B,我们需要将A的输出作为B的输入,但训练时我们只训练模型B. 那么可以这样做:
input_B = output_A.detach()
它可以使两个计算图的梯度传递断开,从而实现我们所需的功能。
返回一个新的tensor,新的tensor和原来的tensor共享数据内存,但不涉及梯度计算,即requires_grad=False。修改其中一个tensor的值,另一个也会改变,因为是共享同一块内存,但如果对其中一个tensor执行某些内置操作,则会报错。
uniform()
从均匀分布中抽样数值进行填充
clamp()
将输入input张量每个元素的范围限制到区间 [min,max],返回结果到一个新张量。
nn.KLDivLoss()
相对熵 = 交叉熵 - 信息熵
$$
loss(p,x)=-\sum xlog(p)-(-\sum xlog(x))
$$
信息熵是该label完美编码所需的信息量。
交叉熵是该label不完美编码(用观察值编码所需的信息量)。
相对熵是交叉熵和信息熵的差值,也就是所需额外的信息量。
分类任务
和交叉熵计算差不多,通常使用交叉熵