参考链接:

1. https://medium.com/@cwchang/gradient-boosting-%E7%B0%A1%E4%BB%8B-f3a578ae7205

2. https://zhuanlan.zhihu.com/p/38329631

3. StatQuest with Josh Starmer

4. GBDT退化为AdaBoost原理: https://blog.csdn.net/Liangjun_Feng/article/details/80672144

核心算法思想

Boosting的基本思想是通过某种方式使得每一轮基学习器在训练过程中更加关注上一轮学习错误的样本,区别在于是采用何种方式?

AdaBoost采用的是增加上一轮学习错误样本的权重的策略。

Gradient Boosting中则将负梯度作为上一轮基学习器犯错的衡量指标,在下一轮学习中通过拟合负梯度来纠正上一轮犯的错误。这里的关键问题是:为什么通过拟合负梯度就能纠正上一轮的错误了?Gradient Boosting的发明者给出的答案是:函数空间的梯度下降

函数空间的的梯度下降

首先回顾一下梯度下降 (Gradient Descend)。机器学习的一大主要步骤是通过优化方法最小化损失函数  ,进而求出对应的参数  。梯度下降是经典的数值优化方法,其参数更新公式:

Gradient Boosting 采用和AdaBoost同样的加法模型,在第m次迭代中,前m-1个基学习器都是固定的,即 

因而在第m步我们的目标是最小化损失函数  ,进而求得相应的基学习器。若将  当成参数,则同样可以使用梯度下降法:

对比式 (1.2)和 (1.3),可以发现若将  ,即用基学习器  拟合前一轮模型损失函数的负梯度,就是通过梯度下降法最小化  。由于  实际为函数,所以该方法被认为是函数空间的梯度下降。

Gradient Boosting中第m轮的基学习器$h_m(x)$学习拟合Gradient,将第m - 1轮的学习器 $f_{m - 1}(x)$ 与$h_m(x)$ 组合,即为第m轮的新的学习器 $f_m(x)$。因为新学习器是在沿着L的负梯度方向前进,所以$f_m(x)$的预测结果更接近真实值,损失函数的值会降低,进而提高训练准确率。

line 1 是学习器的初始化,对于有连续值的变量,可以设置初始值为其均值。

line 3 是计算gradient(如果损失函数为MSE,Residual = gradient,下文会介绍)。gradient也是第m轮基学习器的学习目标。(通过给定的x, 预测Residual。注意是预测Residual,而不是真实值$y_i$.)

line 4 是创建这个基学习器,$a_m$是该基学习器的参数。

line 5 是选择学习率,一般设置在0到1之间的小数,避免过拟合。

line 6 是第m轮的学习器$F_m(x)$是第m - 1轮的学习器第m轮基学习器的组合。(学习器是用来预测$y_i$的,基学习器是用来预测$Residual$的,区分开。)

不断迭代,直到达到终止条件:到达M;或者新生成的学习器并不能对降低L有很大帮助。

-----后文是详细的介绍------------------------------------

什麼是 Boosting

在機器學習中,Boosting 是一種透過組合一群 Weak Learners、嘗試改進每一次的錯誤、從而獲得一個 Strong Learner 的方法,大致上的核心思想就是「知錯能改的三個臭皮匠勝過一個諸葛亮」。

Weak Learner 指的是「比亂猜好一點」的模型,這種模型的好性質包含:複雜度低、訓練的成本低、不容易 Overfitting,例如 Decision Stump(決策樹墩?),這個模型其實就是把 Decision Tree 的深度限制在一層,可想而知,只能切一刀的 Decision Tree 大概不會太好用,但是它卻滿足 Weak Learner 的性質,能夠快速的訓練、並且做出的預測能夠比亂猜好一些。

當使用 Weak Learner 作為 Boosting 的 Base Learner,我們除了能夠快速的訓練出許多模型來組合外,Weak Learner 的低複雜度也為我們帶來一個好性質:最終組合出的 Strong Learner 能夠對 Overfitting 有良好的抵抗性。

Gradient Boosting

這篇要介紹的 Gradient Boosting 除了 Boosting 一般擁有的性質外,還具備一些好處:

  1. Gradient Boosting 可以應用在許多不同的(可微分)Loss Function 上
  2. 利用不同的 Loss Function,我們可以處理 Regression / Classification / Ranking 等不同的問題

我們接著先以一個簡單的 Regression 問題作為例子介紹 Gradient Boosting,同樣的概念並不局限於 Regression、可以輕易地推廣到不同的 Loss 及不同的任務上。

