[ML] Gradient Boost
参考链接:
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 一般擁有的性質外,還具備一些好處:
- Gradient Boosting 可以應用在許多不同的(可微分)Loss Function 上
- 利用不同的 Loss Function,我們可以處理 Regression / Classification / Ranking 等不同的問題
我們接著先以一個簡單的 Regression 問題作為例子介紹 Gradient Boosting,同樣的概念並不局限於 Regression、可以輕易地推廣到不同的 Loss 及不同的任務上。
以 Regression 為例
任务:预测weight

实现步骤:




Residual 和 Squared Error 的关系
上述的例子雖然展示了 Gradient Boosting 的簡易做法,卻沒有把兩件事情說清楚:
- 為什麼我們明明想優化的是 MSE 卻著手於 Residual,除了「知錯能改」這樣的直覺外,有沒有能數學化的理由?
- 既然我們用的是 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 是一個在最佳化領域相當常見的迭代方法,用於尋找「可微分函數」的局部最小值,它的做法是這樣的:
- 假設我們要最佳化的目標函數是 L(x),例如要找 L(x) 的最小值
- 隨機選取一個起始點,例如從 a 出發
- 從 a 沿著 −∇L(a)走一小步,即 a−γ∇L(a)
此處的 ∇L(a) 代表的是 L 在 a 上的 Gradient
那麼對於一個夠小的 γ,此處的函數值將小於等於 L(a) - 換句話說,對於一個夠小的 γ,我們有
L(a)≥L(a−γ∇L(a)) - 令 a−γ∇L(a) 為新的出發點,重複 3–4
- 根據這樣的方法,從 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 而已。
寫在後面
- 在第一個例子中的 F(x)+h(x)+m(x)+… 這樣能夠加在一起的模型,一般我們稱之 Additive Models
- Gradient Descent 中控制步伐大小的 γ 稱作 Learning Rate,不見得要用 1 來 Update,只是在我們的例子中用 1 比較方便而已
- 上述的 Gradient Boosting 只是一個雛形,實際上我們還能透過使用 Adaptive Learning Rate、或是類似 Random Forest 使用的 Data Subsampling 來進一步優化這個演算法。
[ML] Gradient Boost的更多相关文章
- Gradient Boost 算法流程分析
我们在很多Gradient Boost相关的论文及分析文章中都可以看到下面的公式: 但是,对这个公式的理解,我一直也是一知半解,最近,终于下决心对其进行了深入理解. 步骤1:可以看作优化目标的损失函数 ...
- GBDT(Gradient Boost Decision Tree)
原文:http://blog.csdn.net/aspirinvagrant/article/details/48415435 GBDT,全称Gradient Boosting Decision Tr ...
- CART分类与回归树与GBDT(Gradient Boost Decision Tree)
一.CART分类与回归树 资料转载: http://dataunion.org/5771.html Classification And Regression Tree(CART)是决策 ...
- Gradient Boost Decision Tree(&Treelink)
http://www.cnblogs.com/joneswood/archive/2012/03/04/2379615.html 1. 什么是Treelink Treelink是阿里集团内部 ...
- Gradient Boost Decision Tree(GBDT)中损失函数为什么是对数形式
由于最近要经常用到XGBOOST的包,不免对相关的GBDT的原理又重新学习了一遍, 发现其中在考虑损失函数的时候,是以对数log进行度量的,囿于误差平方和函数的印象 那么为什么是对数呢?可能是下面的原 ...
- [ML] Gradient Descend Algorithm [Octave code]
function [theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters) m = length(y); % n ...
- Python中Gradient Boosting Machine(GBM)调参方法详解
原文地址:Complete Guide to Parameter Tuning in Gradient Boosting (GBM) in Python by Aarshay Jain 原文翻译与校对 ...
- Gradient Boosting Decision Tree学习
Gradient Boosting Decision Tree,即梯度提升树,简称GBDT,也叫GBRT(Gradient Boosting Regression Tree),也称为Multiple ...
- How to Configure the Gradient Boosting Algorithm
How to Configure the Gradient Boosting Algorithm by Jason Brownlee on September 12, 2016 in XGBoost ...
随机推荐
- 富文本二进制转换成string
].KindExplain); ) { explainString = explainString.Substring(, explainString.IndexOf() + , explainStr ...
- 帝国cms常用标签
.loop获取时间标签 /*获取年月日,时分秒.可以按照自己的需求单独获取年,或者月.*/ <?=date("Y-m-d H:i:s",$bqr[newstime])?> ...
- ubuntu - 14.10,解决按照最新版Gnome 15.10后,经典Gnome桌面字体问题!
ubuntu14.10刚安装完毕,我首先按照了经典Gnome桌面,随后我发现ubuntu软件中心里面能找到的软件明显不如先前我安装过的ubuntu了,我觉得有可能是因为我以前安装的ubuntu14.1 ...
- 《python解释器源码剖析》第1章--python对象初探
1.0 序 对象是python中最核心的一个概念,在python的世界中,一切都是对象,整数.字符串.甚至类型.整数类型.字符串类型,都是对象.换句话说,python中面向对象的理念观测的非常彻底,面 ...
- window dos 下批量删除docker 容器
>dokcer ps -a -q> 1.txt (写入所有已暂停容器id) >for /f %a in (1.txt) do docker rm %a for 循环 /f ...
- Hadoop_07_HDFS的Java API 操作
通过Java API来访问HDFS 1.Windows上配置环境变量 解压Hadoop,然后把Hadoop的根目录配置到HADOOP_HOME环境变量里面 然后把HADOOP_HOME/lib和HAD ...
- [AWS - EC2] 如何向 Amazon Linux 2 实例传输文件,下载文件。How to send/ download files from Amazon Linux 2 Instance
1. 需要: 安装 WinSCP 2. 需要: PuTTY 生成的ppk格式密钥, 没有的话请移步此文章,完成1, 2, 3步即可. 3. 打开 WinSCP , 如果提示已经有PuTTY配置是否导入 ...
- elk快速入门-Logstash
Logstash1.功能:数据输入,数据筛选,数据输出2.特性:数据来源中立性,支持众多数据源:如文件log file,指标,网站服务日志,关系型数据库,redis,mq等产生的数据3.beats:分 ...
- BZOJ 1006 完美消除序列&最大势算法&弦图
K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系等等的存在.所谓N边关系 ...
- TCP的ACK原理和延迟确认机制
某天晚上睡觉前突然想到 tcp的ACK确认是单独发的还是和报文一起发的,下面看一下别人的解答 一.ACK定义TCP协议中,接收方成功接收到数据后,会回复一个ACK数据包,表示已经确认接收到ACK确认号 ...