0%

交叉熵损失函数

交叉熵损失函数(逻辑回归):
$$
J(\theta)=-\frac{1}{N}\sum_{i=1}^{N}y^{(i)}log(h_\theta(x^{(i)}))+(1-y^{(i)})log(1-h_\theta(x^{(i)}))
$$
$J(\theta)$对$\theta$的偏导数(用于诸如梯度下降法等优化算法的参数更新):
$$\frac{\partial}{\partial\theta_j}J(\theta)=\frac{1}{N}\sum_{i=1}^{N}(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}$$

1. 交叉熵损失函数的数学原理

在二分类问题模型中,真实样本的标签为$[0,1]$,分别表示负类和正类。模型的最后通常会经过一个Sigmoid函数,输出一个概率值,这个概率值反映了预测为正类的可能性。
Sigmod函数的输出表征了当前样本标签为1的概率:
$$ \hat{y}=P(y=1 \mid x)$$
对于样本标签为0的概率可以表达为:
$$ 1-\hat{y}=P(y=0\mid x)$$
从极大似然性的角度将上面两个公式进行融合得到:
$$ P(y\mid x)=\hat{y}^y\cdot(1-\hat{y})^{1-y}$$
真实标签为1或者0时,依据上式可分别得到:
$$
P(y=1 \mid x)=\hat{y}\\
P(y=0\mid x)=1-\hat{y}
$$
两种情况下概率表达式完全一样。

对于$P(y \mid x)$,我们希望其越大越好。因为$log$运算不会影响函数本身的单调性,所以,对$P(y \mid x)$进行对数运算。则有:
$$
\begin {aligned}
log(P(y\mid x))&=log(\hat{y}^y\cdot(1-\hat{y})^{1-y})\\
&=ylog(\hat{y})+(1-y)log(1-\hat{y})
\end {aligned}
$$
我们希望 $log(P(y \mid x))$越大越好,即$-log(P(y \mid x))$越小越好。对于N个样本的总的损失函数为:
$$ loss=-\frac{1}{N}\sum_{i=1}^{N}y^{(i)}log(\hat{y}^{(i)})+(1-y^{(i)})log(1-\hat{y}^{(i)})$$

2. 交叉熵损失函数求导

我们一共有N组样本,$(x^{(i)},y^{(i)})$表示第$i$组样本及其对应的类别标记。其中,$x^{(i)}=(1,x_1^{(i)},x_2^{(i)},…,x_m^{(i)})^T$,$y^{(i)}$为表示类别的数值。

  • logistic回归(二分类问题)中,$y^{(i)}$取0或1;
  • softmax回归(多分类问题)中,$y^{(i)}$取值为$1~k$中的一个值表示一个类别

输入样本数据$x^{(i)}=(1,x_1^{(i)},x_2^{(i)},…,x_m^{(i)})^T$,$y^{(i)}$,模型参数为$\theta=(\theta_0,\theta_1,\theta_3,…,\theta_m)^T$,因此有:
$$ \theta^Tx^{(i)}:=\theta_0+\theta_1x_1^{(i)}+…+\theta_mx_m^{(i)}$$
假设函数(hypothesis function)定义为:
$$ h_\theta(x^{(i)})=\frac{1}{1+e^{-\theta^Tx^{(i)}}}$$
用对于第一节得出的损失函数$ h_\theta(x^{(i)})$取代$\hat{y}^{(i)}$,就可以得到在机器学习中常见的交叉熵损失函数的表达式:
$$ J(\theta)=-\frac{1}{N}\sum_{i=1}^{N}y^{(i)}log(h_\theta(x^{(i)}))+(1-y^{(i)})log(1-h_\theta(x^{(i)}))$$
$J(\theta)$对$\theta$的偏导数涉及到矩阵和向量的倒数,对于交叉熵损失函数$J(\theta)$,其中:
$$ log(h_\theta(x^{(i)}))=log\frac{1}{1+e^{-\theta^Tx^{(i)}}}=-log(1+e^{-\theta^Tx^{(i)}})$$
$$
\begin {aligned}
log(1-h_\theta(x^{(i)}))&=log(1-\frac{1}{1+e^{-\theta^Tx^{(i)}}})\\
&=log\frac{e^{-\theta^Tx^{(i)}}}{1+e^{-\theta^Tx^{(i)}}}\\
&=log(e^{-\theta^Tx^{(i)}})-log(1+e^{-\theta^Tx^{(i)}})\\
&=-\theta^Tx^{(i)}-log(1+e^{-\theta^Tx^{(i)}})
\end {aligned}
$$
由此可以得到:
$$
\begin{aligned}
J(\theta)&=-\frac{1}{N}\sum_{i=1}^{N}[-y^{(i)}(log(1+e^{-\theta^Tx^{(i)}}))+(1-y^{(i)})(-\theta^Tx^{(i)}-log(1+e^{-\theta^Tx^{(i)}}))]\\
&=-\frac{1}{N}\sum_{i=1}^{N}[y^{(i)}\theta^Tx^{(i)}-\theta^Tx^{(i)}-log(1+e^{-\theta^Tx^{(i)}})]\\
&=-\frac{1}{N}\sum_{i=1}^{N}[y^{(i)}\theta^Tx^{(i)}-log(e^{\theta^Tx^{(i)}})-log(1+e^{-\theta^Tx^{(i)}})]\\
&=-\frac{1}{N}\sum_{i=1}^{N}[y^{(i)}\theta^Tx^{(i)}-log(1+e^{\theta^Tx^{(i)}})]
\end{aligned}
$$
再计算$J(\theta)$对$\theta_j$的偏导数:
$$
\begin{aligned}
\frac{\partial}{\partial\theta_j}J(\theta)&=\frac{\partial}{\partial\theta_j}(\frac{1}{N}\sum_{i=1}^{N}[log(1+e^{\theta^Tx^{(i)}})-y^{(i)}\theta^Tx^{(i)}])\\
&=\frac{1}{N}\sum_{i=1}^{N}[\frac{\partial}{\partial\theta_j}log(1+e^{\theta^Tx^{(i)}})-\frac{\partial}{\partial\theta_j}(y^{(i)}\theta^Tx^{(i)})]\\
&=\frac{1}{N}\sum_{i=1}^{N}[\frac{x_j^{(i)}e^{\theta^Tx^{(i)}}}{1+e^{\theta^Tx^{(i)}}}-y^{(i)}x_j^{(i)}]\\
&=\frac{1}{N}\sum_{i=1}^{N}(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}
\end{aligned}
$$

3.为什么用交叉熵作为损失函数

在深度学习中,我们常用的损失函数是二次函数$L=\frac{(y-\hat{y})^2}{2}$,若激活函数使用的是sigmoid函数,则$\hat{y}=\sigma(z)$,其中$z=wx+b$。采用链式法则求导则有:
$$
\frac{\partial L}{\partial w}=(\hat{y}-y)\sigma(z)’x\\
\frac{\partial L}{\partial b}=(\hat{y}-y)\sigma(z)’
$$
由上面两个式子可以看出,损失函数的梯度都与sigmoid函数的梯度有关,而simoid函数的两端存在梯度消失问题。

使用交叉熵作为损失函数,其倒数形式为:
$$
\frac{\partial L}{\partial w}=\frac{1}{N}\sum_i{x(\sigma(z)-y)}\\
\frac{\partial L}{\partial b}=\frac{1}{N}\sum_i{(\sigma(z)-y)}
$$
使用交叉熵作为损失函数,其反向传播梯度与sigmoid函数的梯度无关,从而避免了梯度消失的问题。

参考文献 & 资源链接