总结
1.怎么来的?
2.用作什么?
常用于为模型计算损失。
3.交叉熵的公式
L = − ∑ i = 1 n y i ⋅ l o g ( y ^ i ) L=-{\sum_{i=1}^{n} y_i \cdot log (\hat y_i)} L=−i=1∑nyi⋅log(y^i) 其中 y y y是真实标签, y ^ i \hat y_i y^i是第i类标签的预测概率。
3.二分类中的交叉熵
3.1 公式
L o s s = − ( y ⋅ l o g ( y ^ ) + ( 1 − y ) ⋅ l o g ( 1 − y ^ ) ) Loss=-(y\cdot log(\hat{y})+(1-y) \cdot log(1-\hat{y})) Loss=−(y⋅log(y^)+(1−y)⋅log(1−y^))
这个公式也是从上面这个公式 推导而来。
4. 多分类中的交叉熵
5 交叉熵计算损失时,是需要计算整个标签,还是只计算对应有值的两个标签?
理论上:需要对所有的one-hot 向量做交叉熵运算;但是如果是0-1分类,那么只需要计算对应的值就行了,因为有0的那部分计算无效。
6.动手计算交叉熵
数据集和标签定义如下
直接使用交叉熵函数计算
手动计算交叉熵
pytorch中CrossEntropyLoss
的实现是LogSoftmax
+ NLLLoss
,这样我们可以手动实现一下:
"""
2.手动计算交叉熵
"""
m = nn.LogSoftmax(dim=-1)
b = m(logits) # 得到归一化后的值
print(b)
nl = nn.NLLLoss() # 实例化对象时,可以选择使用weight,size_average 等参数
n_loss = nl(b,label) # 这里面是要和 NLLLoss 类中forward() 方法中的参数保持一致,也就是需要传入 input 和 target
print(n_loss)
执行结果就是:
这里的 nl(b,label)
其实就是-(-1.6573 - 1.4849)/2
= 1.5711。也就是说NLLLoss其实是什么(没有做log之类的计算)也没有做,只是单纯的把对应位的损失放在一起,然后计算求和取平均了。
7. 特征
- 什么叫
permutation-sensitive loss function
?
今天在看一篇论文的时候,有一句说法如下:
8. 交叉熵函数和极大似然估计之间有什么关系?
9. 交叉熵函数和负对数似然函数之间有什么关系?
交叉熵函数就是负对数似然函数(Negative Log-Likelihood
)。
10.交叉熵损失和均方误差损失函数有什么区别?
交叉熵 | 均方误差 | |
用途 | 分类 | 回归 |
- | - | - |
11. 交叉熵损失函数的优化过程(求导过程)?
12. 逻辑斯蒂回归用的是什么损失函数?为什么不用MSE?
cross-entropy 函数在分类中更加常用,常用到在pytorch中将其和softmax合在一起使用了。
红色带表示损失大;蓝色带表示损失小;
如果使用MSE函数,则很有可能让其在训练的过程中stuck,但是cross-entropy 函数就可以让优化过程比较顺利。
交叉熵损失函数的推导过程如下:
过两天填坑~
参考资料
- https://zhuanlan.zhihu.com/p/35709485
- 李宏毅《机器学习》