机器学习系列 二 Regression 回归

案例举例

1. 股票市场预估
2. 无人车
3. 商品推荐系统


实际案例:用回归预估宝可梦的cp值(战斗值)
野外找到一只妙蛙种子, 喂一些糖,让他成长

找一个function 来对改宝可梦得各种特性x进行进化,输出一个cp值
Xcp, Xw, Xh,Xhp

第一步,给出一些模型,比如

带入b和w的值,如下有n多个可能性,有的带入值合理,有的值不合理。
这样的一个模型,我们称之为线性模型,那么w的权重乘上输入的不同的Xi 得feature,b是偏执量 。

我们有了模型,那么下面去判断各个方程的好坏
我们用上标表示一对数据集,比如每一只宝可梦。
用下标来表示一个feature特性,比如cp值,比如身高和hp值。

现在来抓10只宝可梦的例子, 横轴是初始Xcp,纵轴是进化后的cp值,每个点代表一只宝可能的进化前和进化后cp值得对。
第二步,判断function好不好


下面来进行function好坏的评价,我们一般用损失函数或者代价函数Loss function  L   用来衡量一个function好用还是不好用。
对第一只到第十只宝可梦进行加和。看预测出来的结果 和实际得到的结果有多大差别。最小二乘法计算出差距
带入我们b和w得到如下的loss function




第三步,找一个最好的function
由于b和w的值太多,无法穷举了,所以需要更好地方法来寻找更好地function
我们知道function是由w和b组成的,所以我们要找出一对合适的w、b来让loss function最小。
带入L fucntion后得到上面的function,变成一个优化问题。
使用什么方法来解这个方程呢?线性代数是可以的,但是我们要用更general的方法:gradient descent
该方法的适用条件:只要可以列出L方法,并且loss function L只要是对他的输入参数是可微分的,即可使用该方法,该方法,就是要找到全局最优解,也就是Loss function对于输入参数趋近于0的点对应的参数。

Gradient Descent 梯度下降
梯度下降法举例介绍:
第一个例子
    考虑一个单参数的损失函数 L(w),参数w是唯一参数
    第一步,随机选取一个点w0,
    第二步,计算L对于w在w0这一点的微分,也就是曲线L在W0这一点的切线的斜率。

    第三步,看该点的斜率是正还是负,
如果斜率为正,表明这一点曲线的斜率是上升的,那么我们需要减小W参数的取值,向左侧移动;
如果该点斜率为负,那么意味着曲线在该点是向下倾斜的,那么我们应当增加w的取值,也就是向右侧移动。

    第四步,如果如图示,w0处的微分结果(斜率)是负的(也就是曲线称下降的趋势),那么这个趋势是符合我们去寻找到Loss function的最小点的,我们就需要相应的增加w的取值,让曲线上取的点向右移动。
    假设现在增加了w的值为w1,让他移动到w0的右侧,那么w0向w1的变化就写为如下式子。
使用数学公式来表示w1点相对于w0点的变化
那么为为什么这里要写一个负号呢?是因为,w0点处的微分是负的,我们需要增加w的取值,那么需要让这个的取负数,好让负负得正,加给w0,就得到了增加了的w1的参数值。
(唉塔)被称之为learning rate学习率,决定了学习的速度有多快。

    第五步,同样道理,我们对w1取的微分之后,就可以得到w2的取值。
    一直重复以上的求微分操作,直到一个点wt,微分得0,也就是该点的切线斜率为0,保持水平了, 不能在进行左右移动了
但有个问题是,这个点不一定是全局最小,而是局部最小,所以初始点w0,选择在不同的地方会得到不同的结果,目前来看整个方法是一个看人品的方法......

第二个例子
    考虑有两个参数w和b

    第一步,随机选择w0和b0
    第二部,分别计算L对于(w,b)在(w0,b0)处的偏微分

    第三步,分别计算w1对w0的更新,和b1对于b0的更新
  w0减去 L对w在(w0,b0)的偏微分乘上学习率唉塔,
   b0减去L 对b在(w0,b0)的偏微分乘上学习率唉塔。
    就分别得到了w1和b1.

    第三步, 重复上一步,继续计算w1,b1的偏微分
    那么就得到了w2和b2.

如果将w和b对于L的偏微分合起来写成为一个式子那么写作一个vector:
这样的一个vector 就叫做gradient(梯度),用倒三角形L表示---意思是所有参数对于L的偏微分。