以 Regression 為例

任务:预测weight

实现步骤:

Residual 和 Squared Error 的关系

上述的例子雖然展示了 Gradient Boosting 的簡易做法,卻沒有把兩件事情說清楚:

  1. 為什麼我們明明想優化的是 MSE 卻著手於 Residual,除了「知錯能改」這樣的直覺外,有沒有能數學化的理由?
  2. 既然我們用的是 Residual,為什麼不叫 Residual Boosting 而要叫 Gradient Boosting,說好的 Gradient 呢?

在回答這兩個問題前,我們先對要優化的 MSE Loss 稍做手腳,首先把 Squared Error 除以二:

L(y, F(x))= (y−F(x))²/2

接著對 L(y, F(x)) 中的 F(x) 做偏微分,得到

∂L/∂F = −(y−F)

也就是說,在使用 MSE Loss 的情況下,Residual 正是 Loss 對 F 的 Gradient 取負號(在 x 處取值)。

在繼續說下去之前,我們稍微岔開話題介紹一下 Gradient Descent。

Gradient Descent 101

Gradient Descent 是一個在最佳化領域相當常見的迭代方法,用於尋找「可微分函數」的局部最小值,它的做法是這樣的:

  1. 假設我們要最佳化的目標函數是 L(x),例如要找 L(x) 的最小值
  2. 隨機選取一個起始點,例如從 a 出發
  3. 從 a 沿著 −∇L(a)走一小步,即 a−γ∇L(a)
    此處的 ∇L(a) 代表的是 L 在 a 上的 Gradient
    那麼對於一個夠小的 γ,此處的函數值將小於等於 L(a)
  4. 換句話說,對於一個夠小的 γ,我們有
    L(a)≥L(a−γ∇L(a))
  5. 令 a−γ∇L(a) 為新的出發點,重複 3–4
  6. 根據這樣的方法,從 a 開始一步一步走(迭代),在 γ 選取適當的情況下,我們可以找到 L(x) 的局部最小值

在許多機器學習的演算法中,Gradient Descent 扮演的角色是迭代地找到最好的參數:假設需要優化損失函數 L(θ) 是參數 θ 的函數,那麼對於某些品性良好的 L(θ),我們只需要隨機地找一個出發點 θ,並沿著 Gradient 的方向持續更新 θ,便能降低損失函數的值。而這個「沿著 Gradient 的方向更新 θ 」的過程,其實也就是我們常說的 Training。

Gradient Descent 與 Gradient Boosting

了解 Gradient Descent 可以用於「優化」目標函數的值之後,我們就可以嘗試回答先前提到的問題:「為何用 Residual 來優化 MSE?」、「Gradient Boosting 的 Gradient 是從哪來的?」。

前面提到,Residual 正是 Loss 對 F 的 Gradient 取負號:

y−F=−∂L/∂F

如果我們把 H(x)=F(x)+h(x) 視作對 F(x) 的「更新」,那麼根據 h(x)≈y−F(x)=−∂L/∂F,其實我們做的正是上述 Gradient Descent 中的第三步:

H(x)=F(x)−γ∂L/∂F,
where γ=1

這就回答了為什麼我們能夠透過 Fit Residual 來優化 MSE:因為從 F(x) 沿著這個方向走得到的 H(x) 能夠降低損失函數 MSE 的值。

在一般的機器學習演算法中,我們透過對演算法的參數 θ 做 Gradient Descent 以學出能使「損失函數」達到局部最小值的參數。而在 Gradient Boosting 中,我們的參數其實就是模型的預測值 F(x),並且我們透過 Base Learner 來學出近似的−∂L/∂F。

當我們從 Gradient Descent 的角度來看 Residual 之後,事情就變得有趣一些了:我們知道 Residual 是 Squared Loss 的 Gradient,那麼如果衡量模型優劣的損失函數被換掉了,只要它還是滿足 Gradient Descent 需要的好性質,那麼我們一樣可以計算這個 Loss 對 F(x) 的 Gradient,並讓這個 Gradient 作為 Base Learner 的學習目標。這也是為什麼不叫 Residual Boosting 而叫 Gradient Boosting — 只是在 MSE 的情況下,負 Gradient 剛好是 Residual 而已。

寫在後面

  1. 在第一個例子中的 F(x)+h(x)+m(x)+… 這樣能夠加在一起的模型,一般我們稱之 Additive Models
  2. Gradient Descent 中控制步伐大小的 γ 稱作 Learning Rate,不見得要用 1 來 Update,只是在我們的例子中用 1 比較方便而已
  3. 上述的 Gradient Boosting 只是一個雛形,實際上我們還能透過使用 Adaptive Learning Rate、或是類似 Random Forest 使用的 Data Subsampling 來進一步優化這個演算法。

