学习人工智能可能遇到的问题

本文解答了机器学习中常见的问题,包括数据集划分原理、梯度下降法对比、模型调试技巧、激活函数初始化策略、梯度不稳定问题及解决方法、交叉熵误差函数的优势、正则化方法的理解及应用,以及回归评估指标的介绍。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.为什么一般需要划分出额外的校验集用语超参数调整,而不是选择直接使用测试集?

1.为什么要划分数据集为训练集,验证集和测试集?

做科研,就要提出问题,找到解决方法,并证明其有效性。这里的工作有3个部分,一个是提出问题,一个是找到解决方法,另一个是证明有效性。每一个部分都可以作为科研的对象,研究的越靠前,则越偏向科学,越靠后,则越偏向技术,因此叫做科学与技术。

在我们人工智能领域,证明一个模型的有效性,就是对于某一问题,有一些数据,而我们提出的模型可以(部分)解决这个问题,那如何来证明呢?这和我们平时的考试也是一样的,证明我们掌握了某类知识,就是去参加考试。

好,那么如何设计考试,让这个考试可以较为客观的考察出每个人的能力呢(注意,不是让每个人都得最高分)?回想我们的高中阶段,有一些教材,让我们平时学习其基本知识(训练集),有一些模拟考试,让我们知道我们到底掌握的怎么样,然后再改进我们的学习(验证集),最后的高考决定我们的去向(测试集)。这样的类比,是不是就很清楚了。

2.训练集、验证集与测试集

训练集:教材(例题),其特点是数量多,容易获得,是我们(模型)掌握知识的最根本的途径。训练集在我们模型的过程中起的作用就是更新模型的参数,用以获得更好的性能,其行为表现就是让我们以为模型掌握了相关的知识(规律)。

验证集:模拟考试,其特点是相对客观的自我衡量的一种方式。毕竟你见过的例题你都会了这是理所当然的事情,但是要求你能够举一反三,遇到同类型的题目也应该会。另外,当你习题做错的时候,你还可以重新去回顾已学习的知识,是不是掌握的方式或者理解发生了偏差。验证集就是为了调整我们模型的超参数(神经元的数量、迭代的次数、序列长度等等),这些超参数在某一次的学习迭代中是没有办法改变的。

测试集:高考,其特点是一考定终身,而且不给你改的机会,想想多少人在高考的过程中悔恨,但是也没啥用,除非复读,否则这个成绩就是无法改变的。而且,最重要的一点,首先,高考和模拟考与教材的考察内容应当是一致的(考试大纲),其次,你会发现无论平时做了多少题目,也许有些题目有几分相似,但是在高考试卷上不会出现100%一样的题目,多数题目都是从未见过的(数学最为甚)。而且致命的是,你不会得到答案反馈,即使后面会提供参考答案(比如在报纸上),但是你只会得到你的评分,无论这个评分与你的预估分有无差异。这就像是平时的数据比赛,测试集你是不会得到的,都是上传模型后,评测系统会给你一个最终得分。这才是最正统的做法。

但是,但是,事实上很少会提供这么严格的环境,通常的科研都是自己的数据,自己的方法,自己的模型,自己的评测,那么我们应该掌握科学的评测方法才能够更加客观的反映我们的模型的性能。

3.总的来说就是为了防止过拟合

2.批量梯度下降和随机梯度下降在面对鞍点时有何不同表现?

1.方法比较:

梯度下降法是批量更新算法,随机梯度是在线算法
梯度法优化的是经验风险,随机梯度法优化的是泛化风险
梯度法可能陷入局部最优,随机梯度可能找到全局最优
梯度法对步长不敏感,随机梯度对步长选择敏感
梯度法对初始点(参数)选择敏感
2.结果区别:

(1)批量梯度下降—最小化所有训练样本的损失函数,使得最终求解的是全局的最优解,即求解的参数是使得风险函数最小。

(2)随机梯度下降—最小化每条样本的损失函数,虽然不是每次迭代得到的损失函数都向着全局最优方向, 但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近。

批梯度下降和随机梯度下降的对比的区别

随机梯度下降是通过每个样本来迭代更新一次,如果样本量很大的情况(例如几十万),那么可能只用其中几万条或者几千条的样本,就已经将θ迭代到最优解了。对比上面的批量梯度下降,迭代一次需要用到十几万训练样本,一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次。