两个参数绘制出来的可能是曲面,所以我们用等高线来表示:
    然后随机选取一个点,w和b分别在该点计算对L进行偏微分,然后再让偏微分的值乘上一个学习率,我们就可以视这个vector为一个向量,那么向量指向的方向,就是它该点梯度下降的方向。并且,这个方向也就是等高线,在该点的法线方向(法线,就是等高线在该点的切线的垂直线)

    然后持续的进行迭代计算下一个点下一个点的偏微分,让Loss function越来越小,直到找到最优点。


问题!!
    假设有n个参数的集合θ, 那么他的损失函数写作
那么按照刚才两个例子,应该有这样的推论:
我们每一次去计算梯度,并且更新的参数集合θ,的到θ1和θ2....直到无法更新,那理论上应该得到Loss Function的最优解L(θn)
那么这个结论对吗?  -- 不一定对
因为在Gradient Descent中梯度为0的点,不一定是全局最小点(global minima),也可能是局部最小(local minima),或者鞍点(saddle point)
也就是说有可能走到一个点的微分是0,但却不是最小极值,只要gradient descent 走到微分是0的点,都会停下来。

另一个问题是,有的时候,我们不会真的让计算到微分为0的时候才停下,而是让计算的微分值非常小的时候,接近一个local minima附近;然而也有一种点非常接近鞍点的时候,微分值也非常小, 却不是接近local minima。如下绿色背景的说明,下降的梯度足够小,但却位于一个高原地带。


不过呢,在做linear regression的时候,不需要太担心这些以上的问题,因为linear regression的曲线都是碗的形状。所以,从碗的任何一个位置选取一个点,他都会走到碗的中心最低点。也就是线性回归问题,都是可以找到最优解的。
但只要是更复杂的model都会遇到这样的问题。


先来接着上面的计算偏微分:

先来计算L对于w的偏微分:

然后计算L对于b的偏微分:


接下来看实际的结果对于下面的直线方程
带入计算后得到的最后最好的w和b的值分别是:
得到的直线方程画出来如下
图上每一个点,代表每一个宝可梦的进化后的实际cp值,这条直线代表对于宝可梦进化后预估计cp值。
那么我们把每一个实际差距到直线的差距算出来,然后把所有点的差距都加起来,就是我们对于training data的平均误差。
但是,对于平均误差,我们并不是非常的在意,而是更在意对于得到这个直线,它去预测将来其他新的宝可梦的cp值到底误差能有多少。也就是这个直线的预测能力。
现在,我们重新找了10只宝可梦,将他们进化后和用直线预测出来的cp值进行对比,我们看到预测的cp值误差大概是35,要比当时对于training data进行的预测要稍微大一些。这样的结果是很合理的。

回顾上面的三个步骤
1. 设定model
2. Loss Function选择
3. 进行Gradient Descent 求最优

看看我们那里可以进行修改的:
1. 先看看model ,我们目前使用的是如下的直线方程
那我们试试看能不能选择其他的model呢?
首先,设计model的时候需要一些domain knowledge,也就是要对该领域有相应认识。
但是如果没有相应的domain knowledge,那就只能尝试。
比如现在尝试假设预测结果是否跟Xcp的二次项是否有关系:
经过带入算出最好的Loss function的b和w1,w2的值如下
得到的是一条曲线,相较于直线,它能够在training 数据上得到更好地贴合。得到的平均误差=15.4,提高很多
那将一些新的测试数据加入进来,我们看到预测的误差率=18.4, 也很不错,要比直线好多了。

补充:
有人会问,这样一个方程是一个linear的模型吗?

先来看线性方程的定义:线性方程是指一次方程,就是未知数都是一次的方程。一般形式ax+by+...+cz = 0。线性方程的本质是方程两边乘以任何相同的非零数,方程本质不受影响。

但这个明明就是一个二次方程啊!
我们所说的线性模型,是指他的参数对于他的输出是否是线性的,我们把Xcp看做是第一个feature,把Xcp的平方看做第二个feature,虽然Xcp和Xcp的平方之间有一定关系,可以写成:y=b + W1X1 +W2X2, 也就是说b 和 w1 、 w2是一次的.....

2.在看model,可不可以更好呢?变成3次曲线试试
现在算下来的training 数据的误差率如下
然后看看testing 数据的误差如下,有优化一点点,但是好像跟二次model没有太大区别    

3.在实验一次四次曲线
发现算下来的training data的误差率时间小了一丢丢
但是发现,测试数据的平均误差竟然达到了28.8,比之前的2次还高
4. 再试试五次方曲线
得到的training 数据的误差好像更小了。
然而这个曲线看上去就不合理,因为预测出来的cp值居然有负数据。结果很差!