[ML] Gradient Boost的更多相关文章

  1. Gradient Boost 算法流程分析

    我们在很多Gradient Boost相关的论文及分析文章中都可以看到下面的公式: 但是,对这个公式的理解,我一直也是一知半解,最近,终于下决心对其进行了深入理解. 步骤1:可以看作优化目标的损失函数 ...

  2. GBDT(Gradient Boost Decision Tree)

    原文:http://blog.csdn.net/aspirinvagrant/article/details/48415435 GBDT,全称Gradient Boosting Decision Tr ...

  3. CART分类与回归树与GBDT(Gradient Boost Decision Tree)

    一.CART分类与回归树 资料转载: http://dataunion.org/5771.html        Classification And Regression Tree(CART)是决策 ...

  4. Gradient Boost Decision Tree(&Treelink)

    http://www.cnblogs.com/joneswood/archive/2012/03/04/2379615.html 1.      什么是Treelink Treelink是阿里集团内部 ...

  5. Gradient Boost Decision Tree(GBDT)中损失函数为什么是对数形式

    由于最近要经常用到XGBOOST的包,不免对相关的GBDT的原理又重新学习了一遍, 发现其中在考虑损失函数的时候,是以对数log进行度量的,囿于误差平方和函数的印象 那么为什么是对数呢?可能是下面的原 ...

  6. [ML] Gradient Descend Algorithm [Octave code]

    function [theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters) m = length(y); % n ...

  7. Python中Gradient Boosting Machine(GBM)调参方法详解

    原文地址:Complete Guide to Parameter Tuning in Gradient Boosting (GBM) in Python by Aarshay Jain 原文翻译与校对 ...

  8. Gradient Boosting Decision Tree学习

    Gradient Boosting Decision Tree,即梯度提升树,简称GBDT,也叫GBRT(Gradient Boosting Regression Tree),也称为Multiple ...

  9. How to Configure the Gradient Boosting Algorithm

    How to Configure the Gradient Boosting Algorithm by Jason Brownlee on September 12, 2016 in XGBoost ...

随机推荐

  1. OAuth授权看这篇就够了

    OAuth授权看这篇就够了

  2. 怎样使用 ssh 命令远程连接服务器?

    以 Git Bash 和 阿里云 ECS云服务器 为例, 想要进行远程连接, 可以使用 ssh 用户名@服务器IP 进行连接. 如下: 注意: 1. 密码输入时是没有提示的 2. root 是超级管理 ...

  3. python 访问权限

    访问权限 权限: 公有的:类中的普通属性和方法,默认都是公有的,可以在类的内部.外部.子类中使用 私有的:定义是在前面加两个'_',只能在本类的内部使用,不能再外部及子类中使用 示例: class P ...

  4. python+opencv+sift环境配置教程

    最近在做对应点估计homography,需要用到opencv,c++的接口不如python的接口来的方便 但是在安装python接口的opencv的时候,遇到了各种问题,主要是函数找不到的问题 比如在 ...

  5. 自己Linux东西存放情况

    elasticsearch /home/panfeng 包含了 elasticsearch 和 ik分词器 FastDFS https://www.cnblogs.com/taopanfeng/p/1 ...

  6. QQ大盗 - 巧用clientkey

    场景: 1.将程序发给好友,好友打开 qq昵称就会被秒改为”账号已被盗“. 2.将程序运行在自己的电脑,让那些随意借用电脑看片聊天的室友产生一个觉悟:乱使用别人电脑很可能会泄露隐私. 思路: 通过数据 ...

  7. Delphi 图形图像对象组件

  8. DNS负载均衡与NGINX负载均衡策略

    负载均衡是指的是把请求均匀的分摊到多个服务器上处理.一般常见的负载均衡有两种:①客户端与反向代理服务器之间的DNS负载均衡②反向代理服务器与应用服务器之间的负载均衡(这种负载均衡有很多,可以是webl ...

  9. 使用ViewFlipper实现图片轮播

    public class MainActivity extends AppCompatActivity { private ViewFlipper flipper; //背景图片int[] id pr ...

  10. 开源框架相关面试问题-retrofit网络框架面试问题讲解

    retrofit使用简介: 在retrofit中通过一个接口作为Http请求的api接口.注意:@GET("url")中的url只是一个路径,不包含主机号的. 创建一个retrof ...