随机梯度下降每次迭代只使用一个样本,迭代一次计算量为n2,当样本个数m很大的时候,随机梯度下降迭代一次的速度要远高于批量梯度下降方法。

两者的关系可以这样理解:随机梯度下降方法以损失很小的一部分精确度和增加一定数量的迭代次数为代价,换取了总体的优化效率的提升。增加的迭代次数远远小于样本的数量。

SGD伴随的一个问题是噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。

批量梯度下降 - - - 最小化所有训练样本的损失函数,使得最终求解的是全局的最优解,即求解的参数是使得风险函数最小,但是对于大规模样本问题效率低下。

随机梯度下降—最小化每条样本的损失函数,虽然不是每次迭代得到的损失函数都向着全局最优方向, 但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近,适用于大规模训练样本情况。

标准梯度下降和随机梯度下降之间的关键区别

标准梯度下降是在权值更新前对所有样例汇总误差,而随机梯度下降的权值是通过考查某个训练样例来更新的
在标准梯度下降中,权值更新的每一步对多个样例求和,需要更多的计算
标准梯度下降,由于使用真正的梯度,标准梯度下降对于每一次权值更新经常使用比随机梯度下降大的步长
如果标准误差曲面有多个局部极小值,标准梯度下降有时可能避免陷入这些局部极小值中

3.当一个模型训练完后若发现训练集上的loss非常高,请问在不对代码进行全面排查的前提下,以最快速度定位是模型本身的拟合能力不足还是代码的实现存在某种错误?

在这里插入图片描述

当一个模型训练完成后发现训练集上的loss非常高,请问如何在不对代码进行全面排查的前提下,怎样最快定位是模型本身的拟合能力不足还是代码的实现存在某种错误。

答:使用一个额外的测试集对代码进行测试,如果使用测试集运行后的结果的结果是loss低,趋于正常。那么说明是模型本身拟合不足的问题,如果使用测试集运行后的结果的结果是loss仍然很高,我们继续更换测试集,如果结果仍然很高,那我们可以断定是代码存在某种错误

4.假设我们在训练一个使用Sigmoid激活函数的全连接神经网络。在对其权重进行初始化是,为什么一般会倾向于让初始值的绝对值偏小?如果需要这样,为何不直接使用0进行初始化?

Sigmoid导函数图像
在这里插入图片描述

由上图可知此函数在z>>1或者z<<-1时导数很小,接近于0,那么返回到之前我们所求的的很大概率是一个绝对值较大的值,这样a对z的偏导数将会很小,最终导致w1,w2…wn,梯度下降更新权值速度变慢,也就是学习速度变慢

当在神经网络中的权值全部都使用 0 初始化时,模型无法正常工作了。

原因是:在神经网络中因为存在隐含层。我们假设模型的输入为[x1,x2,x3],隐含层数为1,隐含层单元数为2,输出为 y ,模型如下图所示:在这里插入图片描述
则通过正向传播计算之后,可得:

z1 = w10 * x0 + w11 * x1 + w12 * x2 +w13 * x3

z2 = w20 * x0 + w21 * x1 + w22 * x2 +w23 * x3

在所有的权值 w 和偏差值 b (可以看做是w10)初始化为 0 的情况下,即计算之后的 z1 和 z2 都等于0

那么由于 a1 = g(z1) 、a2 = g(z2),经过激活函数之后得到的 a1 和 a2 也肯定是相同的数了,即 a1 = a2 = g(z1)

则输出层:y = g(w20 * a0 + w21 * a1 + w22 *a2 ) 也是固定值了。

重点:在反向传播过程中,我们使用梯度下降的方式来降低损失函数,但在更新权值的过程中,代价函数对不同权值参数的偏导数相同 ,即Δw相同,因此在反向传播更新参数时:

w21 = 0 + Δw

w22 = 0 + Δw

实际上使得更新之后的不同节点的参数相同,同理可以得到其他更新之后的参数也都是相同的,不管进行多少轮的正向传播和反向传播,得到的参数都一样!因此,神经网络就失去了其特征学习的能力。
例子

5.在CNN中梯度不稳定指的是什么?在神经网络训练过程中,为什么会出现梯度消失的问题?如何防止?

1.梯度消失和爆炸产生的原因:

a)从网络深度来分析:

