0
点赞
收藏
分享

微信扫一扫

算法工程师面试题十三交叉熵函数


总结


代码见我​​GitHub​​

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.动手计算交叉熵



数据集和标签定义如下
算法工程师面试题十三交叉熵函数_算法



直接使用交叉熵函数计算
算法工程师面试题十三交叉熵函数_深度学习_02



手动计算交叉熵
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)

执行结果就是:

算法工程师面试题十三交叉熵函数_深度学习_03

这里的 ​​nl(b,label)​​ 其实就是​​-(-1.6573 - 1.4849)/2​​ = 1.5711。也就是说NLLLoss其实是什么(没有做log之类的计算)也没有做,只是单纯的把对应位的损失放在一起,然后计算求和取平均了。

7. 特征

  • 什么叫 ​​permutation-sensitive loss function​​​?
    今天在看一篇论文的时候,有一句说法如下:
    算法工程师面试题十三交叉熵函数_算法_04

8. 交叉熵函数和极大似然估计之间有什么关系?

9. 交叉熵函数和负对数似然函数之间有什么关系?

交叉熵函数就是负对数似然函数(​​Negative Log-Likelihood​​)。

算法工程师面试题十三交叉熵函数_似然函数_05

10.交叉熵损失和均方误差损失函数有什么区别?

交叉熵

均方误差

用途

分类

回归

-

-

-

11. 交叉熵损失函数的优化过程(求导过程)?

12. 逻辑斯蒂回归用的是什么损失函数?为什么不用MSE?


cross-entropy 函数在分类中更加常用,常用到在pytorch中将其和softmax合在一起使用了。


算法工程师面试题十三交叉熵函数_算法_06

红色带表示损失大;蓝色带表示损失小;

如果使用MSE函数,则很有可能让其在训练的过程中stuck,但是cross-entropy 函数就可以让优化过程比较顺利。

交叉熵损失函数的推导过程如下:

过两天填坑~

参考资料


  • ​​https://zhuanlan.zhihu.com/p/35709485​​
  • 李宏毅《机器学习》


举报

相关推荐

0 条评论