模型复杂度、泛化能力、过拟合和复杂度四个相关要素

在之前的文章我们通过逻辑回归的例子引出了W会变得无穷大数据线性可分,再引出了通过正则项的方式L2正则及其应用去解决这个问题,这个问题的本身是一个过拟合的问题,一旦我们谈到过拟合现象,那就不得不去说一个很重要的概念,叫做模型复杂度,英文叫做Model Complexity.

在机器学习领域,我们设计出很多模型,本质上我们都想让模型有更好的泛化能力,下面通过例子来说明什么叫模型的复杂度以及模型的复杂度跟哪些要素会有一定的关系。一旦我们知道哪些要素跟模型复杂度有关系,那我们就知道了如何减小模型复杂度或者提高模型复杂度。

1. 模型复杂度

图片

上面有三幅图,我们想通过一些分类算法将上面的数据进行分类,上面的点我们可以理解成我们用来训练模型的训练数据,对于最左边的图,我们使用线性的分类器进行分类,效果如下图a,对于中间的图,我们用稍微复杂的非线性分类器去分类,效果如下图b.

图片

对于最右边的图,我们使用更复杂的模型区分类,效果如上图c。

那这三种模型哪一种模型是比较理想的呢,c图模型的决策边界很复杂,但是只有一个点被我们错误分类,准确率很高,决策边界也是非常复杂。

b图模型错误分类了2-3个点,但是它基本捕获了我们数据分布的一个现象,a图模型我们是用的最简单的线性模型进行的分类,但是有稍微多一点的误差。

对于abc中哪种模型是最好的,我们首先会抛弃模型c,从模型c直观的角度可以看到,虽然模型c在这个数据里面表现得很好,但是我们能保证这个模型在未来的测试数据里面表现得很好吗?

未来我们有一些测试的数据,测试的数据有可能会落到下面右图中的位置。

图片
图片

因为红色的点有可能是噪音造成的,所以本不应该在那个位置,但是我们在使用一个复杂模型的时候,它却能把这个错误的点分类正确,但是未来我们用测试数据的时候很多绿色的点会落在我们添加绿色点的那个区域,那这个模型很显然会把所有这个区域的点分类成红色的点。所以很明显模型c是不好的,即便它在我们的训练数据里面表现的非常好,但是很明显不是我们想要的。

那我们接下来看一下a和b模型,我们要选择哪一个。对于a模型来说,它能够捕获这个趋势,但是对于数据分布来说还没有那么精准,犯了很多错误,准确率不是那么高,只是捕获了大概的趋势。

b模型捕获到了我们数据的趋势,同时它犯得错误比a模型少,效果比a好一些,所以三个模型里面,让我们去选,我们会选择b模型,所以这就涉及到了模型的复杂度,a模型相对简单,b模型是简单到复杂的中间,c模型是复杂。

像线性回归和逻辑回归,它们是线性模型是比较简单的模型,像神经网络或者支持向量机的时候这些是比简单的模型复杂的模型。

简单的模型和复杂的模型各有各的好处,简单的模型更容易避免过拟合,复杂的模型容易造成过拟合的现象,也就是在训练数据里面表现的很好,但是在测试数据里面表现的很差。

这就导致了Tradeoff的现象,模型在训练数据里面表现的很好,但是它是一个不稳定的模型,稳定的模型我们理解成是不太容易过拟合的模型,不稳定的模型我们也可以理解成容易过拟合的模型。

2. 泛化能力

下面我们看一个非常重要的概念叫做泛化能力,这是机器学习研究的核心的一个点。一个复杂的模型在我们的训练数据里面确实是表现很好的,但是我们怎么保证这个模型能够在未来的数据里面仍然表现的很好,这就取决于一个模型的泛化能力。

很多的研究学者在研究或者去设计一个新的模型的时候,他们的核心是要去设计一个泛化能力比较强的模型。

图片

上图中我们有两个不同的数据,一个是训练数据,一个是测试数据,训练数据的作用是我们通过训练数据去构建模型的,我们的目的不是构建一个模型在我们的训练数据上表现非常棒,而是通过我们的历史数据去构建模型之后,然后把这个模型应用在我们的场景里面,在现实场景里面表现非常好。

