课前小例子
各位同学上一节课我们讲解了一个多分类的问题,让我们从现在开始会讲一些在深度学习中间时候的一些小技巧这些小技巧可是帮助大家理解深度学习一个非常必要的环节,首先我们来看第一个深度学习中存在的一个问题就是过拟合和和欠拟合。
在讲解过拟合和和欠拟合之前,我们来讲一个数据的真实的模态,
我们把它一个叫做数据的真实分布
那么我们来看第一个例子就是房价例子,然后房价的这个x坐标表示它的房子的面积,因此这里的面积就是area的意思,平方的面积,然后这边的y表示价格,我们可以很好的知道房子的面积和价格是一个这样的线型的模型,它就是面积越大,然后房价越高,它这个模型她为什么是线性的模型呢?因为我们的房价定义的时候就是这么定义的,我们就是一个面积乘一个倍数,然后可能再加上一个偏置,会得到一个房价的一个生产的一个房价的一个价格,这是一个非常简单的线性模型,我们不管是根据这个,不管是根据我们人的经验来说,还是根据这个数据的分布来说,我们都能够一眼的就推测出来,房价跟面积就是一个非常简单的线性模型,
那我们再来看一个非线性的模型,
就比如说我们一个班级的一个GPA,然后他 的x坐标就是你的GPA,我们这里就忽略一下具体数字,就比如说是三年级啊,四点几的样子,然后他的y坐标就是对应的,GPA,对应的一个人数吧,我们可以看到基本上在GPA中间,比如说在三左右指人数是比较高的,然后3到4。3.5以上就是比较优秀的学生,学霸啊,这个区域就是学霸这个区域的话,学生比较少。对于学渣来说也比较少,大部分的人都是普通人,他们成绩可能就在这个区间里面,这也是我们老师给分的时候,一个原则就是给分的时候,尽可能的让你中间的分数让70分到80分的时候稍微多这样子的话根据他们的这种先验 ,她们生成这个分数也会符合这个分布,我们一般来讲,是把它近似于一个高斯分布。所以的话,我们可以把学生的一个班上的或一个学校里面的GPA一个成绩的G点的分布,理解为一个高斯分布。
对于我们之前提到两种情况,要么就是我们能够很清楚地知道它一定是属于线性分布
,就比如说那个房价和面积,或者是根据我们的这种经验来说,发现她的成绩和学生的数量基本上是属于一个这样的高斯分布,这两种情况,我们。在某种场合都可以说,我们已经提前知道了这个数据的分布,只是我们不知道这个模型的具体参数就比如说你这个房价倍率,这比如说你这个房价的倍率是多少,然后你这个学生的高斯分布的均值在哪里?到底是70分还是80分呢?还是85分呢?或者说你考试的难度不一样啦,会造成这个均值和方差的改变,对吗?
在我们已经知道了模型的类型,或者说我们已经知道了这一个,或者说我们已经知道这个分布的类型,这个分布的风格,那么我们只需要预估这个分布的参数时候,这种情况是非常非常的简单的,但是现实生活中,对于一些具体的问题来说,我们往往是不知道他具体的一个模型的类型的,就比如说一个非常简单的, 0到9的一个数字识别,你能告诉我你是怎么识别出零?你是怎么识别出一的吗?或者说,你能告诉我你识别了这种方法,或者说mapping,他是几次方的几次方二次方三次方,还是N次方。很明显我们一无所知,因为我们人本身对我们人脑的一个工作模式,或者说对我们人的智能的一种模式都不是很理解,所以我们去解释深度学习的时候就发现我们解释不了?这也是合情合理的,OK,
我们回到正题,至于说我们真实的这个分布,如果他是不知道的,我们不但连他的参数不知道,θ参数是不知道,连他的一个风格,连他的一个次方或说一个类型,我们都不知道。那么这种情况下面我们怎么来解决这一个问题呢?
我们不但是对px的类型不知道,而且我们观察的时候还会有一个观察的误差,对吗?就比如说,我们即使已经是知道了房价的面积,和以及房价的具体价格,那我们这个价格和面积,他一定是完整 的按照我们的w和b的参数进行设置的吗?很明显不是 。 每个地方,比如说你量面积的时候,就会有一个测量误差按你房价的时候也会有个取舍误差,或者说你做活动呀,然后不同的顾客类型呢,你都会有误差,我们把统一误差合并到一个因子上面去,比如说我们把这一个误差把这个噪音把它理解为抽象为一个复合一个分布的最简单的情况,就是说它符合一个均值近似于0的一个高斯分布 。这样子的话,我们拿到了数据,他有可能就不是真正正确的数据,它就包含了不同的类型的eps,eps的大小,还不太一样,只是他符合同一个分布,然后的话,这种情况下面,如果我们只用两个点来预估的话,它存在的噪声随机性是稍微比较大的,所以我们才需要更多的数据来做一个分布,而且如果你拿到一个少量点的话,你可能会觉得他不只是不是符合一个线性模型?对吗?因为只观测到了一个少量的样本,你可能觉得它的波动性比较大,这样子的话,你就不会优先尝试去用一个线性去预估它,你可能会用什么模型呢?
你可能会用wx的平方,加上bx+c这种模型去模拟他这个数据的分布,现在我们来对模型本身来做一个度量 什么意思呢?就是说我们用一个模型去学习到一个数据的分布的时候,我们会优先的选择不同类型的模型,就比如说对一个多像素来说,他们可能会使用一个常数,这样的模型去学习也有可能使用的一次方也有可能使用一个二次方,或者是最糟糕,遭到大使用一个高次方N次方N次方,那么不同类型的不同次方的一个多项式的模型,他代表图形,大家可以看得到,对于你高次方越高的话,他的这个抖动就越大,他的这个波形就越复杂,对嘛?我们来看一下怎么衡量不同类型的模型的一个这样的学习能力来我们把他叫来名字叫做model capacity,
基本上可以看到对一个常数的模型来说,她的学习能力是非常非常弱的,如果它基本上因为只有一个参数,所以说它能够学习到的这个参数非常少的,像当你的次方增加的时候增加了N次方的时候,你这个网络的表达能力更强了,你能够表达的那个分布的情况就更复杂了,对于一些非常非常复杂,非常抽象的一些映射,你也能够很好的学习到这种情况下面,我们就讲这个模型的表达能力变强了,也就是我们把它叫做model capacity也就这个模型的能力,capacity的容量变大了,或者说这个模型搜索空间变大了,只是说这个搜索空间,他因为是连续的,
现在的深度学习,当你变得越来越深,他从另外一个方面也反映了我们的model capacity能变得越来越大了,比如说你只有八层的时候,你的参数量可能是60M,然后当你19层的时候你参数可能是200多M,我是假设的,然后当你的参数量变成152层的时候,你这个时候你的显卡就需要很大很大显存,因此你这个参数可能是上GB这种情况下面你的参数量越大可能会更加类似于那种多项式的一个类别,你就多项式的次方就越高,因此你真的模型表达能力越强,只要你这个模型能够很好的优化的话,那你优化出来的最终一个结果,他肯定是比你一个19层的啊,比八层的一个学习能力是更强的,它能够抽象出一些更高维度的一些特征,能够做一些更高维的一个类比。
那我们看两种情况,
第一种情况是什么呢?就是我们用的模型,我们estimated的是什么?
我们用的模型的本身的一个capacity只有我们用的模型的一个表达能力小于他真实的一个模型的一个复杂度,这是什么意思呢?其实我们真实的,也不知道我们这里只是做一个非常形象,一个这样的比较。假设我们已经知道了,比如说我们这里的GPA的分布,
我们已经知道了这个GPA的分布,它就是一个高斯分布,然后当我们知道了这个ground-truth,就是分布的一个复杂度的时候,我们用一个比较简单的这个简单的这个模型的复杂多,这个模型的能力比你真实的要少一些,这种情况就是我们这个案例里面讨论的情况,这种情况我们给它起一个名字,叫做under-fitting 。under到底的是什么呢?我们用的模型的复杂度会小于真实的一些数据的复杂度,这种情况会造成我们这个模型的表达能力不够,就好比你一个小朋友一样,你小朋友们的英语可能只学了一些基本的词汇量,词汇量可能就在三四百的样子,但是现实生活中,我们成人会说一个18岁,18岁小朋友,他们词汇量接近于一万左右,这样子的话,你一个七八岁小朋友跟一个18岁小朋友去聊天的时候,你会发现这个七八岁小朋友,他的表扬能是非常非常非常弱的,他只能说一些基本的词汇,它不能表达出一些很高级的情绪,这样子他就去跟18岁的小朋友,18岁的青年人沟通时,他就会有一个表达能力不足,
还有另外一个例子就是现实中遇到例子,他在我们后面会讲的WGAN,
应该早期版本,他也是下来给约束,会把你模型的复杂都给约束下来,这样子的话,本来是一个比如说我们这里是一个八个高斯的mixed-model,你看一下是稍微来说比较漂亮,比较复杂,对不对?但是如果你对了这个模型的复杂度做了约束的话,导致你这个模型的表达你不够强,因此你学到了这个patient就是一些比较简单,比较直接的,他很可能就不能够表达这么复杂的,这么精美的一个结构出来。
Under-fitting怎么体现出来呢Under-fitting就是说我们在training的时候呢?
训练的精度和训练的loss都不是很令人满意,我们看一条曲线,比如说他出现是。你正常的一个比较好的training?然后你training的loss就会下降,对不对
这些局限性比较好的一个情况?然后如果您属于under-fitting,你的精度,所以可能会出现什么呢?会一直到了这个情况也再也上不去了,就是你的training的精度,肯定会比较低,然后你training的loss以后在一个情况一直下不去,因此这个地方这两条线就叫做under-fitting ,然后同样的道理,你即使是training的test的精度、test的loss也会很差,因此对于under-fitting的话,就不大好检测,如果你的两个两项指标都不好,就你training的时候也train不好,test的时候更别说也train不好,这种时候你就会尝试着去把你的模型复杂度,会增加一下,就比如说你会堆叠更多的层数呀单元数量会增加,你通过这种方式增加了你模型的复杂度,以后你尝试着看这个情况是不是得到改善,如果得到改善,那意味着您之前的情况,那就是你的模型复杂度小于一些实际的数据和模型复杂度,这样子的话,你就需要增加你的模型的复杂度。
然后与刚刚
under-fitting相反的就是另外一种情况是什么意思呢?
我们来看一下,同样的是,对于这个GPA的例子,这个GPA的例子,我们很明显这条蓝色的线是比较圆滑的,可以勾勒出整个的一个GPA的一个重要分布的情况,这条颜色的线,大家有没有发现他他在train的时候?
他除了比你这条线以更光滑以外,他开始慢慢地地慢慢地或者说每一种情况都勾勒出来,他会慢慢的接近于每一个点,会把每一个点都穿过,这种情况就是他过分的把这个噪声给包含进来了,你看一下边缘的情况,边缘的情况,他为了拟合你这个点它升值到这里来了,就是完全没必要,这种情况就是什么意思呢。
就是说我们的使用的模型的复杂度是大于我们真实的模型复杂度,这样子他要train的时候,她训练就发现为了让你的loss更低,他就会尝试着去把每一个点的loss会降低这样子的话,他会去逼近于每一个点,大家发现没有,本来这条线走中间就可以了,但是为了让她的loss更低的话,他就开始穿过每一个点穿过每个点穿过每一个穿过每一点,这种情况会使得你的training的情况特别特别好,因为你现在看到这个黑色的点就是training的一点,对吗?他会穿过每一个点或尝试就是靠近每个点这样子的话,你training的时候的精度可能都会变的很好,但是如果我们test的点大家看一下这个test的点,
test的点也是随机散布出来的吧,他有可能跟train的点并不在同一位置,而且很有可能就不在同一位置,因为它是均匀的分布在俩侧,如果我们看一下对于红色的点,它是分布在这个位置的话,你去逼近这个点的时候,你就会远离这一点,对吗?你是毕竟这个点的时候,你就会远离这一个点,所以的话,它会造成一种情况就是在你训练的时候发现性能很好,但是你test的时候会做验证的时候就非常非常非常不好,这种情况就知道over-fitting,然后over-fitting表现出来就是我们刚刚讲的training的时候效果特别好,但是test的时候,效果不好,然后我们换了另外一个词,我们把over-fitting的话叫另外一个名字叫做什么?Generalization performance,也就是泛化能力,当你的over-fitting严重的时候,你的方法,能力都会变差,这种情况就是我们不想要看到的OK,我们来现场做一个总结,
如果你数据分布是一个这种分布的话,你用应该简单的模型,那就是under-fitting。用应该复杂的模型,那就是over-fitting,现实生活中更多的是over-fitting,因为我们现在的计算机的计算能力得更强了,我们能够优化的网络的复杂度会变非常非常的深,非常非常宽,这样子的话,你很容易网络表达能力就超过了你现在的一个模型的能力,这里需要区别一下,我们这里讲的模型的能力一般指的是在给定的,有限数量有些数据集在下面的一个模型的能力就是你数据集足够多的话,那可能他就不会over-fitting了,如果你数据集有限的话,那他因为包含了噪声,你就很容易很容易的over-fitting,所以的话,我们要解决两个问题,第一个是怎么检测over-fitting第二个是怎么减少over-fitting,我们在下一节课通过数据集之间划分来检测有没有over-fitting。