在反向传播过程中需要对激活函数进行求导,如果导数大于1,那么随着网络层数的增加梯度更新将会朝着指数爆炸的方式增加这就是梯度爆炸。同样如果导数小于1,那么随着网络层数的增加梯度更新信息会朝着指数衰减的方式减少这就是梯度消失。因此,梯度消失、爆炸,其根本原因在于反向传播训练法则,属于先天不足。

b)从激活函数来分析:

前面a中提到的激活函数,我们就以Sigmoid函数为例
在这里插入图片描述
Sigmoid函数的导数:
在这里插入图片描述
从Sigmoid导数中我们可以看出来当x趋近于无穷大的时候,导数趋近于0。这样经过链式求导之后很容易造成梯度消失问题。

2.梯度消失和爆炸的解决办法

a)预训练+微调

b)梯度裁剪:主要针对梯度爆炸问题,设置一个阈值,当梯度查过这个阈值之后将它限制在这个范围之内。

c)权重正则化,L1和L2正则化。

正则化是通过对网络权重做正则限制过拟合,仔细看正则项在损失函数的形式:
Loss=(y−WTx)2+α||W||2
其中,α是指正则项系数,因此,如果发生梯度爆炸,权值的范数就会变的非常大,通过正则化项,可以部分限制梯度爆炸的发生。在实际训练过程中梯度消失的问题发生的比较多。

d)使用Relu Lrelu Prelu Rrelu激活函数来防止梯度消失问题。

e)batchnorm

6.为什么在神经网络中使用交叉熵而不是均方差作为误差函数?

  1. 二次代价函数的不足

    ANN的设计目的之一是为了使机器可以像人一样学习知识。人在学习分析新事物时,当发现自己犯的错误越大时,改正的力度就越大。比如投篮:当运动员发现自己的投篮方向离正确方向越远,那么他调整的投篮角度就应该越大,篮球就更容易投进篮筐。同理,我们希望:ANN在训练时,如果预测值与实际值的误差越大,那么在反向传播训练的过程中,各种参数调整的幅度就要更大,从而使训练更快收敛。然而,如果使用二次代价函数训练ANN,看到的实际效果是,如果误差越大,参数调整的幅度可能更小,训练更缓慢。

    以一个神经元的二类分类训练为例,进行两次实验(ANN常用的激活函数为sigmoid函数,该实验也采用该函数):输入一个相同的样本数据x=1.0(该样本对应的实际分类y=0);两次实验各自随机初始化参数,从而在各自的第一次前向传播后得到不同的输出值,形成不同的代价(误差):
    在这里插入图片描述
    实验1:第一次输出值为0.82
    在这里插入图片描述
    实验2:第一次输出值为0.98

    在实验1中,随机初始化参数,使得第一次输出值为0.82(该样本对应的实际值为0);经过300次迭代训练后,输出值由0.82降到0.09,逼近实际值。而在实验2中,第一次输出值为0.98,同样经过300迭代训练,输出值只降到了0.20。

从两次实验的代价曲线中可以看出:实验1的代价随着训练次数增加而快速降低,但实验2的代价在一开始下降得非常缓慢;直观上看,初始的误差越大,收敛得越缓慢。

其实,误差大导致训练缓慢的原因在于使用了二次代价函数。二次代价函数的公式如下:在这里插入图片描述
其中,C表示代价,x表示样本,y表示实际值,a表示输出值,n表示样本的总数。为简单起见,同样一个样本为例进行说明,此时二次代价函数为:在这里插入图片描述a为激活函数
目前训练ANN最有效的算法是反向传播算法。简而言之,训练ANN就是通过反向传播代价,以减少代价为导向,调整参数。参数主要有:神经元之间的连接权重w,以及每个神经元本身的偏置b。调参的方式是采用梯度下降算法(Gradient descent),沿着梯度方向调整参数大小。w和b的梯度推导如下:在这里插入图片描述
其中,z表示神经元的输入,表示激活函数。从以上公式可以看出,w和b的梯度跟激活函数的梯度成正比,激活函数的梯度越大,w和b的大小调整得越快,训练收敛得就越快。而神经网络常用的激活函数为sigmoid函数,该函数的曲线如下所示:在这里插入图片描述
如图所示,实验2的初始输出值(0.98)对应的梯度明显小于实验1的输出值(0.82),因此实验2的参数梯度下降得比实验1慢。这就是初始的代价(误差)越大,导致训练越慢的原因。与我们的期望不符,即:不能像人一样,错误越大,改正的幅度越大,从而学习得越快。

  1. 交叉熵代价函数

