二元交叉熵损失(BCE loss)—特殊的CCE损失
什么是二元交叉熵损失?
假如我问你:对于下列图片,以下哪些描述是正确的?

- 她是奥黛丽·赫本。
- 她饰演电影《罗马假日》的女主:安妮公主。
- 她是玛丽莲·梦露。
- 她在电影《罗马假日》中扮演一位公主。
我们知道正确的答案是:
y_true=[1101] y\_\text{true}=\begin{bmatrix}1\\\\1\\\\0\\\\1\end{bmatrix} y_true=1101
假设我们不知道正确答案,我们根据以下概率猜测:
y_pred=[0.90.950.70.75] y\_\text{pred}=\begin{bmatrix}0.9\\\\0.95\\\\0.7\\\\0.75\end{bmatrix} y_pred=0.90.950.70.75
我们可以发现,y_truey\_\text{true}y_true和y_predy\_\text{pred}y_pred中的每一个元素都是一个独立问题的答案,因此y_truey\_\text{true}y_true和y_predy\_\text{pred}y_pred中所有元素的和不需要为1
。
在判断时,我们可以设置一个门限TTT,比如说T=0.8T=0.8T=0.8。若y_predi≥Ty\_\text{pred}_{i}\geq Ty_predi≥T,则第iii个描述被认为是对的;若y_predi<Ty\_\text{pred}_{i}< Ty_predi<T,则第iii个描述被认为是错误的。这个门限的选取对判断谁对谁错具有重要的影响。
假设我们有真实值:
y_true=y=[y1y2y3] y\_\text{true}=y=\begin{bmatrix}y_1\\y_2\\y_3\end{bmatrix} y_true=y=y1y2y3
和预测值:
y_pred=y^=[y1^y2^y3^] y\_\text{pred}=\widehat{y}=\begin{bmatrix}\widehat{y_1}\\\widehat{y_2}\\\widehat{y_3}\end{bmatrix} y_pred=y=y1y2y3
二元交叉熵(Binary Cross-Entropy)损失可以写为:
BCE=−1N∑i=1i=N[y_truei⋅log(y_predi)+(1−y_truei)⋅log(1−y_predi)]BCE=−1N∑i=1i=N[yi⋅log(yi^)+(1−yi)⋅log(1−yi^)] ⟹ BCE=−13[y1⋅log(y1^)+(1−y1)⋅log(1−y1^)+y2⋅log(y^2)+(1−y2)⋅log(1−y^2)+y3⋅log(y3^)+(1−y3)⋅log(1−y3^)] \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=1∑i=N[y_truei⋅log(y_predi)+(1−y_truei)⋅log(1−y_predi)]N1i=1∑i=N[yi⋅log(yi)+(1−yi)⋅log(1−yi)]31[y1⋅log(y1)+(1−y1)⋅log(1−y1)+y2⋅log(y2)+(1−y2)⋅log(1−y2)+y3⋅log(y3)+(1−y3)⋅log(1−y3)]
其中,‘3’代表y_truey\_\text{true}y_true和y_predy\_\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_truey\_\text{true}y_true固定,BCE
的值与y_predy\_\text{pred}y_pred有关,也即与(y1^,y2^,y3^)(\widehat{y_1},\widehat{y_2},\widehat{y_3})(y1,y2,y3)有关。
BCE=f(y1^,y2^,y3^) BCE = f(\widehat{y_1},\widehat{y_2},\widehat{y_3}) BCE=f(y1,y2,y3)
BCE
的Jacobian
矩阵(函数的一阶偏导数以一定方式排列而成的矩阵)为:
J=∂(BCE)(y1^,y2^,y3^)=[∂(BCE)∂(y1^)∂(BCE)∂(y2^)∂(BCE)∂(y3^)] 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=[−13(y1y1^−1−y11−y1^)−13(y2y2^−1−y21−y2^)−13(y3y3^−1−y31−y3^)] ⟹ J=−13([y1y2y3]/[y1^y2^y3^]−[1−y11−y21−y3]/[1−y1^1−y2^1−y3^])⟹J=−13(y_truey_pred−1−y_true1−y_pred) \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} ⟹J⟹J⟹J=−31(y1y1−1−y11−y1)−31(y2y2−1−y21−y2)−31(y3y3−1−y31−y3)=−31(y1y2y3/y1y2y3−1−y11−y21−y3/1−y11−y21−y3)=−31(y_predy_true−1−y_pred1−y_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.