【知识】常见损失函数

常见损失函数其实不多:MSE均方误差,交叉熵,对数损失,hingeLoss,BPRLoss等。

MSE均方误差

MSE其实很简单:

\[MSELoss = \frac{1}{2N}\sum\limits_{i=1}^N ||y-\hat{y}||^2 \]

一般作为回归问题的损失,作为二分类问题的损失函数会有梯度消失的问题,后面有提到。

交叉熵

交叉熵和logloss对数损失是等价的。概念定义的出发点可能不同,这里我们就不细究了。

\[cross-entropy loss: H(y) = -\sum y_i log\hat{y}_i \]

其中,yi是true label,y^i则是预测输出的概率,i则代表类别数,比如二分类,yi则从{0,1}中不放回取值,之后求交叉熵求和。多分类则一般将y处理为one-hot(单标签)/multi-hot(多标签)编码,位数为class_num,然后yi对应其中每位。
多分类情况下,交叉熵的yi则应是onehot之后的。
在tf中应用时,发现并没有现成的cross_entropy可用,只有softmax_cross_entropy和sigmoid_cross_entropy。这两个就是softmax+cross_entropy 和 sigmoid+cross_entropy.然后softmax这个只能做多分类单标签。sigmoid则可以做多分类多标签(一个样本可以对应多个类)。具体参考深度学习原理:交叉熵cross-entropy

指数损失函数

\[L(y,f(x))=\frac{1}{n}\sum_ie^{-y_if(x_i)} \]

Adaboost算法就使用类指数损失函数。

Hinge Loss 合页损失

\[L(y,f(x))=\frac{1}{N}max(0,1-y_if(x_i)) \]

其中y是label,{-1,+1}。f(x)是预测值,[-1,1]。不鼓励 |y|>1,即让某个样本能够正确分类就可以了。

其他损失函数

0-1损失函数

\[L(y,f(x)) = y==f(x)?0:1 \]

绝对值损失函数

\[L(y,f(x)) = |y-f(x)| \]

常见面试问题:

MSE为什么不能作为二分类问题的损失函数?

因为这样会产生梯度消失。数学推导如下:

\[MSELoss = \sum\limits_i^N(y_i-\sigma(wx_i))^2,\,\, \sigma(wx_i)=\frac{1}{1+e^{-wx_i}} \]

\[\frac{\partial MSELoss(w)}{\partial w}= \sum\limits_i^N 2(y_i-\sigma(wx_i))(1-\sigma(wx_i))\sigma(wx_i)(-x_i)= \sum\limits_i^N -2(y_i-\sigma(wx_i))(1-\sigma(wx_i))\sigma(wx_i)x_i \]

因为\(\sigma(wx_i)\)的优化目标是接近\(y_i\)
所以\(\sigma(wx_i)\)\((1-\sigma(wx_i))\)中的一个也会越来越接近0,也就是递加项大概率接近0,从而导致梯度消失。
而由逻辑回归推导得,交叉熵的梯度:

\[\frac{\partial CrossEntropyL(w)}{\partial w} = =\sum\limits_{i=1}^N[x_i(1-\sigma(w^Tx_i)-y_i)] \]

就没有这个问题。

参考文献

http://sofasofa.io/forum_main_post.php?postid=1001792

posted @ 2019-04-01 20:01  大胖子球花  阅读(279)  评论(0)    收藏  举报