过度的拟合了训练数据, 而没有考虑到泛化能力。
模型在训练集上表现很好,但是在交叉验证集上表现先好后差。 这也正是过拟合的特征!
发生过拟合的主要原因可以有以下三点:
(1) 数据有噪声
(2) 训练数据不足, 有限的训练数据
(3) 训练模型过度导致模型非常复杂
防止过拟合:
1、减少特征属性
防止过度训练,使训练集对真实数据有更多的容忍度
2、增大样本数量
增加更多的样本数据,使拟合更精确
3、使用正则化
加入惩罚性(权重),减少测试结果对整体结果的影响
4、引入随机量(集成学习)
使样本多样化
L1范数:
当p=1时,是L1范数,其表示某个向量中所有元素绝对值之和
L2范数:
当p=2时,是L2范数,表示某个向量中所有元素平方和再开根,即欧氏距离
对模型参数w的L1正则项为
Ω ( θ ) = ∣ ∣ w ∣ ∣ 1 = ∑ i ∣ w i ∣ Ω(θ)=||w||_1 =\sum_{i}|w_i| Ω(θ)=∣∣w∣∣1=i∑∣wi∣
设带L1正则化的损失函数:
J = J 0 + α ∣ ∣ w ∣ ∣ 1 J=J_0+α||w||_1 J=J0+α∣∣w∣∣1
对模型参数w的L2正则项为
Ω ( θ ) = α ∣ ∣ w ∣ ∣ 2 2 \Omega(\theta)=\alpha||w||_2^2 Ω(θ)=α∣∣w∣∣22
即权重向量w中各个元素的平方和,α通常取1/2
设带L2正则化的损失函数:
J = J 0 + α ∣ ∣ w ∣ ∣ 2 2 J=J_0+\alpha||w||_2^2 J=J0+α∣∣w∣∣22
上面提到L1正则化有助于生成一个稀疏权值矩阵,进而可以用于特征选择。为什么要生成一个稀疏矩阵?
稀疏矩阵指的是很多元素为0,只有少数元素是非零值的矩阵,即得到的线性回归模型的大部分系数都是0. 通常机器学习中特征数量很多,在预测和分类,太多特征无从选择,用稀疏模型表示,只有少数特征对模型有贡献,系数是0的特征没有太大贡献。
对于L2,由于是均方误差,如果误差>1的话,那么平方后,相比L-norm而言,误差就会被放大很多。因此模型会对样例更敏感。
####L1 regularization
在原始的代价函数后面加上一个L1正则化项,即所有权重w的绝对值的和,乘以λ/n(这里不像L2正则化项那样,需要再乘以1/2,具体原因上面已经说过。)
C = C 0 + λ n ∑ w ∣ w ∣ C=C_0+\frac{\lambda}{n}\sum_{w}|w| C=C0+nλw∑∣w∣
同样先计算导数:
∂ C ∂ w = ∂ C 0 ∂ w + λ n s g n ( w ) \frac{\partial C}{\partial w} = \frac{\partial C_0}{\partial w} +\frac{\lambda}{n}sgn(w) ∂w∂C=∂w∂C0+nλsgn(w)
上式中sgn(w)表示w的符号。那么权重w的更新规则为:
比原始的更新规则多出了 η ∗ λ ∗ s g n ( w ) n \frac{η * λ * sgn(w)}{n} nη∗λ∗sgn(w)这一项,看 w − η ∗ λ ∗ s g n ( w ) n w - \frac{η * λ * sgn(w)}{n} w−nη∗λ∗sgn(w)这一项当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)
####L2 regularization(权重衰减)
L2正则化就是在代价函数后面再加上一个正则化项:
C = C 0 + λ 2 n ∑ w ∣ ∣ w ∣ ∣ 2 C=C_0+\frac{\lambda}{2n}\sum_{w}||w||^2 C=C0+2nλw∑∣∣w∣∣2
C0代表原始的代价函数,后面那一项就是L2正则化项,它是这样来的:所有参数w的平方的和,除以训练集的样本大小n。λ就是正则项系数,权衡正则项与C0项的比重。另外还有一个系数1/2,1/2经常会看到,主要是为了后面求导的结果方便,后面那一项求导会产生一个2,与1/2相乘刚好凑整。
L2正则化项是怎么避免overfitting的呢?我们推导一下看看,先求导:
∂ C ∂ w = ∂ C 0 ∂ w + λ n w ∂ C ∂ b = ∂ C 0 ∂ b \frac{\partial C}{\partial w} = \frac{\partial C_0}{\partial w} +\frac{\lambda}{n}w \\ \frac{\partial C}{\partial b} = \frac{\partial C_0}{\partial b} ∂w∂C=∂w∂C0+nλw∂b∂C=∂b∂C0
可以发现L2正则化项对b的更新没有影响,但是对于w的更新有影响:
在不使用L2正则化时,求导结果中w前系数为1,现在w前面系数为 1−ηλ/n ,因为η、λ、n都是正的,所以 1−ηλ/n小于1,它的效果是减小w,这也就是权重衰减(weight decay)的由来。当然考虑到后面的导数项,w最终的值可能增大也可能减小。
到目前为止,我们只是解释了L2正则化项有让w“变小”的效果,但是还没解释为什么w“变小”可以防止overfitting?一个所谓“显而易见”的解释就是:更小的权值w,从某种意义上说,表示网络的复杂度更低,对数据的拟合刚刚好(这个法则也叫做奥卡姆剃刀),而在实际应用中,也验证了这一点,L2正则化的效果往往好于未经正则化的效果。当然,对于很多人(包括我)来说,这个解释似乎不那么显而易见,所以这里添加一个稍微数学一点的解释(引自知乎):
过拟合的时候,拟合函数的系数往往非常大,为什么?如下图所示,过拟合,就是拟合函数需要顾忌每一个点,最终形成的拟合函数波动很大。在某些很小的区间里,函数值的变化很剧烈。这就意味着函数在某些小区间里的导数值(绝对值)非常大,由于自变量值可大可小,所以只有系数足够大,才能保证导数值很大。
而正则化是通过约束参数的范数使其不要太大,所以可以在一定程度上减少过拟合情况。
下图是推导过程:
正则化内容来自https://blog.csdn.net/u012162613/article/details/44261657,很感谢!
损失函数由损失项(loss term)和正则项(regularization term)组成:
通常机器学习每一个算法中都会有一个目标函数,算法的求解过程是通过对这个目标函数优化的过程。在分类或者回归问题中,通常使用损失函数(代价函数)作为其目标函数。损失函数用来评价模型的预测值和真实值不一样的程度,损失函数越好,通常模型的性能越好。不同的算法使用的损失函数不一样。
损失函数分为经验风险损失函数和结构风险损失函数。经验风险损失函数指预测结果和实际结果的差别,结构风险损失函数是指经验风险损失函数加上正则项。通常表示为如下:
θ ∗ = a r g m i n 1 N ∑ i = 1 N L ( y i , f ( x i ; θ i ) ) + λ Φ ( θ ) \theta ^{*}=argmin\frac{1}{N}\sum_{i=1}^{N}L(y_{i},f(x_{i};\theta_{i} ))+\lambda \Phi (\theta ) θ∗=argminN1i=1∑NL(yi,f(xi;θi))+λΦ(θ)
感知机就是用的这种损失函数。但是由于相等这个条件太过严格,因此我们可以放宽条件,即满足 |Y−f(X)|< T时认为相等。
L ( Y , f ( X ) ) = { 1 , ∣ Y − f ( X ) ∣ ≥ T 0 , ∣ Y = f ( X ) ∣ < T L(Y,f(X))=\left\{\begin{matrix} 1, |Y-f(X)|\geq T\\ 0, |Y=f(X)|
绝对值损失函数为:
L ( Y , f ( X ) = ∣ Y − f ( X ) ∣ L(Y,f(X)=|Y-f(X)| L(Y,f(X)=∣Y−f(X)∣
2. log对数损失函数
逻辑斯特回归的损失函数就是对数损失函数,在逻辑斯特回归的推导中,它假设样本服从伯努利分布(0-1)分布,然后求得满足该分布的似然函数,接着用对数求极值。逻辑斯特回归并没有求对数似然函数的最大值,而是把极大化当做一个思想,进而推导它的风险函数为最小化的负的似然函数。从损失函数的角度上,它就成为了log损失函数。
log损失函数的标准形式:
L ( Y , P ( Y ∣ X ) ) = − l o g P ( Y ∣ X ) L(Y, P(Y|X)) = -logP(Y|X) L(Y,P(Y∣X))=−logP(Y∣X)
在极大似然估计中,通常都是先取对数再求导,再找极值点,这样做是方便计算极大似然估计。损失函数L(Y,P(Y|X))是指样本X在分类Y的情况下,使概率P(Y|X)达到最大值(利用已知的样本分布,找到最大概率导致这种分布的参数值)
3. 平方损失函数
最小二乘法是线性回归的一种方法,它将回归的问题转化为了凸优化的问题。最小二乘法的基本原则是:最优拟合曲线应该使得所有点到回归直线的距离和最小。通常用欧几里得距离进行距离的度量。平方损失的损失函数为:
L ( Y ∣ f ( X ) ) = ∑ N ( Y − f ( X ) ) 2 L(Y|f(X)) = \sum_{N}(Y - f(X))^{2} L(Y∣f(X))=N∑(Y−f(X))2
这个式子和如下的式子非常像:
1 m ∑ i = 1 m l ( w x i + b y i ) + ∣ ∣ w ∣ ∣ 2 \frac{1}{m}\sum_{i=1}^{m}l(wx_{i}+by_{i})+||w||^{2} m1i=1∑ml(wxi+byi)+∣∣w∣∣2
其中l(wxi+byi)就是hinge损失函数,后面相当于L2正则项。
Hinge函数的标准形式:
L ( y ) = m a x ( 0 , 1 − t y ) L(y)=max(0,1-ty) L(y)=max(0,1−ty)
y是预测值,在-1到+1之间,t为目标值(-1或+1)。其含义为,y的值在-1和+1之间就可以了,并不鼓励|y|>1,即并不鼓励分类器过度自信,让某个正确分类的样本的距离分割线超过1并不会有任何奖励,从而使分类器可以更专注于整体的分类误差。
从学习任务的类型出发,广义上可以将损失函数分为两大类,回归损失和分类损失
顾名思义,均方误差(MSE)度量的是预测值和实际观测值间差的平方的均值。它只考虑误差的平均大小,不考虑其方向。但由于经过平方,与真实值偏离较多的预测值会比偏离较少的预测值受到更为严重的惩罚。再加上 MSE 的数学特性很好,这使得计算梯度变得更容易。
公式:
M S E = ∑ i = 1 n ( y i − y ^ i ) 2 N MSE=\frac{\sum_{i=1}^{n}{(y_i-\hat y_i{})^2}}{N} MSE=N∑i=1n(yi−y^i)2
平均绝对误差(MAE)度量的是预测值和实际观测值之间绝对差之和的平均值。和 MSE 一样,这种度量方法也是在不考虑方向的情况下衡量误差大小。但和 MSE 的不同之处在于,MAE 需要像线性规划这样更复杂的工具来计算梯度。此外,MAE 对异常值更加稳健,因为它不使用平方。
公式:
M A E = ∑ i = 1 n ∣ y i − y ^ i ∣ N MAE=\frac{\sum_{i=1}^{n}{|y_i-\hat y_i{}|}}{N} MAE=N∑i=1n∣yi−y^i∣
与其它损失函数相比,这个函数在机器学习领域没有那么常见。它与 MAE 相似,唯一的区别是这个函数没有用绝对值。用这个函数需要注意的一点是,正负误差可以互相抵消。尽管在实际应用中没那么准确,但它可以确定模型存在正偏差还是负偏差。
公式:
M A E = ∑ i = 1 n ( y i − y ^ i ) N MAE=\frac{\sum_{i=1}^{n}{(y_i-\hat y_i{})}}{N} MAE=N∑i=1n(yi−y^i)
简言之,在一定的安全间隔内(通常是 1),正确类别的分数应高于所有错误类别的分数之和。因此 hinge loss 常用于最大间隔分类(maximum-margin classification),最常用的是支持向量机。尽管不可微,但它是一个凸函数,因此可以轻而易举地使用机器学习领域中常用的凸优化器。
公式:
S V M L o s s = ∑ j ≠ y i m a x ( 0 , s j − s y i + 1 ) SVMLoss=\sum_{j\neq y_i}max(0,s_j-s_{y_i}+1) SVMLoss=j=yi∑max(0,sj−syi+1)
这是分类问题中最常见的设置。随着预测概率偏离实际标签,交叉熵损失会逐渐增加。
衡量估计模型与真实概率分布之间差异
数学公式:
C r o s s E n t r o p y L o s s = − ( y i l o g ( y ^ i ) + ( 1 − y i ) l o g ( 1 − y ^ i ) ) CrossEntropyLoss=-(y_ilog(\hat y_i)+(1-y_i)log(1-\hat y_i)) CrossEntropyLoss=−(yilog(y^i)+(1−yi)log(1−y^i))
注意,当实际标签为 1(y(i)=1) 时,函数的后半部分消失,而当实际标签是为 0(y(i=0)) 时,函数的前半部分消失。简言之,我们只是把对真实值类别的实际预测概率的对数相乘。还有重要的一点是,交叉熵损失会重重惩罚那些置信度高但是错误的预测值。