これは非常に興味深い質問です。何が起こっているのかを完全に理解するために、XGBoostが何をしようとしているか、そしてツールボックスでそれを処理する他の方法を調べなければなりませんでした。私の答えは、従来の方法と、XGBoostがどのように/なぜ改善されているかについてです。箇条書きだけが必要な場合は、最後に要約があります。
従来の勾配ブースティング
従来の勾配ブースティングアルゴリズム(Wikipedia)を検討してください。
- ベースモデル計算H0
- 以下のためのm←1:M
- 擬似残差の計算rim=−∂ℓ(yi,Hm−1(xi))∂Hm−1(xi)
- 基底学習器を擬似残差に適合させるhm(x)
- コストを最小化する乗数を計算します、、(ライン検索を使用)γγ=argminγ∑Ni=1ℓ(yi,Hm−1(xi)+γhm(xi))
- モデル更新します。Hm(x)=Hm−1(x)+γhm(x)
- ブーストされたモデル取得します。HM(x)
関数近似は、次の部分にとって重要です。
基底学習器を擬似残差に適合させます。hm(x)
Gradient Boosting Algorithmを単純に構築する場所を想像してください。既存の回帰ツリーを弱学習器として使用して、上記のアルゴリズムを構築します。弱学習器の既存の実装を微調整することは許可されていないと仮定しましょう。でMatlabの、デフォルトの分割基準は、平均二乗誤差です。同じことがscikitの学習にも当てはまります。
コストを最小化する最適なモデルを見つけようとしています。ただし、そのためには、MSEを目的関数として使用して、単純な回帰モデルを残差に適合させます。必要なものを直接最小化するのではなく、残差とMSEをプロキシとして使用して最小化することに注意してください。悪い点は、必ずしも最適なソリューションが得られるとは限らないことです。良い点は、それが機能することです。hm(x)ℓ(yi,Hm−1(xi)+hm(xi))
伝統的な勾配降下
これは、従来のGradient Descent(Wikipedia)に似ています。ここでは、各ステップで関数の(負の)勾配をたどることによってコスト関数を最小化しようとしています。f(x)−∇f(x)
x(i+1)=x(i)−∇f(x(i))
1ステップ後に正確な最小値を見つけることはできませんが、各ステップで最小値に近づきます(関数が凸の場合)。これは近似値ですが、非常にうまく機能し、たとえばロジスティック回帰を行うために従来から使用されているアルゴリズムです。
間奏曲
この時点で理解すべきことは、一般的な勾配ブースティングアルゴリズムは、可能な分割ごとにコスト関数を計算せず、回帰弱学習器のコスト関数を使用して残差を近似することです。ℓ
あなたの質問は、「真のXGBoost」が各スプリットのコスト関数を計算し、「近似XGBoost」がヒューリスティックを使用して近似することを意味しているようです。そのように見ることができますが、歴史的には、現在のポイントの導関数を除き、コスト関数に関する情報を使用しない一般的な勾配ブースティングアルゴリズムがあります。XGBoostはGradient Boostingの拡張機能で、勾配よりも正確な近似を使用して、弱い回帰ツリーの成長をよりスマートにしようとします。
最適なモデルを選択する他の方法hm(x)
AdaBoostを勾配ブースティングの特殊なケースとして見ると、リグレッサーではなく分類器が弱い学習器として選択されます。を設定した場合、AdaBoostが最適なモデルを選択する方法は、hm(x)∈{−1,1}
hm=argmaxhm∑i=1Nwihm(xi)
ここ残差(あるソースは、スライド20から始まります)。この目的関数を使用する理由は、とが同じ方向に進む/同じ符号を持つ場合、ポイントは正しい方向に移動し、最大移動量を最大化しようとするためです。正しい方向。wiwihm(xi)
ただし、これは、どの最小化するかを直接測定するものではありません。また、近似である残差で測定されるように、移動する全体の方向に関して、の動きがどれだけ良いかを測定しています。残差は、標識によってどの方向に移動する必要があるかを示し、その大きさによって大体どのくらいの量になるかを示しますが、停止すべき正確な位置はわかりません。hmℓ(yi,Hm−1(xi)+hm(xi))hmwi
より良い勾配降下
次の3つの例は説明に必須ではなく、XGBoostが行うのは勾配降下を改善するもう1つの方法であるという考えをサポートするために、バニラ勾配降下よりも優れた方法を示すためだけです。従来の勾配降下設定では、を最小化しようとするとき、勾配に従うだけでなく、より良い結果を得ることができます。多くの拡張機能が提案されています(Wikipedia)。計算時間を増やすか、関数プロパティを増やすと、より良い結果が得られることを示すために、それらのいくつかを示します。f(x)f
ライン検索/バックトラッキング:勾配降下法では、勾配が計算されると、次の点は−∇f(x(i))
x(i+1)=x(i)−∇f(x(i))
しかし、勾配は、実際に「いくら」ではなく、移動すべき方向のみを提供するため、別の手順を使用して、次のような最良のを見つけることができますc>0
x(i+1)c=x(i)−c∇f(x(i))
コスト関数を最小化します。これは、いくつかのについてを評価することで行われます。関数は凸である必要があるため、Line Search(Wikipedia)またはBacktracking Line Search(Wikipedia)を介して比較的簡単に実行できます。ここで、主なコストは評価です。したがって、計算が簡単な場合、この拡張機能が最適に機能します。回答の冒頭に示したように、勾配ブースティングの一般的なアルゴリズムはライン検索を使用していることに注意してください。f(x(i+1)c)cff(x)f
高速近位勾配法:最小化する関数が強く凸で勾配が滑らかな場合(Lipschitz(Wikipedia))、これらのプロパティを使用して収束を高速化するいくつかのトリックがあります。
確率的勾配降下法と運動量法:確率的勾配降下法では、すべてのポイントの勾配を評価するのではなく、それらのポイントのサブセットのみを評価します。ステップを踏んでから、別のバッチで勾配を計算し、続行します。確率的勾配降下法は、すべてのポイントの計算が非常に高価であるため、またはそれらのすべてのポイントがメモリに収まらない可能性があるために使用できます。これにより、より多くの手順をより迅速に実行できますが、正確性は低下します。
その際、どのポイントがサンプリングされるかに応じて、グラデーションの方向が変わる場合があります。この効果を打ち消すために、運動量法は各次元の方向の移動平均を維持し、各移動の分散を減らします。
XGBoostの説明で勾配降下に最も関連する拡張は、Newtonの方法(Wikipedia)です。勾配を計算して追跡する代わりに、2次導関数を使用して、進むべき方向に関する詳細情報を収集します。勾配降下を使用する場合、各反復で次のようにポイントを更新します。x(i)
x(i+1)=x(i)−∇f(x(i))
また、勾配はの最大増加方向を指し、その負の点は最大減少方向を指し、。これは、勾配の方向に行きすぎる可能性があるため(線探索拡張機能)、保持されない場合がありますが、適切な近似です。ニュートンの方法では、を次のように更新します。∇f(x(i))ff(x(i+1))<f(x(i))x(i)
x(i+1)=x(i)−∇f(x(i))Hessf(x(i))
ここでのヘッセ行列であるにおける。方向は、もはや最高の減少の方向ではないが、向かってより正確に指し示す必要がありますので、この更新は、アカウントに二次情報をとりなるように(またはゼロがない場合、が最小になる点)。場合二次多項式であり、次いで、ライン探索と結合ニュートン法は、一の段階で最小値を見つけることができなければなりません。Hessf(x)fxx(i+1)f(x(i+1))=0ff
ニュートンの方法は、確率的勾配降下法と対照的です。Stochastic Gradient Descentでは、より多くのポイントを使用して、より速く到達できるように、より多くのポイントを使用して、方向を計算する時間を短縮します。ニュートンの方法では、目的の方向を計算するのにより多くの時間がかかります。
現在、Newtonの方法が機能する理由は、XGBoost近似が機能する理由と同じであり、Taylorの拡張(Wikipedia)とTaylorの定理(Wikipedia)に依存しています。ポイントにおける関数のテイラー展開(またはテイラー級数)ありますf(x+a)
f(x)+∂f(x)∂xa+12∂2f(x)∂x2a2+⋯=∑n=0∞1n!∂nf(x)∂xnan.
この式とXGBoostが使用している近似値の類似性に注意してください。Taylorの定理では、次数で展開を停止すると、エラー、またはとは、最大で。ここで、は、がゼロになるとゼロになるという素晴らしいプロパティを持つ関数です。kf(x+a)∑kn=01n!∂nf(x)∂xnanhk(x)akhka
いくつかの関数を近似する方法を視覚化するには、ウィキペディアのページをご覧ください、などの非多項式関数の近似グラフがあり。exlog(x)
注意すべきことは、の近傍での値を計算する場合、つまり、非常に小さな変化場合、近似が非常にうまく機能することです。これが、ブースティングで行うことです。もちろん、最大の変化をもたらすツリーを見つけたいです。構築する弱学習器が非常に優れており、非常に大きな変更を行う場合は、または適用するだけで任意にそれを妨げることができますfxa0.10.01その効果の。これは、勾配降下のステップサイズまたは学習率です。弱い学習者が非常に良い解決策を得ている場合、これは問題が簡単であり、その場合はとにかく良い解決策になるか、過剰適合であるため、少しまたは非常に進むことを意味するため、これは受け入れられますこの悪い方向に向かっても、根本的な問題は変わりません。
それでは、XGBoostは何をしていて、なぜ機能するのでしょうか?
XGBoostは、弱学習器として回帰ツリーを構築する勾配ブースティングアルゴリズムです。従来の勾配ブースティングアルゴリズムは、行探索を使用した勾配降下法に非常に似ており、利用可能な弱学習器から進む方向が描画されます。Gradient Boostingの単純な実装では、弱学習器のコスト関数を使用して残差に適合させます。これは、計算が高価な新しいモデルのコストを最小限に抑えるためのプロキシです。XGBoostが行っているのは、2番目のテイラー級数を真のコスト関数の近似として使用して、ツリーに適合するカスタムコスト関数を構築することです。この点で、そして簡略化として、XGBoostは、勾配降下法であり、ニュートンの方法が勾配降下法であるものを強化します。
なぜ彼らはそれをそのように構築したのですか
この近似値を使用する理由についての質問は、コスト/パフォーマンスのトレードオフになります。このコスト関数は、回帰木の潜在的な分割を比較するために使用されるため、ポイントに50個の特徴があり、平均10個の異なる値がある場合、各ノードには500個の潜在的な分割があるため、関数の評価は500個です。連続フィーチャをドロップすると、分割数が爆発し、分割の評価がどんどん呼び出されます(XGBoostには連続フィーチャを処理する別のトリックがありますが、それは範囲外です)。アルゴリズムは分割の評価にほとんどの時間を費やすため、アルゴリズムを高速化する方法はツリー評価を高速化することです。
完全なコスト関数でツリーを評価した場合、それはすべての新しい分割の新しい計算です。コスト関数の計算で最適化を行うには、コスト関数に関する情報が必要です。これは、勾配ブースティングの全ポイントです。すべてのコスト関数で機能するはずです。ℓ
ほとんどの項は与えられた反復で同じであるため、2次近似は計算上優れています。与えられた反復に対して、式のほとんどは一度計算され、すべての分割の定数として再利用できます。
L(t)≈∑i=1nℓ(yi,y^(t−1)i)constant+giconstantft(xi)+12hiconstantf2t(xi)+Ω(ft),
したがって、計算する必要があるのはとであり、残りはほとんど加算と乗算です。さらに、XGBoostの論文(arxiv)を見ると、ツリーを構築しているという事実を使用して、式をさらに単純なインデックスの束にまで単純化することがわかります。これは非常に高速です。ft(xi)Ω(ft)
概要
XGBoost(近似あり)は、正確な解からの回帰、つまり正確な評価を伴う「真のXGBoost」の近似として見ることができます。しかし、正確な評価は非常にコストがかかるため、それを確認する別の方法は、大規模なデータセットでは近似が現実的にできることであり、この近似は「ナイーブ」勾配ブースティングアルゴリズムが行う一次近似よりも正確です。
使用中の近似は、ニュートン法に似ており、Taylor Series(Wikipedia)およびTaylor Theorem(Wikipedia)によって正当化されます。
高次の情報は実際には完全には使用されませんが、開始点の近傍で適切な近似が必要なため、必要ではありません。
可視化のために、ウィキペディアのページをチェックテイラーシリーズ / テイラーの定理、またはテイラー級数近似にカーンアカデミー、または非多項式の多項式近似にMathDemoページ