交叉熵损失函数(Cross Entropy Error Function)与均方差损失函数(Mean Squared Error)

时间:2024-11-09 08:23:12

项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

1.均方差损失函数(Mean Squared Error)

均方差损失函数是预测数据和原始数据对应点误差的平方和的均值。计算方式也比较简单
M S E = 1 N ( y ^ − y ) 2 MSE = \frac{1}{N}(\hat y - y) ^ 2 MSE=N1(y^y)2

其中,N为样本个数。

2.交叉熵损失函数(Cross Entropy Error Function)

在分类问题中,尤其是在神经网络中,交叉熵函数非常常见。因为经常涉及到分类问题,需要计算各类别的概率,所以交叉熵损失函数又都是与sigmoid函数或者softmax函数成对出现。

比如用神经网络最后一层作为概率输出,一般最后一层神经网络的计算方式如下:
1.网络的最后一层得到每个类别的scores。
与sigmoid函数或者softmax函数进行计算得到概率输出。
3.第二步得到的类别概率与真实类别的one-hot形式进行交叉熵计算。

二分类的交叉熵损失函数形式
∑ − y i l o g ( y ^ i ) − ( 1 − y i ) l o g ( 1 − y ^ i ) \sum -y_ilog(\hat y_i) - (1-y_i)log(1-\hat y_i) yilog(y^i)(1yi)log(1y^i)
上面的 y i y_i yi表示类别为1, y ^ i \hat y_i y^i表示预测类别为1的概率。

而多分类的交叉熵损失函数形式为
− ∑ i = 1 n y i l o g ( y ^ i ) -\sum_{i=1} ^n y_i log(\hat y_i) i=1nyilog(y^i)

上面的式子表示类别有n个。单分类问题的时候,n个类别是one-hot的形式,只有一个类别 y i = 1 y_i=1 yi=1,其他n-1个类别为0。

与sigmoid函数不适合配合使用

MSE的loss为
M S E = − 1 N ( y ^ − y ) 2 MSE =- \frac{1}{N}(\hat y - y) ^ 2 MSE=N1(y^y)2
如果其与sigmoid函数配合使用,偏导数为
∂ L o s s i ∂ w = ( y − y ^ ) σ ′ ( w x i + b ) x i \frac{\partial Loss_i}{\partial w} = (y - \hat y) \sigma '(wx _i+ b)x_i wLossi=(yy^)σ(wxi+b)xi
其中
σ ′ ( w x i + b ) = σ ( w x i + b ) ( 1 − σ ( w x i + b ) ) \sigma '(wx _i+ b) = \sigma (wx _i+ b) (1 - \sigma (wx _i+ b)) σ(wxi+b)=σ(wxi+b)(1σ(wxi+b))

于是,在 σ ( w x i + b ) \sigma (wx _i+ b) σ(wxi+b)的值接近0或者1的时候,其导数都接近0。这样会导致模型一开始的学习速度非常慢,所以MSE一般不会与sigmoid函数配合使用。

4.交叉熵损失函数与sigmoid函数配合使用

交叉熵损失函数与sigmoid函数配合使用,最终损失函数求导的结果为
∂ L o s s i ∂ w = ( y ^ i − y i ) x i \frac{\partial Loss_i}{\partial w} = (\hat y_i - y_i)x_i wLossi=(y^iyi)xi

由此可见,求导的结果与 y ^ i − y i \hat y_i - y_i y^iyi x i x_i xi的值有关,不会出现模型开始训练速度很慢的现象。

具体的推导过程见参考文献1
交叉熵损失函数求导

5.交叉熵损失函数与softmax函数配合使用

前面提到,在神经网络中,交叉熵损失函数经常与softmax配合使用。
L o s s = − ∑ i t i l n y i Loss = - \sum_i t_i lny_i Loss=itilnyi
softmax函数
y i = e i ∑ j e j = 1 − ∑ j ≠ i e j ∑ j e j y_i = \frac{e^i}{\sum_j e^j} = 1 - \frac{\sum_{j \neq i} e^j}{\sum_j e^j} yi=jejei=1jejj=iej

接下来求导

∂ L o s s i ∂ i = − ∂ l n y i ∂ i = − ∑ j e j e i ⋅ ∂ ( e i ∑ j e j ) ∂ i = − ∑ j e j e i ⋅ ( − ∑ j ≠ i e j ) ⋅ ∂ ( 1 ∑ j e j ) ∂ i = ∑ j e j ⋅ ∑ j ≠ i e j e i ⋅ − e i ( ∑ j e j ) 2 = − ∑ j ≠ i e j ∑ j e j = − ( 1 − e i ∑ j e j ) = y i − 1 {\begin{aligned} \frac{\partial Loss_i}{\partial _i} & = - \frac{\partial ln y_i}{\partial _i} \\ & = -\frac{\sum_j e^j}{e^i} \cdot \frac {\partial (\frac{e_i}{\sum_j e^j})}{\partial_i} \\ & = -\frac{\sum_j e^j}{e^i} \cdot (- \sum _ {j \neq i}e^j ) \cdot \frac{\partial( \frac {1} {\sum_j e^j} ) } { \partial _i} \\ & = \frac { \sum_j e^j \cdot \sum_{j \neq i} e^j} {e^i } \cdot \frac { - e^i} { (\sum_j e^j) ^ 2} \\ & = -\frac { \sum_{j \neq i} e^j } { \sum_j e^j } \\ & = -(1 - \frac{ e ^ i } { \sum_j e^j } ) \\ & = y_i - 1 \end{aligned}} iLossi=ilnyi=eijeji(jejei)=eijej(j=iej)i(jej1)=eijejj=iej(jej)2ei=jejj=iej=(1jejei)=yi1

由此可见,交叉熵函数与softmax函数配合,损失函数求导非常简单!

参考文献

:///bitcarmanlee/article/details/51473567