通常而言,损失函数由损失项(loss term)和正则项(regularization term)组成。发现一份不错的介绍资料:
说明:
## 机器学习中常见的损失函数
一般来说,我们在进行机器学习任务时,使用的每一个算法都有一个目标函数,算法便是对这个目标函数进行优化,特别是在分类或者回归任务中,便是使用损失函数(Loss Function)作为其目标函数,又称为代价函数(Cost Function)。
损失函数是用来评价模型的预测值Y^=f(X)与真实值Y的不一致程度,它是一个非负实值函数。通常使用L(Y,f(x))来表示,损失函数越小,模型的性能就越好。
设总有N个样本的样本集为(X,Y)=(xi,yi),yi,i∈[1,N]为样本i的真实值,yi^=f(xi),i∈[1,N]为样本i的预测值,f为分类或者回归函数。 那么总的损失函数为:
常见的损失函数ℓ(yi,yi^)有以下几种: ### Zero-one Loss Zero-one Loss即0-1损失,它是一种较为简单的损失函数,如果预测值与目标值不相等,那么为1,否则为0,即:
可以看出上述的定义太过严格,如果真实值为1,预测值为0.999,那么预测应该正确,但是上述定义显然是判定为预测错误,那么可以进行改进为Perceptron Loss。
### Perceptron Loss Perceptron Loss即为感知损失。即:
其中t是一个超参数阈值,如在PLA([Perceptron Learning Algorithm,感知机算法](http://kubicode.me/2015/08/06/Machine%20Learning/Perceptron-Learning-Algorithm/))中取t=0.5。
### Hinge Loss Hinge损失可以用来解决间隔最大化问题,如在SVM中解决几何间隔最大化问题,其定义如下:
更多请参见:[Hinge-loss](https://en.wikipedia.org/wiki/Hinge_loss)。
### Log Loss 在使用似然函数最大化时,其形式是进行连乘,但是为了便于处理,一般会套上log,这样便可以将连乘转化为求和,由于log函数是单调递增函数,因此不会改变优化结果。因此log类型的损失函数也是一种常见的损失函数,如在LR([Logistic Regression, 逻辑回归](chrome-extension://ikhdkkncnoglghljlkmcimlnlhkeamad/pdf-viewer/web/viewer.html?file=https%3A%2F%2Fpeople.eecs.berkeley.edu%2F~russell%2Fclasses%2Fcs194%2Ff11%2Flectures%2FCS194%2520Fall%25202011%2520Lecture%252006.pdf))中使用交叉熵(Cross Entropy)作为其损失函数。即:
规定
### Square Loss Square Loss即平方误差,常用于回归中。即:
### Absolute Loss Absolute Loss即绝对值误差,常用于回归中。即:
### Exponential Loss Exponential Loss为指数误差,常用于boosting算法中,如[AdaBoost](https://en.wikipedia.org/wiki/AdaBoost)。即:
一般来说,对分类或者回归模型进行评估时,需要使得模型在训练数据上使得损失函数值最小,即使得经验风险函数最小化,但是如果只考虑经验风险(Empirical risk),容易过拟合(详细参见防止过拟合的一些方法),因此还需要考虑模型的泛化能力,一般常用的方法便是在目标函数中加上正则项,由损失项(Loss term)加上正则项(Regularization term)构成结构风险(Structural risk),那么损失函数变为:
其中λ是正则项超参数,常用的正则方法包括:L1正则与L2正则,详细介绍参见:防止过拟合的一些方法。
这是一个合页函数,也叫Hinge function,loss 函数反映的是我们对于当前分类结果的不满意程度。在这里,多分类的SVM,我们的损失函数的含义是这样的:对于当前的一组分数,对应于不同的类别,我们希望属于真实类别的那个分数比其他的类别的分数要高,并且最好要高出一个margin,这样才是安全的。反映在这个函数中,就是0的那一项的取值范围,Syi表示的是xi样本的真实类别所得到的分数,而Sj指的是其他的类别的分数,如果真实类别的分数是最大的,且大一个margin 1,那么就表示满意,也就是说不惩罚,这一项的loss为0。如果不满足这一条件,我们用下面的一段,也就是Sj - Syi + 1, 1在这里是一个常数,可以使得函数连续起来,这个Sj - Syi表示,Syi,也就是真实样本的分数比别的少的越多,我们越不满意,具体计算方式有下面这个栗子:
有时候我们也会用hinge function的平方项作为loss函数。
考虑到很多W都能满足零loss,那么如何在这些W中做出选择?
这里就需要对W进行选择,也就是正则,引出了经验风险损失和结构风险损失的概念,正则的概念众所周知,此略。
这里乱入一下各种正则化,关于正则化的相关问题留作以后整理。
就是常说的softmax的损失函数,通过将score变成probablity,从而每次只用计算属于正确的分类的那个概率,用对数最大似然的方法,将它变成prob == 1,也就是min -log 使其等于0 。
可以看出,如果类别标签是one-hot vector的话,那么实际上只对真实类别的一类进行求log并加负号。
但是,考虑到这一类的prob是由所有的logits的exp后的和归一化得来的,因此实际上还是对所有的score都有作用。相对于前面的SVM的hinge loss,可以这样对比描述:Hinge loss 对于那些对真实类别给分高的样本不进行过多奖励(loss小相当于奖励高),也就是说只要正确类别的分数比其他的大1以上,那么就认为这个score已经足够好了,这样就可以关注整体的loss,争取所有样本上表现都比较好。而softmax loss 是对概率分布进行优化,力图使所有的概率密度都向着正确分类样本上集中。
二分类问题的logistic回归的loss函数是:
可以看出,二类别的分类是多分类的一个特殊情况,因此也可以用softmax的方式来处理。但是二分类又是一个特例,因为它的类别不用写成one-hot vector,而是直接用0到1之间的一个数字就可以表示,接近1就是正例,接近0就是反例。所以符合上面的这个公式。这个公式可以看出,y=0,即真实标签为0的时候,第一项就没有了,loss变成-(1-y)ln(1-a),也就是-ln(1-a),a越接近0,loss越小;y=1时反之,这样就使得a越来越趋近于真实答案。
考虑到a是logistic方程的输出,x为输入,w是要优化的weights,a在0-1之间,如果我们把两个类别按照多分类的方式,写成one-hot vector的话,那么可以是[1, 0] 和 [0 ,1] ,那么用softmax输出的结果分别是[1-a, a],其中a接近0,这个向量就接近[1,0]也就是第一类,a接近1,向量接近第二类。用softmax写出来,就和上面的logistic二分类的loss一样了。
logistic回归的loss是可以通过最大似然取对数写出来的,这里假设样本的label,也就是类别服从Bernoulli分布。在【统计学习方法(李航)】一书中有推导过程,如下:
交叉熵的公式:
这个是来源于信息论的一个定义,表示的是用某个分布去编码另一个分布所需要的平均码长。
作为损失函数时,它可以用来度量两个分布的差异性,比如上述的 softmax 得到的概率分布,和one-hot的概率分布相比,差异性就可以用cross entropy来衡量。按照编码的规则,作为权重的p和在log里面的p两个分布分别代表着真实分布和用来编码的预测分布,这个函数越小,说明两个分布越相像。
用交叉熵损失函数的优势在于,可以避免MSE损失带来的梯度过小的问题。(mse求导后chain里面带着sigmoid的导数,这个导数在有的位置是接近于0的,也就是前面说的软饱和,而cross entropy的导数只和真实值和预测值的差异成正比,所以避免了这一问题。)