为什么会这样?
先看一下在training 数据上的平均误差结果,是越复杂,得到的误差越小
我们对比一下从一次到五次model曲线上,得到的training 和testing数据预测结果来看, 三次曲线model预测结果是最好的。   
所以结论就是,一个越复杂的model并不一定会给我们在测试数据中更好地performance。
这样的事情叫做:overfitting!!
我们并不太在意training 数据上面model的表现,而更在意testing 数据上该model的表现,所以上面的5个model,我们会选择三次方曲线的model。引入了一个问题,要选择适合的模型。

如何解决overfitting的问题呢?
1. 收集更多的数据,        (例如增加训练集数据到60只宝可梦)
2. 是否还有隐藏的较为重要的因素或者feature我们忽略掉了    (例如宝可梦还有许多的种类,我们没有考虑到)


如果没有考虑到重要的因素或者feature,我们就必须回到最初去设计model
按照不同的种类从新根据种类去设计不同的model
那么这样的一个模型,还是我们之前所说的线性模型了吗?
将上面的式子写成这样一个长的方程,只不过我们加入了δ,也就是一个RELU的激活函数,当他是莫衷特定属性时,就=1,如果不是该属性就=0.

使用了新的model后得到的结果, 
因为我们现在有4个式子,我们就可以分别用四条直线,将他们画出来
training data上误差:
testing data 上的误差:


都要好很多。但是现在看还有一部分可以优化的吗?还有其他的隐藏factor吗?

那我们不确定其他比如宝可梦的重量Xw,宝可梦的血量Xhp,宝可梦的高度Xh是否对预测进化战斗力Xcp值有任何影响。
我们先把他们都加入进来进行尝试重新设计model,加入各个特性的平方项。
总共看到的w加起来有14个参数,再加上b有4个, 总共18个参数。
这样用gradient descent 进行计算,算出的training data上误差
然而在testing data上面居然爆掉。

怎么办!!!?????

正则化
因为我们overfitting,所以我们想到,需要换一个loss function
原来的loss function 仅仅去看他的误差有多大
而我们重新设计的loss function,让他加上lambda乘以所有参数的平方和:
不仅如此,我们还希望L 最优最小的情况,那么就是说希望w参数会比较小,最极端情况就是w=0,这样就是一种直线,最平滑的function。那么现实中,我们就希望w参数越小越好,越小就越平滑。
这一项叫做Regularization term 正则项
另外,所谓平滑就是说,对于输入的变化,输出的变化比较小。如果输入跟输出的变化相差较大,那他就不是一个平滑的function,会是一个崎岖的function。
那么给function的两边都同时加上一个delta的值,和一个相对小的w的值,这样的function是比较平滑的。
目前的结论就是,我们不仅需要选择一个误差小的function,我们还需要选择一个smooth的function。

那么为什么要选一个smooth的function呢?有什么意义呢?
因为就像上面的例子中四次方的model会出现一段预测的cp值为负数的情况,这个我们可以比对现实中我们,这种情况可能是不正常的。
所以我们印象中多数情况下,更smooth的function比较有可能是更为正确的。
加入了Regularization项会使得Loss Function在挑选model的时候会忽略掉抖动的比较厉害的function。


那么这个λ叫做正则,就是一个手调参数,这个大小就是希望所挑出来的model有多么的smooth, λ越大找出来的function就越smooth,λ小一点找到的function就会没有那么smooth。

问题:
我们在写这个正则项的时候,我们只考虑了w参数没有考虑bias(b),那么这样是错误的吗?
为什么不考虑bias呢?
实际经验上,给bias加上正则项,其实没有帮助,bias本身就是截距,他自身其实是水平项,对他加上正则化,对于我们整个model的平滑度是没有影响的。给bias增加正则化,只能是让b这一项接近于0,但是对于真正曲线的平滑与否没有影响。

下面是增加了λ后的结果:
然而,我们看到虽然λ越大会带来的曲线model更为平滑, 但是我们却得到了更大的误差,因为最优function他只考虑了找误差最小那一项,现在还需要在照顾到正则项,找smooth。根据目前需求,我们当然会选择smooth和error都同时比较好的结果,这样,在λ=100的时候,我们得到的误差和smooth程度都相对最好。

结论:
那么就是说目前平均误差是11.1,肯定新的测试数据有可能会大于这个误差,下一节课讲解为什么。

阅读更多
个人分类: 机器学习
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