假设我们把设计好的模型放到平台上,这个时候模型的价值其实在于它对未来进入我们系统里面的数据做更好地预测,这些数据是在我们训练的时候没有遇到过的数据。

例如我们搭建一个推荐算法,在搭建的时候我们使用历史上可能过去2-3年的所有数据去搭建,然后用这个算法去预测未来这些用户的行为,所以测试数据我们可以理解成是未来数据,是训练阶段没有碰到过的这批数据。

图片

所以我们的目标是当我们训练出这样一个模型之后,希望它能够在未来数据上表现越好,所以我们在评估模型的时候不要说我的模型在训练数据上表现多好,而是说我的模型在未来这些数据上的准确率是怎样的。这是很多产品经理或者做AI算法的人想听到的一个事情。

很多时候我的模型在训练数据上表现是特别好的,比如100%的准确率,很多时候我们可以稍微调一下我们的参数,完全可以达到这样一个准确率,但是先不要高兴,这个模型很可能是过拟合了。

100%准确率模型上线之后,在未来数据上准确率可能只有60%,这种情况特别常见,这就取决于我在训练模型的时候,到底要训练出什么样的一个模型才使得既在训练数据上表现不错,而且也在未来测试数据上表现不错。

这就是取决于我要选择一个合适复杂度的模型,比如我的模型复杂度很高,我是有很大概率得到100%准确率的,比如对于任何的分类问题,假设我创建的是一百层的神经网络,那就很容易得到这样的一个准确率的。但是在测试数据里面可能就是60%的准确率。

图片

同时有些模型没有那么复杂,所以在训练数据上得到的准确率可能是85%,那么在测试数据上得到的准确率有可能是83%。这就代表这种模型是偏向于稳定的。在这两个数据集里面没有特别大的差别,我们想训练的模型就是类似这样一个模型。

从这个角度我们可以将模型分成两部分,如下图,左边是很简单的模型,右边是非常复杂的模型。

图片

复杂的模型准确率很高,但是泛化能力比较差,简单的模型泛化能力比较强,但是准确率比较低,所以我需要选择折中的中间的某一类模型,当做我们理想中的模型。

所以泛化能力总结起来就是这个模型即便在未来的数据里面也会表现不错,不会出现很严重的overfitting,我们不能百分之百解决过拟合的问题,但是我们可以解决一部分过拟合的问题。

简单做个总结:

图片

过拟合:在训练数据里面表现得很好,但是在测试数据里面表现得很差。

泛化:为了防止过拟合,我们需要设计泛化能力比较强的模型。

复杂度:泛化能力比较强的模型在复杂度上要做一些选择,不能选择非常复杂的,也不能选过于简单的,只能选择比较折中的一个方案。

所以这三者是有一个很强的相关性的。

3. 实例讲解泛化能力

下面通过一个简单的例子讲解泛化能力,这个例子我们叫产品的定制化。

比如我们创办的一家公司,公司业务只要是to B的,我们要给别的企业开发推荐系统的产品,是给别的公司去使用的,公司的需求是非常多样化的,即便他们都是电商的公司,但是内部的需求是不太一样的,因为卖的东西是不一样的。

我们要去服务这些公司就需要给他们定制化这种系统,根据他们的需求去定制化一个系统,这就涉及到一个问题,定制化到什么程度,完全的定制化会产生的问题有成本很高,我们可能需要专门的团队去服务一个公司,第二个问题是可复用性比较差,因为这个系统可能非常依赖于A公司某一个场景,但是B公司可能是完全不一样的场景,所以想服务B公司就需要重新搭建一个新的系统。

图片

一个好的方法就是适当的定制化,定制化的时候把ABC三家公司的共同的一些需求点把它抽取出来,然后在这个基础上再做一定的定制化,这样的好处就是我做完一个推荐系统给A公司之后我再服务B公司的时候,很多模型都是可以重用的。

这个例子跟我上面讲到的泛化和过拟合是有相通之处的,这里面的过拟合是开发一个产品给A,这个产品严重的定制化,导致想把这个产品卖给B的时候就不符合B的场景了,这就需要重新去开发一个新产品,这就是类似过拟合的现象。

