分类交叉熵损失(CCE loss)—最重要的损失函数

分类交叉熵损失(CCE loss)—最重要的损失函数

什么是分类交叉熵损失?

假设我问你这个人是谁?

bzrt99.jpg

我给你三个选项:

  1. 玛丽莲·梦露

  2. 奥黛丽·赫本

  3. 安吉丽娜·朱莉

我们都知道她是奥黛丽·赫本,所以正确答案是:

y _ true = [ 0 1 0 ] y\_\text{true}=\begin{bmatrix}0\\\\1\\\\0\end{bmatrix} y_true= 010

假设你不知道她是谁,你根据以下概率分布猜测:

y _ pred = [ 0.2 0.45 0.35 ] y\_\text{pred}=\begin{bmatrix}0.2\\\\0.45\\\\0.35\end{bmatrix} y_pred= 0.20.450.35

针对’这个人是谁?'这个问题,因为 y _ true y\_\text{true} y_true y _ pred y\_\text{pred} y_pred分别是对应同一个问题三个不同选项的真实答案和预测概率,因此它们的所有元素和为1

我们认为 y _ pred y\_\text{pred} y_pred中概率最大的那个对应的选项就是正确答案。因此,上面 y _ pred y\_\text{pred} y_pred的预测是正确的,因为第二个0.45是最大的,对应预测结果是奥黛丽·赫本。但我们认为这个结果还不够好,因为0.451还有一定的距离。

我们使用分类交叉熵损失(CCE loss)来解决这个问题。

假设我们有真实值:

y _ true = y = [ y 1 y 2 y 3 ] y\_\text{true}=y=\begin{bmatrix}y_1\\y_2\\y_3\end{bmatrix} y_true=y= y1y2y3

和预测值:

y _ pred = y ^ = [ y 1 ^ y 2 ^ y 3 ^ ] y\_\text{pred}=\widehat{y}=\begin{bmatrix}\widehat{y_1}\\\widehat{y_2}\\\widehat{y_3}\end{bmatrix} y_pred=y = y1 y2 y3

分类交叉熵(Categorical Cross-Entropy)损失可以写为:

C C E = − ∑ i = 1 i = N y − true i ⋅ l o g ( y − pred i ) C C E = − ∑ i = 1 i = N y i ⋅ l o g ( y i ^ ) ⟹ C C E = − [ y 1 ⋅ l o g ( y 1 ^ ) + y 2 ⋅ l o g ( y 2 ^ ) + y 3 ⋅ l o g ( y 3 ^ ) ] \begin{aligned} CCE&=-\sum_{i=1}^{i=N}y_{-}\text{true}_{i}\cdot log(y_{-}\text{pred}_{i}) \\ CCE&=-\sum_{i=1}^{i=N}y_{i}\cdot log(\widehat{y_{i}}) \\ \Longrightarrow CCE&=-[y_{1}\cdot log(\widehat{y_{1}})+y_{2}\cdot log(\widehat{y_{2}})+y_{3}\cdot log(\widehat{y_{3}})] \end{aligned} CCECCECCE=i=1i=Nytrueilog(ypredi)=i=1i=Nyilog(yi )=[y1log(y1 )+y2log(y2 )+y3log(y3 )]

Python中,利用Numpy,分类交叉熵损失可以写为:

import numpy as np
np.random.seed(2001716)

# defining CCE
def cross_E(y_true, y_pred):
    return -np.sum(y_true * np.log(y_pred + 10 ** -100))

如何计算CCE的梯度?

真实值 y _ true y\_\text{true} y_true固定,CCE的值与 y _ pred y\_\text{pred} y_pred有关,也即与 ( y 1 ^ , y 2 ^ , y 3 ^ ) (\widehat{y_1},\widehat{y_2},\widehat{y_3}) (y1 ,y2 ,y3 )有关。

C C E = f ( y 1 ^ , y 2 ^ , y 3 ^ ) CCE = f(\widehat{y_1},\widehat{y_2},\widehat{y_3}) CCE=f(y1 ,y2 ,y3 )

CCEJacobian矩阵(函数的一阶偏导数以一定方式排列而成的矩阵)为:

J = ∂ ( C C E ) ( y 1 ^ , y 2 ^ , y 3 ^ ) = [ ∂ ( C C E ) ∂ ( y 1 ^ ) ∂ ( C C E ) ∂ ( y 2 ^ ) ∂ ( C C E ) ∂ ( y 3 ^ ) ] J=\frac{\partial(CCE)}{(\widehat{y_1},\widehat{y_2},\widehat{y_3})}=\begin{bmatrix}\frac{\partial(CCE)}{\partial(\widehat{y_1})}\\\\\frac{\partial(CCE)}{\partial(\widehat{y_2})}\\\\\frac{\partial(CCE)}{\partial(\widehat{y_3})}\end{bmatrix} J=(y1 ,y2 ,y3 )(CCE)= (y1 )(CCE)(y2 )(CCE)(y3 )(CCE)

分别计算Jacobian矩阵中的每一个元素得到:

   ⟹    J = [ − y 1 y 1 ^ − y 2 y 2 ^ − y 3 y 3 ^ ]    ⟹    J = − ( [ y 1 y 2 y 3 ] / [ y 1 ^ y 2 ^ y 3 ^ ] )    ⟹    J = − y _ true y _ pred \begin{aligned} \implies J&=\begin{bmatrix}\frac{-y_1}{\widehat{y_1}}\\\\\frac{-y_2}{\widehat{y_2}}\\\\\frac{-y_3}{\widehat{y_3}}\end{bmatrix} \\ \implies J& =-(\begin{bmatrix}y_1\\\\y_2\\\\y_3\end{bmatrix}/\begin{bmatrix}\widehat{y_1}\\\\\widehat{y_2}\\\\\widehat{y_3}\end{bmatrix}) \\ \implies J&=-\frac{y\_\text{true}}{y\_\text{pred}} \end{aligned} JJJ= y1 y1y2 y2y3 y3 =( y1y2y3 / y1 y2 y3 )=y_predy_true

Python中,利用Numpy,分类交叉熵损失的Jacobian矩阵可以写为:

# defining CCE gradients

def cross_E_grad(y_true, y_pred):
    return -y_true / (y_pred + 10 ** -100)

CCE的优缺点

5yhyjj.png

😀优点:CCE可以严重地惩罚错误的预测;可以很好地解决多分类问题

CCE loss over.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值