二元交叉熵损失(BCE loss)—特殊的CCE损失

二元交叉熵损失(BCE loss)—特殊的CCE损失

什么是二元交叉熵损失?

假如我问你:对于下列图片,以下哪些描述是正确的?

bzrt99.jpg
  1. 她是奥黛丽·赫本。
  2. 她饰演电影《罗马假日》的女主:安妮公主。
  3. 她是玛丽莲·梦露。
  4. 她在电影《罗马假日》中扮演一位公主。

我们知道正确的答案是:

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

假设我们不知道正确答案,我们根据以下概率猜测:

y _ pred = [ 0.9 0.95 0.7 0.75 ] y\_\text{pred}=\begin{bmatrix}0.9\\\\0.95\\\\0.7\\\\0.75\end{bmatrix} y_pred= 0.90.950.70.75

我们可以发现, y _ true y\_\text{true} y_true y _ pred y\_\text{pred} y_pred中的每一个元素都是一个独立问题的答案,因此 y _ true y\_\text{true} y_true y _ pred y\_\text{pred} y_pred中所有元素的和不需要为1

在判断时,我们可以设置一个门限 T T T,比如说 T = 0.8 T=0.8 T=0.8。若 y _ pred i ≥ T y\_\text{pred}_{i}\geq T y_prediT,则第 i i i个描述被认为是对的;若 y _ pred i < T y\_\text{pred}_{i}< T y_predi<T,则第 i i i个描述被认为是错误的。这个门限的选取对判断谁对谁错具有重要的影响。

假设我们有真实值:

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

二元交叉熵(Binary Cross-Entropy)损失可以写为:

B C E = − 1 N ∑ i = 1 i = N [ y _ true i ⋅ l o g ( y _ pred i ) + ( 1 − y _ true i ) ⋅ l o g ( 1 − y _ pred i ) ] B C E = − 1 N ∑ i = 1 i = N [ y i ⋅ l o g ( y i ^ ) + ( 1 − y i ) ⋅ l o g ( 1 − y i ^ ) ]    ⟹    B C E = − 1 3 [ y 1 ⋅ l o g ( y 1 ^ ) + ( 1 − y 1 ) ⋅ l o g ( 1 − y 1 ^ ) + y 2 ⋅ l o g ( y ^ 2 ) + ( 1 − y 2 ) ⋅ l o g ( 1 − y ^ 2 ) + y 3 ⋅ l o g ( y 3 ^ ) + ( 1 − y 3 ) ⋅ l o g ( 1 − y 3 ^ ) ] \begin{aligned} BCE=-&\frac{1}{N}\sum_{i=1}^{i=N}[y\_\text{true}_{i}\cdot log(y\_\text{pred}_{i})+(1-y\_\text{true}_{i})\cdot log(1-y\_\text{pred}_{i})] \\ BCE=-&\frac{1}{N}\sum_{i=1}^{i=N}[y_{i}\cdot log(\widehat{y_{i}})+(1-y_{i})\cdot log(1-\widehat{y_{i}})] \\ \implies BCE=-&\frac{1}{3}[y_{1}\cdot log(\widehat{y_{1}})+(1-y_{1})\cdot log(1-\widehat{y_{1}})+ \\ &y_2\cdot log(\widehat{y}_2)+(1-y_2)\cdot log(1-\widehat{y}_2)+ \\ &y_3\cdot log(\widehat{y_3})+(1-y_3)\cdot log(1-\widehat{y_3})] \end{aligned} BCE=BCE=BCE=N1i=1i=N[y_trueilog(y_predi)+(1y_truei)log(1y_predi)]N1i=1i=N[yilog(yi )+(1yi)log(1yi )]31[y1log(y1 )+(1y1)log(1y1 )+y2log(y 2)+(1y2)log(1y 2)+y3log(y3 )+(1y3)log(1y3 )]

其中,‘3’代表 y _ true y\_\text{true} y_true y _ pred y\_\text{pred} y_pred中标量元素的个数。

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

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

# defining BCE
def B_cross_E(y_true, y_pred):
    return -np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))

如何计算BCE的梯度?

真实值 y _ true y\_\text{true} y_true固定,BCE的值与 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 )有关。

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

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

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

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

⟹ J = [ − 1 3 ( y 1 y 1 ^ − 1 − y 1 1 − y 1 ^ ) − 1 3 ( y 2 y 2 ^ − 1 − y 2 1 − y 2 ^ ) − 1 3 ( y 3 y 3 ^ − 1 − y 3 1 − y 3 ^ ) ]    ⟹    J = − 1 3 ( [ y 1 y 2 y 3 ] / [ y 1 ^ y 2 ^ y 3 ^ ] − [ 1 − y 1 1 − y 2 1 − y 3 ] / [ 1 − y 1 ^ 1 − y 2 ^ 1 − y 3 ^ ] ) ⟹ J = − 1 3 ( y _ t r u e y _ p r e d − 1 − y _ t r u e 1 − y _ p r e d ) \begin{aligned} \Longrightarrow J&=\begin{bmatrix}-\frac{1}{3}(\frac{y_1}{\widehat{y_1}}-\frac{1-y_1}{1-\widehat{y_1}})\\\\-\frac{1}{3}(\frac{y_2}{\widehat{y_2}}-\frac{1-y_2}{1-\widehat{y_2}})\\\\-\frac{1}{3}(\frac{y_3}{\widehat{y_3}}-\frac{1-y_3}{1-\widehat{y_3}})\end{bmatrix} \\ \implies J&=-\dfrac{1}{3}(\begin{bmatrix}y_1\\y_2\\y_3\end{bmatrix}/\begin{bmatrix}\widehat{y_1}\\\widehat{y_2}\\\widehat{y_3}\end{bmatrix}-\begin{bmatrix}1-y_1\\1-y_2\\1-y_3\end{bmatrix}/\begin{bmatrix}1-\widehat{y_1}\\1-\widehat{y_2}\\1-\widehat{y_3}\end{bmatrix}) \\ \Longrightarrow J&=-\frac13(\frac{y\_true}{y\_pred}-\frac{1-y\_true}{1-y\_pred}) \end{aligned} JJJ= 31(y1 y11y1 1y1)31(y2 y21y2 1y2)31(y3 y31y3 1y3) =31( y1y2y3 / y1 y2 y3 1y11y21y3 / 1y1 1y2 1y3 )=31(y_predy_true1y_pred1y_true)

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

# defining BCE gradients

def B_cross_E_grad(y_true, y_pred):
    N = y_true.shape[0]
    return -(y_true / y_pred - (1 - y_true) / (1 - y_pred)) / N

BCE的优缺点

😀优点:适用于多标签比如文章开头关于奥黛丽·赫本的例子)和二元分类问题

BCE loss over.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值