换个思路,我们不换激活函数,而是换掉二次代价函数,改用交叉熵代价函数:
在这里插入图片描述
其中,x表示样本,n表示样本的总数。那么,重新计算参数w的梯度:
在这里插入图片描述
其中:
在这里插入图片描述
因此,w的梯度公式中原来的被消掉了;另外,该梯度公式中的表示输出值与实际值之间的误差。所以,当误差越大,梯度就越大,参数w调整得越快,训练速度也就越快。同理可得,b的梯度为:
在这里插入图片描述
实际情况证明,交叉熵代价函数带来的训练效果往往比二次代价函数要好。

7.什么是正则化;L1正则与L2正则的区别?

我们总会在各种地方遇到正则化这个看起来很难理解的名词,其实它并没有那么高冷,是很好理解的

首先,从使用正则化解决了一个什么问题的角度来看:正则化是为了防止过拟合, 进而增强泛化能力。用白话文转义,泛化误差(generalization error)= 测试误差(test error),其实就是使用训练数据训练的模型在测试集上的表现(或说性能 performance)好不好

在这里插入图片描述
如上图,红色这条“想象力”过于丰富上下横跳的曲线就是过拟合情形。结合上图和正则化的英文 Regularizaiton-Regular-Regularize,直译应该是:规则化(加个“化”字变动词,自豪一下中文还是强)。什么是规则?你妈喊你6点前回家吃饭,这就是规则,一个限制。同理,在这里,规则化就是说给需要训练的目标函数加上一些规则(限制),让他们不要自我膨胀。正则化,看起来,挺不好理解的,追其根源,还是“正则”这两字在中文中实在没有一个直观的对应,如果能翻译成规则化,更好理解。但我们一定要明白,搞学术,概念名词的准确是十分重要,对于一个重要唯一确定的概念,为它安上一个不会产生歧义的名词是必须的,正则化的名称没毛病,只是从如何理解的角度,要灵活和类比。

1 概念

  • L1正则化的值是模型参数中非零参数的个数。
  • L1正则化表示各个参数绝对值之和。
  • L2正则化标识各个参数的平方的和的开方值。

2、先讨论几个问题:

1)实现参数的稀疏有什么好处吗?

一个好处是可以简化模型,避免过拟合。因为一个模型中真正重要的参数可能并不多,如果考虑所有的参数起作用,那么可以对训练数据可以预测的很好,但是对测试数据表现性能极差。另一个好处是参数变少可以使整个模型获得更好的可解释性。

2)参数值越小代表模型越简单吗?

是的。为什么参数越小,说明模型越简单呢,这是因为越复杂的模型,越是会尝试对所有的样本进行拟合,甚至包括一些异常样本点,这就容易造成在较小的区间里预测值产生较大的波动,这种较大的波动也反映了在这个区间里的导数很大,而只有较大的参数值才能产生较大的导数。因此复杂的模型,其参数值会比较大。

3)L0正则化

根据上面的讨论,稀疏的参数可以防止过拟合,因此用L0范数(非零参数的个数)来做正则化项是可以防止过拟合的。

从直观上看,利用非零参数的个数,可以很好的来选择特征,实现特征稀疏的效果,具体操作时选择参数非零的特征即可。但因为L0正则化很难求解,是个NP难问题,因此一般采用L1正则化。L1正则化是L1正则化的最优凸近似,比L0容易求解,并且也可以实现稀疏的效果。

  1. L2正则化

L2正则化就是在代价函数后面再加上一个正则化项:
在这里插入图片描述
C0代表原始的代价函数,后面那一项就是L2正则化项,它是这样来的:所有参数w的平方的和,除以训练集的样本大小n。λ就是正则项系数,权衡正则项与C0项的比重。另外还有一个系数1/2,1/2经常会看到,主要是为了后面求导的结果方便,后面那一项求导会产生一个2,与1/2相乘刚好凑整。

L2正则化项是怎么避免overfitting的呢?我们推导一下看看,先求导:
在这里插入图片描述
可以发现L2正则化项对b的更新没有影响,但是对于w的更新有影响:
在这里插入图片描述
在不使用L2正则化时,求导结果中w前系数为1,现在w前面系数为(1-ηλ/n),因为η、λ、n都是正的,所以 (1-ηλ/n)小于1,它的效果是减小w,这也就是权重衰减(weight decay)的由来。当然考虑到后面的导数项,w最终的值可能增大也可能减小。

