easy-algorithm-interview-an.../deep-learning/交叉熵损失函数(Cross Entropy Error...

3.2 KiB
Raw Permalink Blame History

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

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

其中N为样本个数。

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

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

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

二分类的交叉熵损失函数形式
\sum -y_ilog(\hat y_i) - (1-y_i)log(1-\hat y_i)
上面的y_i表示类别为1,\hat y_i表示预测类别为1的概率。

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

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

3.MSE与sigmoid函数不适合配合使用

MSE的loss为
MSE =- \frac{1}{N}(\hat y - y) ^ 2
如果其与sigmoid函数配合使用偏导数为
\frac{\partial Loss_i}{\partial w} = (y - \hat y) \sigma '(wx _i+ b)x_i
其中
\sigma '(wx _i+ b) = \sigma (wx _i+ b) (1 - \sigma (wx _i+ b))

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

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

交叉熵损失函数与sigmoid函数配合使用最终损失函数求导的结果为
\frac{\partial Loss_i}{\partial w} = (\hat y_i - y_i)x_i

由此可见,求导的结果与\hat y_i - y_ix_i的值有关,不会出现模型开始训练速度很慢的现象。

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

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

前面提到在神经网络中交叉熵损失函数经常与softmax配合使用。
Loss = - \sum_i t_i lny_i
softmax函数
y_i = \frac{e^i}{\sum_j e^j} = 1 - \frac{\sum_{j \neq i} e^j}{\sum_j e^j}

接下来求导

{\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}}

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

参考文献

1.https://blog.csdn.net/bitcarmanlee/article/details/51473567