损失函数(Loss function)是用来估量你模型的预测值 f(x)与真实值 Y 的不一致程度,它是一个非负实值函数,通常用 L(Y,f(x))来表示。损失函数越小,模型的鲁棒性就越好。损失函数是经验风险函数的核心部分,也是结构风险函数的重要组成部分。模型的风险结构包括了风险项和正则项,通常如下所示:
前面的均值函数表示的是经验风险函数,L代表的是损失函数,后面的 Φ 是正则化项(regularizer)或者叫惩罚项penalty term,它可以是L1,也可以是L2,或者其他的正则函数。整个式子表示的意思是找到使目标函数最小时的θ值 。
一、常用损失函数
常见的损失误差有五种:
1. 合页、铰链损失(Hinge Loss):主要用于支持向量机(SVM) 中;
2. 平方损失(Square Loss):主要是最小二乘法;
3. 绝对值损失
4. 交叉熵损失 (Cross Entropy Loss,Softmax Loss ):用于Logistic回归与Softmax分类中;
5. 指数损失(Exponential Loss) :主要用于Adaboost 集成学习算法中;
6.Huber Loss (嘿呦波)是一个用于回归问题的带参损失函数, 优点是能增强平方误差损失函数(MSE, mean square error)对离群点的鲁棒性。Huber损失可以看做L2和L1损失的结合。
- 当预测偏差小于 δ 时,它采用平方误差,
- 当预测偏差大于 δ 时,采用的线性绝对值误差。
相比于最小二乘的线性回归,HuberLoss降低了对离群点的惩罚程度,所以 HuberLoss 是一种常用的鲁棒的回归损失函数。
smoothL1就是HuberLoss损失.Huber Loss 定义如下:https://www.cnblogs.com/nowgood/p/Huber-Loss.html
1、Hinge loss
Hinge loss 的叫法来源于其损失函数的图形,为一个折线,通用的函数表达式为:
表示样本真实分类,=-1表示负样本,=1表示正样本.Yi~表示预测的点到分离超平面的距离,当该距离大于1时,1与该距离做差为负值,此时损失为0,表示样本被被正确分类。反之,差值即为具体的损失.
Hing损失可以用来解间距最大化的问题,最有代表性的就是SVM问题,在支持向量机中,最初的SVM优化的函数:
将约束项进行变形,则为:
则损失函数可以进一步写为:
2、 均方误差MSE(也称L2损失)
最小二乘法是线性回归的一种,最小二乘的基本原则是:最优拟合直线应该是使各点到回归直线的距离和最小的直线,即平方和最小。平方损失(Square loss)的标准形式如下:
在实际应用中,我们使用均方差(L2)作为一项衡量指标,公式如下:
3、平均绝对值误差(也称L1损失)
4、交叉熵损失
交叉熵损失是基于softmax计算来的,softmax将网络最后输出z通过指数转变成概率形式。首先看一下softmax计算公式:
分子 是要计算的类别 的网络输出的指数;分母是所有类别网络输出的指数和,共k个类别。这样就得到了类别i的输出概率 。
实际上,softmax是由逻辑回归模型(用于二分类)推广得到的多项逻辑回归模型(用于多分类)。逻辑回归的P(Y=y|x)表达式如下(为了将类别标签y统一为1和0,下面将表达式分开表示):
逻辑回归损失函数如下:
交叉熵损失公式定义如下:
其中, 是类别 的真实标签;是上面softmax计算出的类别 的概率值;k是类别数,N是样本总数。
5、指数损失函数
AdaBoost就是损失函数为损失函数的。指数损失函数的标准形式:
体现在更新样本权重上:第一轮训练完成后对进行更新,得到,更新公式通过下边的公式来计算更新:
from:https://blog.csdn.net/qq_30815237/article/details/86540528
二、正则项
1. 权重衰减(weight decay)L2
L2正则化的目的就是为了让权重衰减到更小的值,在一定程度上减少模型过拟合的问题,所以权重衰减也叫L2正则化。L2正则化就是在代价函数后面再加上一个正则化项:
例如:就是在均方误差成本函数后加了L2正则,称为“岭回归”。
为什么可以对权重进行衰减
我们对加入L2正则化后的代价函数进行推导,先求导:
可以发现L2正则化项对b的更新没有影响,但是对于w的更新有影响:
在不使用L2正则化时,求导结果中w前系数为1,现在w前面系数为1-ηλ/n,因为η、λ、n都是正的,所以1-ηλ/n小于1,它的效果是减小w,这也就是权重衰减(weight decay)的由来。当然考虑到后面的导数项,w最终的值可能增大也可能减小。
另外,需要提一下,对于基于mini-batch的随机梯度下降,w和b更新的公式跟上面给出的有点不同:
,
后面那一项变了,变成所有导数加和,乘以η再除以m,m是一个mini-batch中样本的个数。
L2正则化项有让w变小的效果,可以避免模型过拟合问题,为什么w变小可以防止过拟合呢?
原理:(1)从模型的复杂度上解释:更小的权值w,从某种意义上说,表示网络的复杂度更低,对数据的拟合更好(这个法则也叫做奥卡姆剃刀),而在实际应用中,也验证了这一点,L2正则化的效果往往好于未经正则化的效果。
(2)从数学方面的解释:过拟合的时候,拟合函数的系数往往非常大,为什么?如下图所示,过拟合,就是拟合函数需要顾忌每一个点,最终形成的拟合函数波动很大。在某些很小的区间里,函数值的变化很剧烈。这就意味着函数在某些小区间里的导数值(绝对值)非常大,由于自变量值可大可小,所以只有系数足够大,才能保证导数值很大。而正则化是通过约束参数的范数使其不要太大,所以可以在一定程度上减少过拟合情况。
2、L1 正则
在原始的代价函数后面加上一个L1正则化项,即所有权重w的绝对值的和,乘以λ/n:
例如下式表示套索回归的成本函数:
同样先计算导数:
上式中sgn(w)表示符号函数,w为正,返回1,w为负,返回“-1”。
权重w的更新规则为:
比原始的更新规则多出了η * λ * sgn(w)/n这一项。当w为正时,更新后的w变小。当w为负时,更新后的w变大——因此它的效果就是让w往0靠,使网络中的权重尽可能为0,也就相当于减小了网络复杂度,防止过拟合。
当w为0时怎么办?当w等于0时,|W|是不可导的,所以我们只能按照原始的未经正则化的方法去更新w,这就相当于去掉η*λ*sgn(w)/n这一项,所以我们可以规定sgn(0)=0,这样就把w=0的情况也统一进来了。(在编程的时候,令sgn(0)=0, sgn(w>0)=1,sgn(w<0)=-1)
此外: 由于lasso回归的损失函数是不可导的,所以梯度下降算法将不再有效,可以使用利用坐标轴下降法进行求解。坐标轴下降法和梯度下降法具有同样的思想,都是沿着某个方向不断迭代,但是梯度下降法是沿着当前点的负梯度方向进行参数更新,而坐标轴下降法是沿着坐标轴的方向。
对于一个可微凸函数,其中为的向量,如果对于一个解,使得在某个坐标轴
上都能达到最小值,则就是的全局的最小值点。
3、Dropout
L1、L2正则化是通过修改代价函数来实现的,而Dropout则是通过修改神经网络本身来实现的,它是在训练网络时用的一种技巧(trike)。它的流程如下:
,
假设我们要训练上左图这个网络,在训练开始时,我们随机地“删除”一半的隐层单元,视它们为不存在,得到上右图的网络。保持输入输出层不变,按照BP算法更新上图神经网络中的权值(虚线连接的单元不更新,因为它们被“临时删除”了)。
以上就是一次迭代的过程,在第二次迭代中,也用同样的方法,只不过这次删除的那一半隐层单元,跟上一次删除掉的肯定是不一样的,因为我们每一次迭代都是“随机”地去删掉一半。第三次、第四次……都是这样,直至训练结束。
Dropout为什么有助于防止过拟合呢?可以简单地这样解释,运用了dropout的训练过程,相当于训练了很多个只有半数隐层单元的神经网络(后面简称为“半数网络”),每一个这样的半数网络,都可以给出一个分类结果,这些结果有的是正确的,有的是错误的。随着训练的进行,大部分半数网络都可以给出正确的分类结果,那么少数的错误分类结果就不会对最终结果造成大的影响。
4、数据集扩增
特别是在深度学习方法中,更多的训练数据,意味着可以用更深的网络,训练出更好的模型。但是,收集更多的数据意味着需要耗费更多的人力物力,有弄过人工标注的同学就知道,效率特别低,简直是粗活。所以,可以在原始数据上做些改动,得到更多的数据,以图片数据集举例,可以做各种变换,如:
- 将原始图片旋转一个小角度
- 添加随机噪声
- 一些有弹性的畸变(elastic distortions),对MNIST做了各种变种扩增。
- 截取(crop)原始图片的一部分。比如DeepID中,从一副人脸图中,截取出了100个小patch作为训练数据,极大地增加了数据集。
更多数据意味着什么?
用50000个MNIST的样本训练SVM得出的accuracy94.48%,用5000个MNIST的样本训练NN得出accuracy为93.24%,所以更多的数据可以使算法表现得更好。在机器学习中,算法本身并不能决出胜负,不能武断地说这些算法谁优谁劣,因为数据对算法性能的影响很大。
from:https://www.jianshu.com/p/ffb6808d54cd
学习率衰减:
学习率衰减(learning rate decay)就是一种可以平衡这两者之间矛盾的解决方案。学习率衰减的基本思想是:学习率随着训练的进行逐渐衰减。
学习率衰减基本有两种实现方法:
- 线性衰减。例如:每过5个epochs学习率减半。
- 指数衰减。例如:随着迭代轮数的增加学习率自动发生衰减,每过5个epochs将学习率乘以0.9998。具体算法如下:
decayed_learning_rate=learning_rate*decay_rate^(global_step/decay_steps)
其中decayed_learning_rate为每一轮优化时使用的学习率,learning_rate为事先设定的初始学习率,decay_rate为衰减系数,decay_steps为衰减速度。