到目前为止,我们只是解释了L2正则化项有让w“变小”的效果,但是还没解释为什么w“变小”可以防止overfitting?人们普遍认为:更小的权值w,从某种意义上说,表示网络的复杂度更低,对数据的拟合刚刚好(这个法则也叫做奥卡姆剃刀)。而在实际应用中,也验证了这一点,L2正则化的效果往往好于未经正则化的效果。

  1. L1 regularization
    在原始的代价函数后面加上一个L1正则化项,即所有权重w的绝对值的和,乘以λ/n(这里不像L2正则化项那样,需要再乘以1/2)
    在这里插入图片描述
    同样先计算导数:
    在这里插入图片描述
    上式中sgn(w)表示w的符号。那么权重w的更新规则为:比原始的更新规则多出了η * λ * sgn(w)/n这一项。当w为正时,更新后的w变小。当w为负时,更新后的w变大——因此它的效果就是让w往0靠,使网络中的权重尽可能为0,也就相当于减小了网络复杂度,防止过拟合。

深入理解

为了使得模型能够充分拟合训练样本点,我们希望上述目标函数C0=L(W)的值尽可能小,即:在这里插入图片描述
但是由于实际中的训练数据量往往并不大,如果让模型完美拟合训练数据的话,很可能造成模型过拟合,从而使得模型的泛化能力较差。这一点可以从得到的模型参数向量w的各个分量中看出,其中大部分分量的绝对值都非常大,这种现象直观表现在图上就是曲线(曲面)不光滑,凹凸不平,很复杂;相反,如果w的各个分量的绝对值都很小,在0附近,那么曲线(曲面)就会显得很平滑。很显然,在机器学习中,我们更希望拟合出的曲线(曲面)更为平滑,因为这样的曲线(曲面)是具有较好的泛化能力的。那么如何将w各个分量的绝对值降低呢?这就要用到正则化技术了。在用正则化技术估计参数w时,引入了我们对参数的先验认知,即我们认为参数的绝对值应该很小。

正则化技术就是使得式(1)的值尽可能小,与此同时,要保证||w||的值也尽可能小,即:
在这里插入图片描述
在上式中,优化函数的目标变成了两个,w的取值不仅要使得L(w)的值最小,也要使得||w||的值最小。从上式我们可以看出,一方面要使得L(w)的取值最小,必然w的绝对值会取到很大,这样模型才能完美拟合训练样本点;另一方面,当w的绝对值很大时,||w||的值又会变得很大,因此为了权衡,只有使得w取值适当,才能保证式(2)的值取到最优。这样得到的曲线(曲面)比式(1)得到的曲线(曲面)平滑很多,因此具有泛化能力。值得注意的是,式中的t是L(w)与||w||之间的一个trade-off,如果t过大,那么表明对模型参数w的惩罚越狠,这样就会导致更多的W取0(当t很大时,由于目标函数是min,逼得只有W取0,才会使目标函数不至于太大),这样得到的模型处于欠拟合状态,如果t过小,那么表明对模型参数w的惩罚越小(理解的思路相同),这样得到的模型处于过拟合状态,只有选择合适的t,才能使得到的模型具有很好地泛化能力。关于如何选择t的值,工程上一般采取交叉验证的方式来确定一个较合理的t。

我们先来看L2正则化。
在这里插入图片描述
式中,||w||2为w的2范式,平方是为了求解的方便。

我们来看看L2正则化的性质。

1.从式(3)中可以看出,L2正则化对于绝对值较大的权重予以很重的惩罚,对于绝对值很小的权重予以非常非常小的惩罚,当权重绝对值趋近于0时,基本不惩罚。这个性质与L2的平方项有关系,即越大的数,其平方越大,越小的数,比如小于1的数,其平方反而越小。

2.从贝叶斯推导的角度看,我们可以认为式(3)中的第二项为参数w的一个均值为0的高斯先验分布,即,w~N(0, b^{2})。这也符合我们对于参数w的先验认知:w的绝对值不是很大。

3.从性质2可知,既然w的先验分布服从高斯分布,那么L2正则化的作用实际上就是使得参数向量w的大部分分量的值趋近于0,而不是等于0。这一点在处理具有共线性特征的特征集时非常重要,也是L2在这种情况下胜过L1的原因。