这样一个产品缺乏泛化能力,只能服务一家,同时从模型的复杂度来说,这样一个产品复杂度挺高,我们是完全按照A公司需求定义这样一个产品,复杂度很高。

通过这样一个例子就串起来我们上文讲的概念,那我们怎么去防止过拟合现象一个解决思路就是我们把ABC这三家公司的共同需求抽出来,做成一个模块,在这个模块基础上适当添加A的需求,这种方法是更好的避免产品定制的过拟合现象,这种产品泛化能力是很强的,复杂度也没有那么高。

4. 模型复杂度相关要素

图片

下面我们讲一下模型复杂度相关知识点,复杂的模型本身容易过拟合,简单的模型准确率不是那么高,但是模型是比较稳定的,有各自的优缺点。所以我们如何去选择合适的复杂度的模型,这个是我们需要考虑的。

模型的复杂度本身跟几个要素是有很强的相关性的。

4.1 模型本身的选择:

目前我们经常听说的模型有逻辑回归LR、SVM、神经网络Neural Network、deep learning等,这些模型本身默认的复杂度是不一样的,LR复杂度最简单,是一个线性模型,SVM比LR稍微复杂一点,在我们使用了kernel核函数之后,这个模型会变得异常的复杂的。

神经网络和深度学习这些模型为什么表现很好,因为它本身就是比较复杂的模型,所以特别适合比较复杂的场景下使用这些模型的。

一个复杂的模型是比较适合在复杂的环境下使用的,一个简单的模型是更适合在简单的环境下使用的。

图片

那怎么去定义简单的环境和复杂的环境,这是比较笼统的一个定义,比如要去预测明年的财务情况,这个问题本身没那么难,很多时候用excel或者人工的方式也可以把财务未来的趋势画出来,因为本身预测财务用到的数据也没有那么多,甚至完全通过人的经验就可以。

再看另外一个场景无人驾驶,这是非常复杂的一个场景,为了做一个无人驾驶的决策我需要很多信息,包括无人车的摄像头里面捕获到的这些视频数据,包括车周围承载的很多传感器的数据,这个数据是来自多方面的而且数据量非常庞大,然后道路的情况也是不一样的,还要考虑突发的情况,这种环境是非常复杂的环境,我们面对的数据是非常多样化的,而且这个数据本身是多维度,而且极度的复杂,这种情况下我们可以理解成复杂的环境,比较适合使用稍微复杂的模型,比如神经网络或者增强学习。

4.2 模型参数的个数

一个模型我是可以使用不同的参数个数的,最经典的例子叫神经网络,一旦我们选择神经网络,那我们是需要去设计神经网络结构的,比如第一层是input layer,第二层是layer1,第三层是layer2,最后一层是输出layer,我们可以设计这样一个结构,不同的结构包含的参数的个数是不一样的,这样的结构有两层hidden layer,它产生的参数个数可能是一千个。

那我们也可以同时设计一个稍微简单一点的结构,第一层是input,中间只有一层隐含层layer1,最后一层是output层,这样的结构可能只包含100个参数,所以从参数个数的角度我也可以把一个模型说成复杂的模型或者是简单的模型,拥有一千个参数的模型显然比拥有一百个参数的模型复杂的。

图片

那假设我要避免过拟合怎么办?那我在给定神经网络的基础上,想办法把层的数目减少,或者把每一层的hidden unit个数减少,那也可以得到一个相对于简单的模型,这种简单的模型泛化能力就会变强,但是准确率可能会相对的下降。

4.3 模型的参数空间选择

第三点也是非常重要的一点就是模型参数空间的选择。我们设置了100个参数的神经网络的结构,这个模型已经定下来了,我们选了一个合适的模型,并且这个模型所有参数的个数包括它的形状是已经定下来了的,即便我把它定下来之后,我们仍然有空间可以把这个模型的复杂度做改变。

