大白话5分钟带你走进人工智能-第31节集成学习之最通俗理解GBDT原理和过程

目录html

一、前述算法

二、向量空间的梯度降低:app

三、函数空间的梯度降低:函数

四、梯度降低的流程:工具

五、在向量空间的梯度降低和在函数空间的梯度降低有什么区别呢?学习

六、咱们看下GBDT的流程图解:测试

七、咱们看一个GBDT的例子:优化

八、咱们看下GBDT不一样版本的理解:url


一、前述

从本课时开始,咱们讲解一个新的集成学习算法,GBDT。spa

首先咱们回顾下有监督学习。假定有N个训练样本,$\{(X(1), y(1)),(X(2), y(2)), \cdots,(X(m), y(m))\}$, 找到一个函数 F(x),对应一种映射使得损失函数最小。即:

                                                                                F^{*}=\underset{F(X)}{\operatorname{argmin}} L(y, F(X))

如何保证最小呢?就是经过咱们解函数最优化的算法去使得最小,常见的有梯度降低这种方式。

二、向量空间的梯度降低

咱们想一想在梯度降低的时候,更新w是怎么更新的呢,先是随机找到一个w0,而后举根据梯度降低的迭代公式:     

                                                                     w_{n}=w_{n-1}+\left(-\lambda \frac{\partial L\left(y, w_{n-1}\right)}{\partial w_{n-1}}\right)

详细解释下这个公式,其中

                                                                                              -\lambda \frac{\partial L\left(y, w_{n-1}\right)}{\partial w_{n-1}}

意思是把损失函数先对w进行求导,获得一个导函数,或者说获得一组导函数,由于w是多元函数,获得了一组导函数以后,再把Wn-1这一组w带进去,获得一组值,这组值咱们称做梯度,把梯度加个负号就是负梯度,乘一个λ是学习率。 这个公式总体的意思是 我只要把w加上一个L对于w的负梯度,把-\lambda \frac{\partial L\left(y, w_{n-1}\right)}{\partial w_{n-1}} 做为∆w,加到原来的w上,新产生出来的w就是比原来的w要好一些,能让损失函数更小一些,这就是对于w参数的一个提高。因此接下来咱们的迭代步骤就是w1=w0+△w0,w2=w1+△w1=w0+△w0+△w1,这里是把w2用w1表示出来。w3=w2+△w2=w0+△w0+△w1+△w2,....因此最终的wn能够表达为wn=w0+△w1+△w2+...+△w(n-1)。通常状况下咱们初始的时候w0=0。因此最后能够表达为

                                                                                             w_{n}=\sum_{t=0}^{n} \Delta w_{t}

这就是向量空间的梯度降低的过程。所谓向量空间的梯度降低,为何叫作向量空间的梯度降低,由于w是一组向量,咱们是在w上给它往降低因此称为向量空间的梯度降低

三、函数空间的梯度降低

这里面的F*在假如逻辑回归里面就是1/1+e^-z。在其余算法里各自对应其损失函数。对于决策树来讲,树其实也是有损失函数的,好比咱们以前在后剪枝的时候,一般作法就是,拿测试集或者验证集去检验一下我cancel掉叶子节点会不会变好一点,但实际上还有另外一种减枝方式,就是根据损失函数来的,别管损失函数是什么,它是一个L,L跟x有关的,跟叶子节点的数量T有关,表达为L (x,T)。T至关于一个正则项,叶子节点算的数量越多,它的损失函数就越大,它不想让树太复杂了,经过剪枝剪一次去去看损失函数,是上升了仍是降低了,若是损失函数降低了,剪枝就认可它,之后就都不要节点了,因此说对于决策树自己是能够定义一个损失函数的,只不过定义出来它意义不大,只能在剪枝的时候看看用来效果怎么样,由于咱们知道损失函数是用来评估结果的,评估你的模型到底怎么样的,那咱们剪枝的时候拿它进行一个评估也是一个比较科学的方法,可是训练的过程当中是用不到损失函数,由于你不知道怎么分裂能够影响到损失函数,因此训练的时候基本都没有提损失函数,而是用基尼系数,信息熵这种变通的方式。另外一方面,树的损失函数也不能直接使用梯度降低来降低这个损失函数,按原来的作法咱们有一堆w把空先给你留好了,而后你找到一组最好的w让损失函数最小就能够了,但树按照这个思路怎么来呢,应该是找到全部可能性的树,挑出一个能使损失函数最小的树,按理说应该这么作,可是这么作不现实,由于树有无穷多个,因此咱们采用其它方式获得一个近似最好的可能性。因此对与单纯的决策树咱们通常不适用损失函数。