4.由于式(3)是个凸函数,并且函数可微,因此w的值具有解析解:
在这里插入图片描述
从解的解析表达式可以看出,w的求解不需要对X-1是否存在作任何假设,因为I为单位矩阵,因此解析式中的逆始终存在。

接下来我们看看L1正则化。

随着海量数据处理的兴起,工程上对于模型稀疏化的要求也随之出现了。这时候,L2正则化已经不能满足需求,因为它只是使得模型的参数值趋近于0,而不是等于0,这样就无法丢掉模型里的任何一个特征,因此无法做到稀疏化。这时,L1的作用随之显现。L1正则化的作用是使得大部分模型参数的值等于0,这样一来,当模型训练好后,这些权值等于0的特征可以省去,从而达到稀疏化的目的,也节省了存储的空间,因为在计算时,值为0的特征都可以不用存储了。
在这里插入图片描述
(4)式中||w||1为w的1范式,即
在这里插入图片描述
同样,我们来看看L1正则化的性质。

  1. 从式(4)中可以看出,L1正则化对于所有权重予以同样的惩罚,也就是说,不管模型参数的大小,对它们都施加同等力度的惩罚,因此,较小的权重在被惩罚后,就会变成0。因此,在经过L1正则化后,大量模型参数的值变为0或趋近于0,当然也有一部分参数的值飙得很高(这一点在性质2解释)。由于大量模型参数变为0,这些参数就不会出现在最终的模型中,因此达到了稀疏化的作用,这也说明了L1正则化自带特征选择的功能,这一点十分有用。

2.从贝叶斯推导的角度看,我们可以认为式(4)中的第二项为参数w的一个均值为0的拉普拉斯先验分布。从高斯概率密度函数和拉普拉斯概率密度函数的图形中可以看出,拉普拉斯概率密度函数的截尾比高斯概率密度函数的截尾更长,也就是说L1正则化更能够接受绝对值较大的参数值。

3.从性质2可知,既然拉普拉斯分布比高斯分布有更长的截尾,那么可以推知L1正则化的鲁棒性要好于L2正则化,也就是说,L1正则化对于绝对值较大的参数没有L2正则化那么敏感,从而能够容忍一些这样的参数留下。

4.由1范式的定义可知,L1正则化在任意权值为0的时候不可导,因此式(4)不能求出w的解析解,同时,基于梯度的优化算法也无法高效地计算出w的值,因此对于L1正则化,一般可以采取坐标下降法求解。

L1正则化和L2正则化在实际应用中的比较。

L1在确实需要稀疏化模型的场景下,才能发挥很好的作用并且效果远胜于L2。在模型特征个数远大于训练样本数的情况下,如果我们事先知道模型的特征中只有少量相关特征(即参数值不为0),并且相关特征的个数少于训练样本数,那么L1的效果远好于L2。比如在文本分类中,如果我们将一篇文章的所有词语作为它的特征,那么很显然,其中绝大部分特征是无关特征,只有很少量的特征是相关特征。这时,如果我们将每篇文章作为训练样本,直接扔进L1正则化的模型,那么可以通过L1的稀疏化性质去掉无关特征,只留下相关特征。从而L1在这里起到了特征选择的作用,也就省去了特征工程这一步,因为特征工程往往还是需要人工干预的,L1的做法则直接让数据说话,避免人工干预。然而,如果模型的特征服从高斯分布,那么从贝叶斯的观点来看,即便特征数远超训练样本数,L2也要优于L1。

然而,需要注意的是,当相关特征数远大于训练样本数时,无论是L1还是L2,都无法取得很好的效果。

从上面的观点可以看出,L1似乎总是好于L2,那么L2还有什么存在的价值呢?然而在实际工程中,L1不总是像万金油一样,随处可用。对于上面文本分类的例子,结合我实际的工程经验谈谈L1的弊端。

在最开始做文本分类的时候,我也是依然毫不犹豫地选择了L1来做特征选择,以此训练出分类模型,但得到的分类模型效果却不尽如人意,训练误差和泛化误差都较高。后来经过分析得知,在进行模型训练时,没有对数据的特征作分析,而盲目地运用L1正则化,从而导致失败。在经过分析后发现,训练数据里的特征很多是共线性的,比方说,有几个特征的共线性很高,并且它们对于分类都很重要,这时L1的做法是随机选择其中一个特征,而扔掉其它的特征。试想,如果训练数据中有很多这样类似的特征,那么经过L1正则化后的模型将会失去很多有用的特征,进而导致模型误差较大。这个时候,我们不得不选择L2正则化了,但由于L2正则化在面对大量无关特征并且特征不是由高斯分布产生时,误差依然很大,因此我们需要在训练模型之前,先进行特征选择,然后再用L2正则化,L2正则化的特点是,在面对几个存在共线性的特征时,它会将权值平分给这些特征,从而使得这些有用的特征都得以留下,从而改进了文本分类的准确率。

