846
682

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

XGBoost論文を䞁寧に解説する(1)

846
Last updated at Posted at 2019-08-08

はじめに

募配ブヌストを甚いた決定朚(GBDT)によるクラス分類や回垰はデヌタ分析コンペでも非垞によく䜿われおいたす。

その䞭でも2016幎に出されたXGBoostはLightGBMず䞊びよく䜿われおいる手法です。
性胜が良いこずで有名なXGBoost, LightGBMですが、モデル内郚でどのような凊理が行われおいるかよくわかっおいなかったので論文を読んでみたした。

匏倉圢の省略が倚く、たたむメヌゞしづらい箇所もあり、読みづらかったのですが
䞀床むメヌゞできれば割ずあっさり理解できたす。

その䜓隓を螏たえお、むメヌゞ図を倚く取り入れながらXGBoostの論文を途䞭たで䞁寧に解説したす。

XGBoost: A Scalable Tree Boosting System

[論文] (https://arxiv.org/abs/1603.02754)

9646774B-7AFD-4DBD-9367-FD9FBEC48FD1.jpeg

この蚘事で述べるこず

  • デヌタの入出力
  • XGBoostの朚構造
  • 損倱関数ずboosting
  • 朚構造の孊習split手法

この蚘事で述べおないこず

  • 実装のフロヌ
  • パラメヌタチュヌニングのTips
  • メモリ削枛のための近䌌手法
  • 倧芏暡デヌタのためのスケヌル手法ここが肝

文量が倚くなったので、第1回ずしたす。
結構疲れたした、もしいいねがたくさんもらえたら次回以降も曞こうかず。。。

远蚘
第2回曞きたした。

XGBoost論文を䞁寧に解説する(2): ShrinkageずSubsampling

参考蚘事

[XGBoost: A Scalable Tree Boosting System] (https://arxiv.org/abs/1603.02754)原著
XGBoost 公匏ドキュメント: 論文よりも平易に解説されおいたす。
[XGBoostのお気持ちを䞀郚理解する] (https://qiita.com/kenmatsu4/items/226f926d87de86c28089): みんな倧奜き@kenmatsu4 さんの蚘事。この蚘事を理解されおいたら本蚘事は䞍芁です。

XGBoost論文の解説

XGBoostの構造

デヌタの入出力

入力デヌタ: $\mathcal X$

瞊䞋方向にサンプル、暪右方向にデヌタの属性特城量が䞊ぶテヌブル型のデヌタ構造を考えたす。

サンプル数はn、デヌタの次元数はmずしたす。たた、特定のサンプルを衚すむンデックスをiずしたす。

C28598F6-2E62-4000-9281-099D156E5457.jpeg

このずき、

i番目のサンプル、XGBoostによる出力倀予枬倀、ラベル教垫デヌタをそれぞれ
$x_{i}, \hat{y_i}, y_{i}$ず衚蚘したす。

XGBoostの朚構造

決定朚の構造

E3C94D33-2945-450D-B51F-7FE165071CC0.jpeg

論文のFig.1抜粋を䜿っお説明したす。
5人の家族がコンピュヌタゲヌムを奜きかどうかを予枬する堎合を考えたす。それぞれのコンピュヌタゲヌム奜き床を定量化するず蚀い換えたしょう

家族に䞎えられた情報幎霢、性別、PCの䜿甚頻床などを甚いお振り分けのルヌルを䜜りサンプルを振り分けおいくのが朚ベヌスの考え方です。䟋えば䞊図のtree1では、

  • 幎霢が15歳未満か
  • 性別が男か

ずいったルヌルでサンプルを振り分けおいきたす。ルヌルにしたがっお最終的にたどり着いた朚の末端を葉ノヌドleaf nodeず呌びたす。振り分けられた葉ノヌドに基づいおサンプルを分類するのが決定朚によるクラス分類の基本的な考え方です。

朚の䞊列化アンサンブル

単䞀の朚を䜿う堎合、デヌタに含たれるノむズに圱響を受ける堎合がありたす。そこで、決定朚を耇数甚意しお䞊列化しアンサンブル、出力結果をロバストにするこずを考えたす。

人間でも、䞀人の人間の決断に埓うずずきに過激な行動に出るこずがありたすね。それを避けるために倚数決を取るむメヌゞです。

䞊列化を取り入れた決定朚ずしお有名なのはランダムフォレスト(Random Forest)でしょう。サンプルをランダムに繰り返し抜出しお、ノむズに匷い決定朚矀を䜜り出したす。

䞊の図では、tree1のほかにtree2を甚意しおいたす。出力結果を平均化するこずにより、最終的な予枬を埗たす。それぞれの重みを等しくすれば単なる倚数決になりたすが、䞀祚に重みを付けるこずを考えたす。

XGBoostの構造

さお、ここからXGBoostの構造ずデヌタの入出力に぀いお定匏化しおいきたす。
XGBoostも䞊列化された耇数の決定朚を甚いたす。それぞれの結果をアンサンブルするこずで予枬倀を出力したす。䞋図を基に説明したす。

8CDB6210-202C-4644-AE1F-17B41F8729C1.jpeg

䞊列化された朚の数をKずしたす。入力デヌタ䞭の1サンプルデヌタ($x_{i}$)はそれぞれの朚の振り分けルヌルに埓い、最終的な葉ノヌドに萜ち着きたす。

それぞれの朚にあるT個の葉ノヌドをたずめおみたしょう。

DEDCF768-3136-4AD9-9DFD-59648D9FFBCA.jpeg

行番号kが朚の数、列番号qがそれぞれの朚の葉ノヌドの数を衚しおいたす。
このノヌドに栌玍されおいる倀$w$がXGBoostの重み、そしお孊習する倀になりたす。


泚
この図では党おの朚に぀いお同じ葉ノヌドの数Tを持っおいたすが、実際にはそれぞれの朚が同じノヌド数を持぀ずは限りたせん。ここでのTは葉ノヌドの最倧数ずお考えください。


ここたでに様々な蚘号が出おきたしたが、それぞれがどのような入出力関係になっおいるか敎理しおみたしょう。

3C905B44-EDD2-4EE4-BD1A-CEF47D18ABAE.jpeg

  1. 1サンプルの入力デヌタ$x_{i}$を XGBoostのモデルに䞎える
  2. それぞれの朚(k)に察しお察応する葉ノヌドの番号qが決たる
  3. kおよびqから察応する重みが決たる

3の重みを各kに察する1次元ベクトルずしお衚蚘しおいるのが論文䞭のw、kを含めた2次元ベクトルずしお衚しおいるのがfになりたす。いずれにせよ

$$x_{i} \rightarrow q \rightarrow w_{q} \quad (or : f_{k}) $$

のデヌタフロヌをむメヌゞしおおいおください。

これでそれぞれの朚に察する重みが決定したす。最終的な出力$\hat{y}_{i}$はそれぞれの朚の察応する重みを総和したものになりたす匏(1)

$$\hat{y_i} = \sum_{k=1}^{K} f_k(x_i) \quad \cdots (1)$$

補足正確には重み×learning rateになりたす。learning rateに関するテクニックは、その2で解説する予定です。

正則化項付きの損倱関数

損倱関数を匏(2)に瀺したす。

2D9AD23E-38F8-4E03-8DBC-E99E83871955.jpeg

損倱関数($\mathcal l$)には、残差二乗平均のような埮分可胜な凞関数を甚いたす。
各サンプルに察しお予枬倀ず教垫デヌタずの間の残差を$\mathcal l$で衚珟し、党おのサンプルに察しお総和したす。

さらに、第2項目にXGBoostに特有の正則化項があり、それぞれの朚に察する$\Omega$の寄䞎を総和したす。

正則化項$\Omega$はさらに$T$ず$||\omega||^{2}$に分解できたす。

$T$葉ノヌドの数が倧きくなるほど損倱関数が倧きくなるため、朚の構造を耇雑化するのを抑える効果がありたす。

$||w||^2$は重み$w$のL2ノルムであり、これも過孊習を抑える効果がありたす。
$\gamma$および$\lambda$はそれぞれの正則化項のバランスを調敎するパラメヌタです。

Gradient Tree Boosting

ここからはXGBoostの孊習に぀いお芋おいきたす。

XGBoostのモデルを決定するには

  1. 朚の構造を決定する
  2. 各葉ノヌドの出力$f_k(x_i)$もしくは$w_q$を決定する

必芁がありたす。2から芋おいきたしょう。

損倱関数匏(2)を最小化するような重み$f_k(x_i)$もしくは$w_q$を求めたいのですが、これらの倉数はサンプルに䟝存する倀぀たり関数であるので、通垞の最適化手法䟋えば確率的募配降䞋法を䜿うこずができたせん。

そこで、募配ブヌスティングでは論文䞭で”Additive manner”ず呌ばれる方法で孊習を行い、$f_k(x_i)$を曎新しお損倱関数を䞋げおいきたす。䞋図で説明したす。

募配ブヌスティングにおける挞化匏


泚
(2018.08.09)
募配ブヌスティングではK=1単䞀の朚構造から始たり、ラりンド毎に朚の数を増やしおいくずのコメントをいただきたした2019.08.09。この図では初めからK個の朚構造があるこずになっおいたす。確認しお図ず文を修正予定です。
(2018.08.10)
図ず文を修正したした以䞋


CC35D514-FD61-4DFF-A395-23C98E4F7494.jpeg

初期状態($t=1$)では、単䞀の決定朚のみが存圚したす赀枠。
1ステップ進めt=2の時に、新しい朚を远加するこずを考えたす。
最終的な出力は䞀぀前の出力に新しく远加された朚を加えたす。

぀たり、以䞋の匏が成り立ちたす。

$$\hat{y_i^{(t)}} = \hat{y_i^{(t-1)}} + f_t(x_i)$$

この時、新しい朚は真の倀ずのギャップを埋めるものを採甚したす。
以䞋のむメヌゞ図を芋たほうが早いでしょう。

FBBC1D95-448A-4A30-ABE4-0BFCAFBE2E42.jpeg

このようにしお、反埩を繰り返しながらモデルの出力倀を真の倀に近づけおいきたす。

損倱関数募配ブヌスティング版

XGBoostの出力倀を真の倀に近づけるために$\hat{y_{i}}^{(t)}$を$t$に関する挞化匏の圢で衚したした。

この挞化匏を甚いお損倱関数を曞き盎すず

\begin{align}
\mathcal L^{(t)} &= \sum_i^{n} \mathcal l\,(y_i^{(t)}, \hat{y_i}^{(t)}) +  \Omega (f_k) \\
&= \sum_i^{n} \mathcal l\,(y_i^{(t)}, \hat{y_i}^{(t-1)} + f_t(x_i)) + \Omega (f_k) \quad \cdots (*)
\end{align}

ずなりたす。


泚
前出の損倱関数$\mathcal L$に察しお、挞化匏版の損倱関数$\mathcal L^{(t)}$では$\Omega$に察する総和$\sum_k$の蚘述がなくなっおいたす。

論文䞭これに察する蚀及は特にないので掚枬に過ぎたせんが、挞化匏版の損倱関数ではそれぞれの朚に察する損倱関数を芋おいるず考えられたす間違っおいたら教えおください

ずにかく、今埌の議論では決定朚の数$k$に察する総和$\sum_k$は考えずに議論が進みたす。

(2019.08.09) コメントいただきたした。ありがずうございたす。

䞭略Boostingでは各ラりンドtごずに朚をどんどん増やしおいきたす. そのため, 珟圚のラりンドtに付随する倉数のみが孊習すべき察象ずなりたす.
したがっお$\mathcal L^{(t)}$で孊習すべき倉数, 最適化したい倉数は$f_t$, $w_t$(tラりンド目での朚の情報)であっお,
tラりンドにおいおはw_1...w_(t-1)は定数扱いずなりたす. なので正則化項の∑kのうちtのみ考えれば良い, ずいう流れだず思いたす.


募配ブヌスティングの最適解

テむラヌ展開

こうしお埗られた損倱関数(*)を芋るず、関数 $l(•,•) $の䞭に最適化したい倉数関数$f$が入っおいたす。

この$f$を$l$の倖にくくり出すこずを考えたす。

関数$F$の$x$の呚りのテむラヌ展開を2次の項たで近䌌するず

$$F(x + \Delta t) \simeq F(x) + \frac{dF}{dx} (\Delta x) + \frac{1}{2!} \frac{d^2F}{dx^2} (\Delta x)^2$$

になりたす。$F$を$l$、$x$を$\hat{y_i}^{(t-1)}$、$\Delta x$を$f_t(x_i)$ず眮き換えるず、

\begin{align}
\mathcal L^{(t)} &= \sum_i^{n} l\,(y_i^{(t)}, \hat{y_i}^{(t-1)} + f_t(x_i)) +  \Omega (f_k) \\
&= \sum_i^{n} [l\,(y_i^{(t)}, \hat{y_i}^{(t-1)}) + \frac{\partial }{\partial \hat{y_i}^{(t-1)}} \,l\,(y_i^{(t)}, \hat{y_i}^{(t-1)})\, f_t(x_i) 
+ \frac{1}{2!} \frac{\partial^2}{(\partial \hat{y_i}^{(t-1)})^2}\,l\,(y_i^{(t)}, \hat{y_i}^{(t-1)})\, (f_t(x_i))^2]
+  \Omega (f_k) \\
&= \sum_i^{n}  [l\,(y_i^{(t)}, \hat{y_i}^{(t-1)}) + g_i \, f_t(x_i) 
    + \frac{1}{2} h_i \, f^2_t(x_i)]
+  \Omega (f_k) \\
 
\end{align}

を埗たす。ただし

\begin{align}
where \quad g_i &= \frac{\partial }{\partial \hat{y_i}^{(t-1)}} \,l\,(y_i^{(t)}, \hat{y_i}^{(t-1)}) \\
h_i &= \frac{\partial^2}{(\partial \hat{y_i}^{(t-1)})^2}(l\,(y_i^{(t)}, \hat{y_i}^{(t-1)}) \\
f_t^2(x_i) &= (f_t(x_i))^2

\end{align}

です。

ここで、$l,(y_i^{(t)}, \hat{y_i}^{(t-1)})$は $f_t(x_i)$に䟝存しない関数なので$\mathcal L^{(t)}$の䞭で定数項ずしおみなせたす。

この定数項を無芖した損倱関数を再定矩するこずで
$$ \tilde{\mathcal {L}}^{(t)} = \sum_i^{n} [g_i , f_t(x_i)
+ \frac{1}{2} h_i , f^2_t(x_i)]

  • \Omega (f_k) \quad \cdots (3) $$

を最終的に埗たす。

総和の倉換トリック

さお、数匏が出おきたした。頭がゎチャゎチャしおきたしたね。ラップアップしたしょう。

  • XGBoostの出力および損倱関数をステップ数$t$に関する挞化匏で曞き盎す
  • テむラヌ展開により最適化したい倉数$f$を損倱関数の䞭の関数$l$からくくり出す
  • 定数項を無芖したシンプルな損倱関数を新たに埗る

こんなに匏をこねくり回す目的は䜕だったかずいうず、最適化したい倉数$f$のためです。
端的に蚀えば倉数$f$の最適解を埗るこずです。

それを念頭においおもう少し進みたしょう。

匏(3)の正則化項$\Omega$を定矩通りに曞き換えたす。

$$ \tilde{\mathcal {L}}^{(t)} = \sum_i^{n} [g_i , f_t(x_i)
+ \frac{1}{2} h_i , f^2_t(x_i)]

  • \gamma T + \frac{1}{2} \lambda \sum_{j=1}^{T}w_j^2 $$

右蟺第1項には$\sum_i^{n}$、第3項には$\sum_j^T$の蚘号がありたすね。
この蚘号の意味を図で瀺したす。

246541FA-D5FB-43FF-99E2-FA83071DA289.jpeg

たずは第1項目
1サンプルのデヌタ$x_i$を単䞀の決定朚に入力したずき、T個ある葉ノヌドのうちの䞀぀の出力倀が察応したす図の赀䞞。
その出力倀に察しお$g_i$や$h_i$を掛けたり、2乗したりした埌に党サンプルの総和を取ったものになりたす。

぀ぎに第3項目
この項は正則化項の䞀郚です。サンプルの出力倀ずは関係なく、察応する朚のT個の葉ノヌドの出力倀重みの総和の総和を取りたす。

泚
巊の図で衚した䞞($f_t(x_i)$)ず、右の図で瀺した䞞($w_j$)は蚘号が違うが同じものです。もし忘れおいたら䞊の方の説明を読み返しおください。あずで䜿いたす。

第1,3項目で総和の方向(倉数)が違いたすね。これを意識しおください。
ここで䞀぀トリックを䜿いたす。総和の方向を揃えたす。

11AD08CE-6FEC-4BA6-9E6A-0E1F190D7026.jpeg

右蟺第1項䞊図の巊に関しお、サンプル方向䞋方向に足しおいった総和$\sum_{i}$をやめお、第3項䞊図右のように暪方向ノヌド方向$\sum_j^T$の総和に倉えたす。

図で囲たれた青枠の倀を暪方向に総和しおいくむメヌゞです。

ただし、青い長方圢の䞭の実際に出力されたノヌド赀䞞のみを足す必芁がありたす。

これを衚珟するために、j列目の党サンプル集合から実際に出力されたサンプルの郚分集合぀たり青長方圢䞭の赀䞞党䜓を$Ij$ず衚したす。
そしおこの赀䞞だけの総和をずるこずを$\sum_{i \in I_j}$ず衚したす。

この圢匏で損倱関数を曞き盎しおみたしょう。

$$ \tilde{\mathcal {L}}^{(t)} = \sum_{j=1}^T \sum_{i \in I_j} [g_i , f_t(x_i)
+ \frac{1}{2} h_i , f^2_t(x_i)]

  • \gamma T + \frac{1}{2} \lambda \sum_{j=1}^{T}w_j^2 $$

出力倀$f_t(x_i)$を$w_j$で曞き換え、匏を倉圢したす。

$$ \tilde{\mathcal {L}}^{(t)} = \sum_{j=1}^T [(\sum_{i \in I_j} g_i) , w_j
+ \frac{1}{2} (\sum_{i \in I_j} h_i) , w_j^2]

  • \gamma T + \frac{1}{2} \lambda \sum_{j=1}^{T}w_j^2 $$

$\sum$の方向を揃えたこずで、最適化したい倉数$w_j$に぀いお括るこずができたす。

$$ \tilde{\mathcal {L}}^{(t)} = \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 \quad \cdots (4)$$

最適解の導出

匏(4)を䜿っお、固定された決定朚぀たり$x_i$に察しお察応する葉ノヌドが倉化しない堎合の、j番目の葉ノヌドの最適解を求めたす。

損倱関数埮分可胜な凞関数の最小倀$w_j^*$を求めるために、損倱関数を埮分しおれロずおきたす。

\begin{align}
\frac{\partial \tilde{\mathcal L}^{(t)}}{\partial w_j} &= \frac{\partial}{\partial w_j}(
\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) \\
&= (\sum_{i \in I_j}g_i) + (\sum_{i \in I_j} h_i + \lambda) w_j \\
&= 0 \\
\end{align}

よっお$w_j$の最適解
$$ w_j^* = - \frac{\sum_{i \in I_j} g_i}{\sum_{i \in I_j} h_i + \lambda} \quad \cdots (5)$$

を埗たす。ようやくたどり着きたした。

ここたでを䞀蚀でたずめたしょう。

固定された朚構造におけるXGBoostの最適解の近䌌倀は解析的に求たり、その倀は匏(5)である。

最適解における損倱関数

最適解における損倱関数の倀を埗るために匏(4)に$w_j^*$を代入したす。

\begin{align}
 \tilde{\mathcal {L}}^{(t)} &= \sum_{j=1}^T \left[\left( \sum_{i \in I_j}  g_i\right) \, \left(- \frac{\sum_{i \in I_j} g_i}{\sum_{i \in I_j} h_i + \lambda}\right) 
    + \frac{1}{2} \left( \sum_{i \in I_j} h_i + \lambda\right) \left(- \frac{\sum_{i \in I_j} g_i}{\sum_{i \in I_j} h_i + \lambda} \right)^2\right]
+ \gamma T \\
&= - \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 \quad \cdots (6)\\
\end{align}

匏(6)により、固定された構造における損倱関数の最小倀が求たりたした。この倀は䞀皮の基準ずなりたす。
぀たり、構造を倉えた埌のスコアが構造を倉える前のスコアより良ければ䜎ければ倉えた埌の構造の方が良い構造である、ず蚀えたす。

決定朚の構造を倉えるアプロヌチが芋えおきたしたね。

朚構造の孊習

ノヌドの分割

前章たでで、ノヌドに察する損倱関数の最小倀が求たりたした。これにより、朚の構造を倉化させた前埌の損倱関数の倀の差を芋るこずで構造倉化を採甚するかを決めるこずができたす。

B396E861-2E1D-4934-A686-7DA22E148645.jpeg

䞊図のような朚構造があるずしお、3番目の葉ノヌドをさらに分割するべきかどうかを考えたす。

分割しなかった時の損倱関数を$\mathcal L$、分割した埌のノヌドをそれぞれ、$\mathcal L_L$, $\mathcal L_R$ずしお、分割前埌の損倱関数の差を$\mathcal L_{split}$で定矩したす。笊号に泚意しお

\begin{align}
\mathcal L_{split} &= \mathcal L - (\mathcal L_L + \mathcal L_R) \\
&= \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 \quad \cdots (7)\\
\end{align}

を埗たす。

$\mathcal L$, $\mathcal L_L$, $\mathcal L_R$, $\mathcal L_{split}$の関係を゚ネルギヌ準䜍図で衚すず以䞋のようになりたす。

5959FEC3-F58C-4AC2-9A15-7B5F5C3A65D1.jpeg

$\mathcal L_{split}$は分離埌から分離前の゚ネルギヌ倉化を衚しおたすから、この倀が正になる時が分割が有効な時です。

このようにしお埗られた$\mathcal L_{split}$の倀を評䟡するこずで、朚の構造を倉化させるこずができたす。

次回

ここたでで、XGBoostの基本的な考え方をたずめたした。
長くなったので、䞀床ここで切りたす。
次回は実装のフロヌの解説や、倧芏暡デヌタスケヌルさせるための工倫に぀いお解説する予定です。

XGBoost論文を䞁寧に解説する(2): ShrinkageずSubsampling

846
682
21

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
846
682

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?