可是一旦变成了集成学习,咱们又能够把损失函数又让它重出江湖了。对于决策树咱们不能使用梯度降低的方式,由于在决策树里面损失函数就像一个黑盒,没有具体的参数经过损失函数供咱们优化。可是对于集成学习则可使用,由于集成学习对应着不少树。首先决策树是根据选取的特定条件由根节点开始逐级分裂,直到知足纯度要求或达到预剪枝设置的中止而造成的一种树。那如何选取特定条件? 常见的有:GINI系数, Entropy,最小二乘MSE。而回归树就是每次分裂后计算分裂出的节点的平均值, 将平均值带入MSE损失函数进行评估。而GBDT是一种决策树的提高算法 ,经过所有样本迭代生成多棵回归树, 用来解决回归预测问题(迭代生成的每棵树都是回归树),经过调整目标函数也能够解决分类问题。传统的回归问题损失函数是:

                                                                                                $L=\sum(y -\hat{y})^{2}$

yi是真实的样本的结果,y^是预测的结果。而在集成学习里面,y^就是咱们每一次的预测的G(x),因此如今咱们的损失函数变成yi和大G(x)的一个损失函数了,所以集成学习里面损失函数表达式为L=L(yi,G)。我虽然不能写出来具体的损失函数,可是确定是关于yi和G的一个表达式,我想找到一个最好的大G(x),一步去找,找不到,怎么办,我就分步去找,最开始找到一个G0(x),它通常不是能让损失函数最小的,我知道有梯度降低这个工具,能让它更接近损失函数最低点一些。咱们但愿损失函数降低,但愿每一次能找到一个新的G(x),就像向量空间梯度降低中更新w同样,咱们但愿找到一个新的w,w是损失函数改变的缘由,如今变成了每一次的G(x)是损失函数改变的缘由,每一次的G(x)的改变必定会改变损失函数,G(x)只要它能改变损失函数,损失函数不是上升就是降低。怎么着能让它损失函数下降呢?咱们知道最终的G(x)是一堆g(x)相加,换一个角度来说,第一步迭代咱们获得了一个G1(x)=g1(x),第二步迭代咱们获得了G2(x)=G1(x)+g2(x),第三步就是G3(x)=G2(x)+g3(x),注意这个形式,集成树的每一步迭代形式和梯度降低每一步的迭代形式彷佛很像,咱们注意观察,在梯度降低里,每一步迭代所要加的△w只要是前一项的值带到损失函数里面的负梯度-\lambda \frac{\partial L\left(y, w_{n-1}\right)}{\partial w_{n-1}}=\Delta w_{n},就可让损失函数变得更小。而我如今所谓的集成学习一轮一轮的迭代,第一轮我想加上一个g1(x),第二轮我想再加上g2(x),第三轮我想再加上g3(x),根据梯度降低的原则,加上的每个g(x)等于什么的时候可以让集成学习的损失函数愈来愈小呢?能不能也让它等于损失函数对于上一次的预测总体的结果G(x)这个东西的负梯度?这样损失函数必定会也是降低的。我把G(x)当作一个总体来看待,相似于原先的w变量。反正都是让损失函数改变的缘由。这种梯度降低的过程就称为函数空间的梯度降低过程函数空间的梯度降低是什么意思呢?由于在函数空间中这个函数它写不出来是由什么w组成的,它的最小单位就是这个弱分类器自己,因此咱们只能在函数空间进行梯度降低。

最开始无论用什么方法,已经获得了第一代G0(x),这时能算出来损失函数,它是能让损失函数结果最小的那个G(x)吗?应该不是。咱们但愿把它修改修改,让它变好一些,能让损失函数下降。我令G1(x)=G0(x)加上损失函数对于G0的负梯度,即             

                                                                      G_{1}(x)=G_{0}(x)+\left(-\lambda \frac{\partial L}{\partial G_{0}(x)}\right)