也许读者认为,加入了特征工程的L2正则化稍显麻烦,确实是这样的。实践中也可以采取L1+L2结合的方式,即elastic net。这种方式同时兼顾特征选择(L1)和权重衰减(L2)。其公式如下
在这里插入图片描述
上式中,t为正则项与L(w)之间的trade-off系数,和之前的描述一致,p是elastic net里独有的参数,它是L1和L2之间的一个trade-off,如果p为0,那么上式退化为L2正则化,如果p为1,那么上式退化为L1正则化。所以当p取值为0到1时(不包含端点),上式兼顾了L1和L2的特点。又由于L1为1范式,L2为2范式,那么elastic net就介于1范式和2范式之间。

参考文章

8.回归评价指标MSE、RMSE、MAE、R-Squared

前言
分类问题的评价指标是准确率,那么回归算法的评价指标就是MSE,RMSE,MAE、R-Squared。下面一一介绍

均方误差(MSE)
MSE (Mean Squared Error)叫做均方误差。看公式
在这里插入图片描述
这里的y是测试集上的。

用 真实值-预测值 然后平方之后求和平均。
猛着看一下这个公式是不是觉得眼熟,这不就是线性回归的损失函数嘛!!! 对,在线性回归的时候我们的目的就是让这个损失函数最小。那么模型做出来了,我们把损失函数丢到测试集上去看看损失值不就好了嘛。简单直观暴力!
均方根误差(RMSE)
RMSE(Root Mean Squard Error)均方根误差。
在这里插入图片描述
这不就是MSE开个根号么。有意义么?其实实质是一样的。只不过用于数据更好的描述。
例如:要做房价预测,每平方是万元(真贵),我们预测结果也是万元。那么差值的平方单位应该是 千万级别的。那我们不太好描述自己做的模型效果。怎么说呢?我们的模型误差是 多少千万?。。。。。。于是干脆就开个根号就好了。我们误差的结果就跟我们数据是一个级别的可,在描述模型的时候就说,我们模型的误差是多少万元。

MAE
MAE(平均绝对误差)
在这里插入图片描述
不用解释了吧。

R Squared
上面的几种衡量标准针对不同的模型会有不同的值。比如说预测房价 那么误差单位就是万元。数子可能是3,4,5之类的。那么预测身高就可能是0.1,0.6之类的。没有什么可读性,到底多少才算好呢?不知道,那要根据模型的应用场景来。
看看分类算法的衡量标准就是正确率,而正确率又在0~1之间,最高百分之百。最低0。很直观,而且不同模型一样的。那么线性回归有没有这样的衡量标准呢?答案是有的。
那就是R Squared也就R方
在这里插入图片描述
光看这些东西很懵逼,其中分子是Residual Sum of Squares 分母是 Total Sum of Squares
那就看公式吧
在这里插入图片描述
懵逼(X2)

慢慢解释。其实这个很简单。
上面分子就是我们训练出的模型预测的所有误差。
下面分母就是不管什么我们猜的结果就是y的平均数。(瞎猜的误差)
那结果就来了。
如果结果是0,就说明我们的模型跟瞎猜差不多。
如果结果是1。就说明我们模型无错误。
如果结果是0-1之间的数,就是我们模型的好坏程度。
如果结果是负数。说明我们的模型还不如瞎猜。(其实导致这种情况说明我们的数据其实没有啥线性关系)
化简上面的公式
分子分母同时除以m

在这里插入图片描述
那么分子就变成了我们的均方误差MSE,下面分母就变成了方差。
在这里插入图片描述
scikit-learn中的各种衡量指标

from sklearn.metrics import mean_squared_error #均方误差
from sklearn.metrics import mean_absolute_error #平方绝对误差
from sklearn.metrics import r2_score#R square
#调用
mean_squared_error(y_test,y_predict)
mean_absolute_error(y_test,y_predict)
r2_score(y_test,y_predict)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值