我们将模型确定就相当于确定了一个参数的空间,我们确定了100个参数的神经网络,然后再通过训练的方法找出神经网络的最优的参数。这个参数的空间就是我们要通过训练的方式从这个空间中找出那个最好的参数。

图片

上图就是我们拥有100个参数的神经网络的参数空间,训练的目的就是从这些参数空间里面选择一个最优解。假设我们神经网络的参数叫做θ,那这个空间就叫做θ的空间,这个参数空间的里面有些参数会导致我们的模型变得复杂,有些参数会导致我们的模型变得简单。

图片

上图中绿色圈里面的点会让我们的模型变得简单,外面的点对应的是比较复杂的模型,所以这个时候我们要做一个决策是选择复杂的模型还是简单的模型,即便我已经设计出来具体的模型之后,我也可以通过筛选参数空间的方式可以选择更简单的模型。

这个过程就是相当于我在θ的空间里面去选择其中的一小部分,那怎么在整个参数θ空间里面选择对应简单模型的小的参数空间呢?这个过程就是我们之前讲的叫做正则。

通过正则的方式可以选择这个绿色的区域的,所以从这里面我们可以理解到正则的作用其实相当于使我们选择比较简单的模型的参数空间,在一个可行的θ空间里面,让我们选择其中可能让模型比较简单的这些参数。

绿色圈外面的θ值可能非常大,绿色圈里面的θ值可能比较小。总结起来就是我们可以通过正则的方式去动态的筛选一个比较简单的这种参数空间,然后在这个空间里面我再去选择最好的解。

图片

这就相当于我在考虑最优化问题的时候,一开始就告诉我的算法我不想考虑绿色圈外面的点,这些点我认为会导致模型复杂的点,然后告诉梯度下降法的算法,让它从绿色圈里面找出最优解。所以正则在参数空间里面做了一个限制的作用。

正则的本质其实就是在参数空间里面给我们做限制的,把一些我们不想关心的参数先过滤掉,然后在剩下的参数里面给我们选择最好的解。所以正则可以用来做控制模型复杂度的,这是正则的最主要的作用。

4.4 模型拟合过少的样本

最后一点就是模型拟合过少的样本会导致这种过拟合现象,或者是让我们的模型变得非常的复杂。样本很少的时候,假设用了一个SVM,有可能SVM对于样本的大小来说是比较复杂的模型。

所以我们通常来说一个模型复杂,这个可以理解成它是相对于样本的大小的,假设我们样本有几千万个,这个时候使用神经网络,也不是一个复杂的模型。如果样本只有一百个,那使用神经网络就不太适合了,因为我们的问题比较简单,这个时候神经网络就可以理解成复杂的模型。

从这些要素出发,我们可以推测假设我想控制模型的复杂度怎么办?这个时候我在这四个方面下文章做一些事情,使得我们能很好的去控制咱们模型的复杂度,使得我们的模型在未来的数据里面表现得更好,也就是防止模型过拟合。

5. 模型复杂度跟模型效果的关系

模型的效果通常通过训练数据和测试数据去评估的,x轴是模型的复杂度,y轴设置为error rate,给定x和y轴之后,这两者有什么关系,如下图:

图片

训练数据随着模型的复杂度的提高表现越好,错误率越低,测试数据的趋势是先下降再上升的过程。我们把上图分为两个部分,右边部分不断地变差就是发生了过拟合的现象,在训练数据里面表现不错,测试数据里面表现就开始很差,这就是overfitting.

左边部分我们叫做underfitting,就是还没有很好的拟合数据,我还有空间去把我的模型变得更加复杂。

我们训练数据的核心就是想要找到中间那条线,从而捕获对应的最合适的这样一个模型。

同样如果x轴是模型的参数,那样我们同样会得到类似的曲线,那我们也可以通过这种方式得到最适合模型的参数。在训练数据上参数越多,错误率越低,但在测试数据上错误率就先减小后增大。

对于正则也一样,也可以得到类似曲线,比如l2-norm,x轴我们也可以理解成λ值,我们调节λ越大,模型就会越简单,λ越小,模型会变得越来越复杂

发表评论

登录后才能评论
网站客服
网站客服
申请收录 侵权处理
分享本页
返回顶部