即G1(x)=G0(x)+∆G0,此时的G1(x)就能比G(x)让损失函数变得更低一些了。而后依次G2(x)去迭代。G2(x)=G1(X)+∆G1,∆Gt应该等于损失函数L对于Gt的梯度,即

                                                                                          \Delta Gt= \frac{\partial L\left(y, G \right)}{\partial G_{t}}

只要每次加上的都是∆Gt这么个东西,每一步带入各自的∆Gt,第一次带入∆G0,第二次带入∆G1,以此类推,就能保证最后获得的G一次比一次的可以让损失函数变小。一直到GT(X)=GT-1(X)+∆GT-1。此时GT(X)就是咱们最终要获得的GT(X)。表达以下:

                                                                                        \\G_{1}(x)=G_{0}(x)+\Delta G_{0} \\ \\ \quad G_{2}(x)=G_{1}(x)+\Delta G_{1} \\...\\ G_{T}(x)=G_{T-1}(x)+\Delta G_{T-1}

这里面每一步的所加的∆G不就是集成学习里边每一步加的弱分类器g(x)吗,第一次你但愿加上一个g1(x),第二次加上一个g2(x),一直加到gt(x),最终的大Gt(x)等于什么呢,假设G0(x)=g0(x)=0,Gt(x)=g0(x)+g1(x)+g2(x)……一直加到gt-1(x),这不就是一个另外一个视角看的集成学习嘛。对于最小二乘损失函数来讲,损失函数是:

                                                                                               $L=\sum(y -\hat{y})^{2}$

对y^求偏导就是2(y-y^),一般在前面还有个学习率,假如学习率是1/2的话那么会和2相乘抵消,因此最后的求导结果是y-y^,对于咱们的集成学习来讲y^就是上一步的总体的预测结果Gt-1(x)。因此集成学习的损失函数对G(x)的求导结果就是:

                                                                                 -\frac{\partial L\left(y, G_{t-1}(x)\right)}{\partial G_{t-1}(x)}=y-G_{t-1}(x)

因此在t轮咱们应该训练出的gt(x)的预测结果应该等于y-F_{t-1}(x)。对于决策树算法来讲的话,即为以y-F_{t-1}(x)为新的标签,x为feature,拟合一颗新的决策树。经过这种方式,来训练的G(x),就叫作GBDT

四、梯度降低的流程:

说了这么多,到底什么是梯度降低?所谓梯度降低,也就是对于任何一个函数来讲,只要这个函数是个凸函数,它的自变量是x,也就是说这个函数受x改变而改变,你只要瞎蒙出来一代x,你接下来不停的去迭代,每次迭代的准则就是加上一个函数对上一代自变量的求导,即负梯度,表达为xn=xo-∂F/∂x ,这么不停的迭代,最终获得的x就可以找到F(x)的最小值,这个东西就叫作梯度降低

梯度降低和L-BFGS同样,它就是一个算法,一个函数关于一个变量的算法。每次我就让这个函数加上关于自变量的负梯度,就能让函数愈来愈小。因此我不限制这个变量究竟是w仍是G,只要你这个东西能真真切切地影响个人大小,我去求你的负梯度,就能让你越降越低。这就是随机梯度降低算法的过程。它是不挑食的。

你优化的内容就是你去调整的内容,在函数性模型里,真真正正影响损失函数大小的是w,因此我去调整w,让w始终朝着负梯度的方向去改变,最终就能让损失函数降到最低。而在带着树的集成学习里面,最小的可以调整的单位没有w了,你只能调整你加进来那棵小树,因此你就去优化这棵小树,让你新加进来的小树的预测结果尽可能等于函数空间上的负梯度方向。

其实它比向量空间的梯度降低的运算量至少是要少的,为何呢?由于在向量空间中,w是一个向量,它要求一系列偏导,而在函数空间的梯度降低中,此时的变量就是一个数,因此就是一个求导数的概念了,也就是一维空间的梯度降低,每次加上一个数。


五、在向量空间的梯度降低和在函数空间的梯度降低有什么区别呢?

 

详细解释下:

首先向量空间的梯度降低,翻译是GradientDescent,函数空间的梯度降低,翻译是GradientBoosting,说明是用在Boosting里面的。其次向量空间的梯度降低优化内容是w,而函数空间优化函数F(x) ,为何优化内容不一样,向量空间如LR和线性回归,是有w的,能够优化w,获得model。而函数空间中,如DT,没有w,只能对总体F(x)求导, 认为模型训练内部是黑盒子 只能改变预测值 y^, 输入给训练找到合适的model。向量空间中是对w求导,即

                                                                                   d_{i}=-\frac{\partial}{\partial w} f\left.(w)\right|_{w_{i}}

