【论文笔记】XGBoost论文阅读笔记

2. xgboost模型

L ( t ) = ∑ i = 1 n l ( y i , y ^ i ( t − 1 ) + f t ( x i ) ) + Ω ( f t ) L^{(t)} = \sum_{i=1}^n l(y_i, \hat y_i^{(t-1)} + f_t (x_i) ) + \Omega(f_t) L(t)=i=1nl(yi,y^i(t1)+ft(xi))+Ω(ft)
损失函数二阶泰勒展开
L ( t ) = ∑ i = 1 n [ l ( y i , y ^ ( t − 1 ) ) + g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f t ) L^{(t)} = \sum_{i=1}^n [ l(y_i, \hat y^{(t-1)}) + g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i) ] + \Omega(f_t) L(t)=i=1n[l(yi,y^(t1))+gift(xi)+21hift2(xi)]+Ω(ft),其中 g i = ∂ y ^ ( t − 1 ) l ( y i , y ^ ( t − 1 ) ) g_i = \partial_{\hat y^{(t-1)}}l(y_i, \hat y^{(t-1)}) gi=y^(t1)l(yi,y^(t1)) h i = ∂ y ^ ( t − 1 ) 2 l ( y i , y ^ ( t − 1 ) ) h_i = \partial^2_{\hat y^{(t-1)}}l(y_i, \hat y^{(t-1)}) hi=y^(t1)2l(yi,y^(t1))

去掉当中的常数项
L ( t ) = ∑ i = 1 n [ g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f t ) L^{(t)} = \sum_{i=1}^n [ g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i) ] + \Omega(f_t) L(t)=i=1n[gift(xi)+21hift2(xi)]+Ω(ft)

将正则化项展开
L ( t ) = ∑ i = 1 n [ g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + γ T + 1 2 λ ∑ j = 1 T w j 2 = ∑ j = 1 T [ ( ∑ i ∈ I j g i ) w j + 1 2 ( ∑ i ∈ I j h i + λ ) w j 2 ] + γ T L^{(t)} = \sum_{i=1}^n [ g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i) ] + \gamma T + \frac{1}{2}\lambda \sum_{j=1}^T w_j^2 \\ = \sum_{j=1}^T[ (\sum_{i \in I_j} g_i)w_j + \frac{1}{2} (\sum_{i \in I_j} h_i + \lambda)w_j^2 ] + \gamma T L(t)=i=1n[gift(xi)+21hift2(xi)]+γT+21λj=1Twj2=j=1T[(iIjgi)wj+21(iIjhi+λ)wj2]+γT
其中 I j = { i ∣ q ( x i ) = j } I_j = \{i |q(x_i) = j \} Ij={iq(xi)=j} 表示一个叶子节点 j; q ( x i ) = j q(x_i)=j q(xi)=j 表示一个样本 x i x_i xi经过树结构 q ( x ) q(x) q(x)到达了叶子节点 j j j

那么对于任何一个固定的树结构 q ( x ) q(x) q(x),我们都能够得到叶子节点的最优的权重 w j ∗ w_j^* wj,以及对应的最小损失
w j ∗ = − ∑ i ∈ I j g i ∑ i ∈ I j h i + λ w_j^* = - \frac{\sum_{i \in I_j} g_i}{\sum_{i \in I_j} h_i + \lambda} wj=iIjhi+λiIjgi
L ( t ) ( q ) = − 1 2 ∑ j = 1 T ( ∑ i ∈ I j g i ) 2 ∑ i ∈ I j h i + λ + γ T L^{(t)}(q) = - \frac{1}{2} \sum_{j=1}^T \frac{(\sum_{i \in I_j}g_i)^2}{ \sum_{i \in I_j} h_i + \lambda } + \gamma T L(t)(q)=21j=1TiIjhi+λ(iIjgi)2+γT

这个损失函数有多种用途,例如用来做节点的切分
L s p l i t = 1 2 [ ( ∑ i ∈ I L g i ) 2 ∑ i ∈ I L h i + λ + ( ∑ i ∈ I R g i ) 2 ∑ i ∈ I R h i + λ − ( ∑ i ∈ I g i ) 2 ∑ i ∈ I h i + λ ] + γ T L_{split} = \frac{1}{2} [ \frac{(\sum_{i \in I_L}g_i)^2}{ \sum_{i \in I_L} h_i + \lambda } + \frac{(\sum_{i \in I_R}g_i)^2}{ \sum_{i \in I_R} h_i + \lambda } - \frac{(\sum_{i \in I}g_i)^2}{ \sum_{i \in I} h_i + \lambda } ]+ \gamma T Lsplit=21[iILhi+λ(iILgi)2+iIRhi+λ(iIRgi)2iIhi+λ(iIgi)2]+γT

2.3 xgboost避免过拟合的方法

  • 加入了正则化项
  • Shrinkage: 将新加入的树,增加一个缩放因子 η \eta η
    • 减小了单棵树的影响,将优化空间给了未来增加的树
  • Column Subsampling: 列采样,类似于随机森林当中的技术(除了避免过拟合以外,还能够并行加速计算)

3. 如何加速寻找切分点

  • Basic Exact greedy algorithm: 基本的节点分裂算法,需要遍历每一个特征的每一个位置,去计算最优的切分点
  • quantile strategy(分位点策略): 改进的切分方法:对每个特征选择一些候选的分割点,根据特征分布百分比
    • global proposal: 在数据初始化的时候,就将每个特征的分位点固定下来,每次分裂的时候使用同样的分位点
      • 优点:步骤少,但是需要更多的分位点,才能达到比较好的效果
    • local proposal: 在每次切分的时候都重新定义候选切分点集合,对更深的树比较合理
  • weighted Quantile Sketch: 这里没看懂
  • Sparsity-aware Split Finding(能加速50倍左右): 有可能有多种原因造成的数据稀疏,在该值缺失时,分到一个默认的方向,这个方向是算法自己学到的

4. 系统设计

  • 4.1 Column Block for Parallel Learning,每个block当中的feature值是排序的,这个的好处特别多
  • 4.2 Cache-aware Access: 这一块也不是很懂,不过大意是,block过小影响并行化效率,block过大导致缓存失效
  • 4.3 Blocks for Out-of-core Computation: 如何使用外存
    • Block Compression: 块数据压缩
    • Block Sharding: 块数据分片,将一块数据分散到多块硬盘,读取的时候可以同时读取,增加吞吐量

问题

  • 树的梯度如何计算?一阶梯度,二阶梯度

Demo

你可能感兴趣的:(算法与数据结构,机器学习,xgboost)