损失函数作为深度学习中最重要的一部分,有必要花时间好好学习和理解一下。
本系列从基础开始,梳理各个损失函数的概念和原理。
交叉熵损失函数
上文简介了损失函数在深度网络中的作用,以及最基本的损失函数MAE和MSE及其推导过程。
本文通过一个简单案例分析介绍交叉熵损失函数的由来及其使用上的优势。
假设有一个分类任务,对猫、狗、老鼠的图片进行识别
模型1输出结果为:
预测 | 标签 | 结果 |
---|---|---|
0.3 0.4 0.3 | 0 1 0(鼠) | 正确 |
0.4 0.3 0.3 | 1 0 0(猫) | 正确 |
0.1 0.6 0.3 | 0 0 1(狗) | 错误 |
模型2输出结果为:
预测 | 标签 | 结果 |
---|---|---|
0.1 0.8 0.1 | 0 1 0 (鼠) | 正确 |
0.6 0.2 0.2 | 1 0 0 (猫) | 正确 |
0.3 0.4 0.3 | 0 0 1 (狗) | 错误 |
分析以上结果,可以看出,模型1对样本1和样本2勉强识别正确,同时对样本3识别出现很大错误。
模型2对样本1和样本2都能够很好的识别出来,在样本3上的错误也并不离谱。
主观上来讲我们更倾向于模型2,因为模型2正确时是很稳定的争取,并不是险胜,错误时差错并不大。
那么我们尝试用一些损失函数来评判两个模型所产生的误差。
分类错误率
直接计算分类错误的数量 c l a s s i f i c a t i o n e r r o r = c o u n t o f e r r o r i t e m s c o u n t o f a l l i t e m s classification error = \frac{count of error items}{count of all items} classificationerror=countofallitemscountoferroritems
结果:
- 模型1: 1 3 \frac{1}{3} 31
- 模型2: 1 3 \frac{1}{3} 31
该方法无法判断出哪个模型更好。
Mean Squared Error(均方误差)
M S E = 1 n ∑ i n ( y ^ i − y i ) 2 MSE = \frac{1}{n}\sum^n_i(\hat y_i - y_i)^2 MSE=n1∑in(y^i−yi)2
结果:
-
模型1:
- $ loss = (0.3 - 0)^2+(0.4 - 1)^2+(0.3 - 0)^2 = 0.09 + 0.36 + 0.09 = 0.54$
- $ loss = (0.4 - 1)^2+(0.3 - 0)^2+(0.3 - 0)^2 = 0.36 + 0.09 + 0.09 = 0.54$
- $ loss = (0.1 - 0)^2+(0.6 - 0)^2+(0.3 - 1)^2 = 0.01 + 0.36 + 0.04 = 0.41$
M S E = 0.54 + 0.54 + 0.41 3 = 0.4967 MSE = \frac{0.54+0.54+0.41}{3} = 0.4967 MSE=30.54+0.54+0.41=0.4967
-
模型2:
- $ loss = (0.1 - 0)^2+(0.8 - 1)^2+(0.1 - 0)^2 = 0.01 + 0.04 + 0.01 = 0.06$
- $ loss = (0.6 - 1)^2+(0.2 - 0)^2+(0.2 - 0)^2 = 0.16 + 0.04 + 0.04 = 0.24$
- $ loss = (0.3 - 0)^2+(0.4 - 0)^2+(0.3 - 1)^2 = 0.09 + 0.16 + 0.49 = 0.74$
M S E = 0.06 + 0.24 + 0.74 3 = 0.3467 MSE = \frac{0.06+0.24+0.74}{3} = 0.3467 MSE=30.06+0.24+0.74=0.3467
可以发现,使用MSE可以比较出两个模型的好坏,但是使用MSE的一个缺点就是其偏导值在输出概率值接近0或者接近1的时候非常小,这可能会造成模型刚开始训练时,偏导值几乎消失。
Cross Entropy Loss Function(交叉熵损失函数)
二分类 L = − [ y l o g ( p ) + ( 1 − y ) l o g ( 1 − p ) ] L = -[ylog(p) + (1-y)log(1-p)] L=−[ylog(p)+(1−y)log(1−p)]
多分类 L = ∑ c = 1 M − y c l o g ( p c ) L = \sum^M_{c=1}-y_{c}log(p_c) L=∑c=1M−yclog(pc)
对于我们上面提到的例子,用交叉熵损失函数计算如下:
-
模型1:
- $ loss = -(0×log0.3+1×log0.4+0×log0.3) = 0.9163$
- $ loss = -(1×log0.4+0×log0.3+0×log0.3) = 0.9163$
- $ loss = -(0×log0.1+0×log0.6+1×log0.3) = 1.2040$
C E L o s s = 0.9163 + 0.9163 + 1.2040 3 = 1.0122 CELoss = \frac{0.9163+0.9163+1.2040}{3} = 1.0122 CELoss=30.9163+0.9163+1.2040=1.0122
-
模型2:
- $ loss = -(0×log0.1+1×log0.8+0×log0.1) = 0.2241$
- $ loss = -(1×log0.6+0×log0.2+0×log0.2) = 0.5108$
- $ loss = -(0×log0.3+0×log0.4+1×log0.3) = 1.2040$
C E L o s s = 0.2241 + 0.5108 + 1.2040 3 = 0.6463 CELoss = \frac{0.2241+0.5108+1.2040}{3} = 0.6463 CELoss=30.2241+0.5108+1.2040=0.6463
根据公式可知,交叉熵函数在计算损失时更关注对目标分类的预测情况。
信息论中,信息量的表示方式为 I ( x j ) = − l n ( p ( x j ) ) I(x_j) = -ln(p(x_j)) I(xj)=−ln(p(xj))
- x j x_j xj: 表示一个事件
- p ( x j ) p(x_j) p(xj): 表示x_j发生的概率
-
I
(
x
j
)
I(x_j)
I(xj): 信息量,x_j越不可能发生时,它一旦发生后的信息量就越大
集合我们的交叉熵一起理解,当对目标分类的预测概率越小,损失值就越大。
下面我们通过简单代码,绘图查看,随着预测概率从0到1的增大,交叉熵损失的变化。
# 交叉熵损失函数
pres = np.arange(0.001,1,0.001)
ce = [-np.log(p) for p in pres]
plt.plot(pres,ce)
plt.title('Cross Entropy Loss')
plt.xlabel('Probability')
plt.ylabel('CE Loss Value')
通过交叉熵损失函数的公式我们可以清晰的发现,交叉熵损失函数更关注分类正确的值所对应的概率。