而函数空间是直接对总体F(x)求导,即

                                                                              g_{m}(X)=\left[\frac{\partial L(y, F(X))}{\partial F(X)}\right]_{F(X)=F_{m-1}(X)}

这里面直接对F(x)求导,而且把上一代的F(x)值给带进去。迭代公式也发生了变化。

向量空间中是w_{i+1}=w_{i}+\rho \cdot d_{i},函数空间中是f_{i}(x)=f_{i-1}(x)-\rho_{i} g_{m}(x)

 

六、咱们看下GBDT的流程图解:

解释下上面流程:

首先训练集x0和y0,我在原始的训练集上训练一个比较弱的决策树,长成了一棵树。这是第一个模型1。经过预测的结果把训练集上的标签转化为X1,Y1。原来Adaboost是改变数据的权重,如今GBDT是改变Y的标签,而后再训练第二个模型,再改变标签。反复迭代下去,将全部的预测结果综合做为最后的预测结果,这就是GBDT的流程。

 

七、咱们看一个GBDT的例子:

 

假如用购物金额和是否常常去百度知道提问这两个条件做为x去判断这我的的年龄,训练的时候我有四条数据,分别是14岁,16岁,24岁和26岁。

我上来想训练出一棵回归树来,在根节点的时候平均值是20。接下来回归树怎么训练?拿什么评估参数?拿mse,抱得最紧的放到一块儿。此时给它一分为二,我发现购物金额小于等于1000和大于1000,可以把14,16分到左边,24和26分到右边。这个树我人为的限制它只容许你有两层。如今左边这个节点输出的结果统统是15,假如4条样本数据分别对应编号是A,B,C,D的话,此时y^A,y^B等于15,y^C,y^D 等于25。

此时y^与真实的y之间有没有残差?有残差,咱们知道负梯度就是残差。接下来我想训练第二棵树,第二棵树但愿输出结果是负梯度,也就是我但愿输出结果是残差。那么我就想要把残差当作label放回到原来去,那么对于这四条数据,它们的y原来是14,16,24,26,咱如今就变成-1,+1,-1,+1 。怎么来的?原本是14,预测成了15,y- y^等于-1;那么原来是24变成25了,它也是-1。

接下来我再根据常常到百度提问做为条件进行一次分类,回归树是无论你的label的,我就想把最接近的给凑到一块儿去,因此接下来就把两个-1凑到一块儿了,把两个+1凑到一块儿了。那么第二代的y^A就等于-1,y^B等于1。由于这两个1分到一块儿,它们平均值也是1就预测准了。 y^C等于-1,y^D 等于+1。

如今两棵树训练完了,最终咱们来一条数据,好比说来一条数据14,它要怎么来作预测?把它丢到第一个树里面,获得一个15;再丢到第二棵树里面,获得一个-1,最终的G=15-1=14,获得一个正确的预测结果。

 

八、咱们看下GBDT不一样版本的理解:

GBDT直观的来看,就是说好比这我的90岁,第一个数给它预测成了78岁,还剩12岁,第二棵树就把12岁做为标准预测,结果它只预测到了十岁,还差两岁。第三个树又根据两岁做为标准,此时再次预测为1.5,第四个树根据0.5做为标准预测结果为0.5,最后四棵数加到一块儿正好是90,每次拟合的都是残差,这是简单版的理解GBDT的过程。

核心版的理解是为何每次要预测残差,由于对于回归问题来说,恰好负梯度等于残差,因此去预测的是残差。由于你的mse带着平方求导就是残差。一般F(x)在相加的时候,会给这残差也乘一个缩水的学习率,好比0.1。第二次虽然预测出12,我只给你加上1.2,防止你走过了,下次从78就变成79.2了,还差一大截的,你第三个再照样去努力预测,再给乘一个缩水系数,跟我们的梯度降低的学习率是如出一辙的。

这个其实是原始的GBDT应对回归问题的时候,可使用简单的把y level作一个替换,去从新训练的这么一种方式。可是对于分类问题,它就很差使了,因此xgboost提供了一个最终版的解决方案。

相关文章
相关标签/搜索