C'est une question très intéressante. Afin de bien comprendre ce qui se passait, j'ai dû passer en revue ce que XGBoost essaie de faire et quelles autres méthodes nous avions dans notre boîte à outils pour y faire face. Ma réponse va sur les méthodes traditionnelles et comment / pourquoi XGBoost est une amélioration. Si vous ne voulez que les puces, il y a un résumé à la fin.
Boost de dégradé traditionnel
Considérez l' algorithme de renforcement de gradient traditionnel (Wikipedia) :
- Modèle de base de calculH0
- Pourm←1:M
- Calculer les pseudo-résidusrim=−∂ℓ(yi,Hm−1(xi))∂Hm−1(xi)
- Ajuster un apprenant de base aux pseudo-résidushm(x)
- Calculez le multiplicateur qui minimise le coût, , (en utilisant la recherche de ligne)γγ=argminγ∑Ni=1ℓ(yi,Hm−1(xi)+γhm(xi))
- Mettez à jour le modèle .Hm(x)=Hm−1(x)+γhm(x)
- Vous obtenez votre modèle boosté .HM(x)
L'approximation de la fonction est importante pour la partie suivante,
Ajuster un apprenant de base aux pseudo-résidus.hm(x)
Imaginez-vous où construire votre algorithme de renforcement de gradient naïvement. Vous construirez l'algorithme ci-dessus en utilisant des arbres de régression existants comme apprenants faibles. Supposons que vous n'êtes pas autorisé à modifier la mise en œuvre existante des apprenants faibles. Dans Matlab , le critère de division par défaut est l'erreur quadratique moyenne. Il en va de même pour scikit learn .
Vous essayez de trouver le meilleur modèle qui minimise le coût . Mais pour ce faire, vous ajustez un modèle de régression simple aux résidus en utilisant le MSE comme fonction objective. Notez que vous ne minimisez pas directement ce que vous voulez, mais que vous utilisez les résidus et le MSE comme proxy pour le faire. La mauvaise partie est qu'elle ne donne pas nécessairement la solution optimale. La bonne partie est que cela fonctionne.hm(x)ℓ(yi,Hm−1(xi)+hm(xi))
Descente traditionnelle en dégradé
Ceci est analogue à la descente de gradient traditionnelle (Wikipedia) , où vous essayez de minimiser une fonction de coût en suivant le gradient (négatif du) de la fonction, à chaque étape.f(x)−∇f(x)
x(i+1)=x(i)−∇f(x(i))
Il ne vous permet pas de trouver le minimum exact après une étape, mais chaque étape vous rapproche du minimum (si la fonction est convexe). C'est une approximation, mais cela fonctionne très bien et c'est l'algorithme que nous utilisons traditionnellement pour faire une régression logistique, par exemple.
Interlude
À ce stade, la chose à comprendre est que l'algorithme général de renforcement du gradient ne calcule pas la fonction de coût pour chaque fractionnement possible, il utilise la fonction de coût de l'apprenant faible de régression pour ajuster les résidus.ℓ
Ce que votre question semble impliquer, c'est que le "vrai XGBoost" devrait calculer la fonction de coût pour chaque division, et que le "XGBoost approximatif" utilise une heuristique pour l'approcher. Vous pouvez le voir de cette façon, mais historiquement, nous avons eu l'algorithme général de renforcement du gradient, qui n'utilise pas d'informations sur la fonction de coût, sauf la dérivée au point actuel. XGBoost est une extension de Gradient Boosting qui essaie d'être plus intelligent dans la croissance des arbres de régression faible en utilisant une approximation plus précise que le simple gradient.
Autres façons de choisir le meilleur modèlehm(x)
Si nous considérons AdaBoost comme un cas particulier de renforcement de gradient, il ne sélectionne pas les régresseurs mais les classificateurs comme apprenants faibles. Si nous définissons , la manière dont AdaBoost sélectionne le meilleur modèle consiste à trouverhm(x)∈{−1,1}
hm=argmaxhm∑i=1Nwihm(xi)
où sont les résidus ( source, commence à la diapositive 20 ). Le raisonnement pour l'utilisation de cette fonction objectif est que si et vont dans la même direction / ont le même signe, le point se déplace dans la bonne direction et vous essayez de maximiser la quantité maximale de mouvement dans la bonne direction.wiwihm(xi)
Mais encore une fois, cela ne mesure pas directement quel minimise . Il mesure la qualité du mouvement , par rapport à la direction générale que vous devriez suivre, mesurée avec les résidus , qui sont également une approximation. Les résidus vous indiquent dans quelle direction vous devez vous déplacer par leur signe, et approximativement par quelle ampleur, mais ils ne vous disent pas exactement où vous devez vous arrêter.hmℓ(yi,Hm−1(xi)+hm(xi))hmwi
Meilleure descente en pente
Les trois exemples suivants ne sont pas essentiels à l'explication et sont juste ici pour présenter quelques façons de faire mieux qu'une descente de gradient vanille, pour soutenir l'idée que ce que fait XGBoost n'est qu'une autre façon d'améliorer la descente de gradient. Dans un réglage de descente de gradient traditionnel, lorsque vous essayez de minimiser , il est possible de faire mieux que de simplement suivre le gradient. De nombreuses extensions ont été proposées (Wikipedia) . En voici quelques unes, pour montrer qu'il est possible de faire mieux, avec plus de temps de calcul ou plus de propriétés de la fonction .f(x)f
Recherche de ligne / retour: dans Gradient Descent, une fois que le gradient est calculé, le point suivant doit être−∇f(x(i))
x(i+1)=x(i)−∇f(x(i))
Mais le gradient ne donne que la direction dans laquelle on doit se déplacer, pas vraiment de "combien", donc une autre procédure peut être utilisée, pour trouver le meilleur tel quec>0
x(i+1)c=x(i)−c∇f(x(i))
minimise la fonction de coût. Cela se fait en évaluant pour certains , et puisque la fonction doit être convexe, il est relativement facile de le faire via la recherche de ligne (Wikipedia) ou la recherche de ligne de (Wikipedia) . Ici, le coût principal est l'évaluation . Cette extension fonctionne donc mieux si est facile à calculer. Notez que l'algorithme général pour l'augmentation du gradient utilise la recherche de ligne, comme indiqué au début de ma réponse.f(x(i+1)c)cff(x)f
Méthode de gradient proximal rapide: si la fonction à minimiser est fortement convexe et que son gradient est lisse ( Lipschitz (Wikipedia) ), alors il y a un truc à utiliser ces propriétés qui accélèrent la convergence.
Descente de gradient stochastique et méthode Momentum: Dans la descente de gradient stochastique, vous n'évaluez pas le gradient sur tous les points, mais uniquement sur un sous-ensemble de ces points. Vous faites un pas, puis calculez le dégradé sur un autre lot et continuez. La descente de gradient stochastique peut être utilisée car le calcul sur tous les points est très coûteux, ou peut-être que tous ces points ne tiennent même pas en mémoire. Cela vous permet de prendre plus de mesures, plus rapidement, mais avec moins de précision.
Dans ce cas, la direction du dégradé peut changer en fonction des points échantillonnés. Pour contrer cet effet, les méthodes de momentum conservent une moyenne mobile de la direction pour chaque dimension, réduisant la variance à chaque mouvement.
L'extension la plus pertinente à la descente de gradient dans notre discussion sur XGBoost est la méthode de Newton (Wikipedia) . Au lieu de simplement calculer le gradient et de le suivre, il utilise la dérivée de second ordre pour recueillir plus d'informations sur la direction dans laquelle il doit aller. Si nous utilisons la descente de gradient, nous avons qu'à chaque itération, nous mettons à jour notre point comme suit,x(i)
x(i+1)=x(i)−∇f(x(i))
Et puisque le gradient pointe vers la direction d'augmentation la plus élevée de , ses points négatifs dans la direction de la plus forte diminution, et nous espérons que . Cela pourrait ne pas tenir, car nous pourrions aller trop loin dans la direction du gradient (d'où l'extension de recherche de ligne), mais c'est une bonne approximation. Dans la méthode de Newton, nous mettons à jour comme suit,∇f(x(i))ff(x(i+1))<f(x(i))x(i)
x(i+1)=x(i)−∇f(x(i))Hessf(x(i))
Où est le Hessien de dans . Cette mise à jour prend en compte les informations de second ordre, donc la direction n'est plus la direction de la plus forte diminution, mais doit pointer plus précisément vers le telle sorte que (ou le point où est minimal, s'il n'y a pas de zéro). Si est un polynôme du second ordre, alors la méthode de Newton couplée à une recherche de ligne devrait être capable de trouver le minimum en une seule étape.Hessf(x)fxx(i+1)f(x(i+1))=0ff
La méthode de Newton contraste avec la descente du gradient stochastique. Dans la descente de gradient stochastique, nous utilisons moins de points pour prendre moins de temps pour calculer la direction vers laquelle nous devons aller, afin d'en faire plus, dans l'espoir d'y aller plus vite. Dans la méthode de Newton, nous prenons plus de temps pour calculer la direction dans laquelle nous voulons aller, dans l'espoir que nous devons prendre moins de mesures pour y arriver.
Maintenant, la raison pour laquelle la méthode de Newton fonctionne est la même que pour laquelle l'approximation XGBoost fonctionne, et elle repose sur l'expansion de Taylor (Wikipedia) et le théorème de Taylor (Wikipedia) . L'expansion de Taylor (ou série de Taylor) d'une fonction en un point estf(x+a)
f(x)+∂f(x)∂xa+12∂2f(x)∂x2a2+⋯=∑n=0∞1n!∂nf(x)∂xnan.
Notez la similitude entre cette expression et l'approximation utilisée par XGBoost. Le théorème de Taylor déclare que si vous arrêtez l'expansion à l'ordre , alors l'erreur ou la différence entre et , est au plus , où est une fonction avec la propriété belle qu'elle va à zéro comme va à zéro.kf(x+a)∑kn=01n!∂nf(x)∂xnanhk(x)akhka
Si vous voulez une visualisation de la façon dont il se rapproche de certaines fonctions, jetez un oeil sur les pages wikipedia, ils ont quelques graphiques pour l'approximation de la fonction non polynomiale comme , .exlog(x)
La chose à noter est que l'approximation fonctionne très bien si vous voulez calculer la valeur de au voisinage de , c'est-à-dire pour de très petits changements . C'est ce que nous voulons faire dans Boosting. Bien sûr, nous aimerions trouver l'arbre qui apporte le plus grand changement. Si les apprenants faibles que nous construisons sont très bons et veulent faire un très grand changement, alors nous pouvons arbitrairement le gêner en n'appliquant que oufxa0.10.01de son effet. Il s'agit de la taille du pas ou du taux d'apprentissage de la descente du gradient. C'est acceptable, parce que si nos apprenants faibles obtiennent de très bonnes solutions, cela signifie que le problème est facile, auquel cas nous allons finir avec une bonne solution de toute façon, ou nous sur-adaptons, donc allons un peu ou très beaucoup dans cette mauvaise direction ne change pas le problème sous-jacent.
Alors, que fait XGBoost et pourquoi ça marche?
XGBoost est un algorithme de renforcement de gradient qui construit des arbres de régression en tant qu'apprenants faibles. L'algorithme traditionnel de renforcement de gradient est très similaire à une descente de gradient avec une recherche de ligne, où la direction dans laquelle aller est tirée des apprenants faibles disponibles. La mise en œuvre naïve de Gradient Boosting utiliserait la fonction de coût de l'apprenant faible pour l'adapter au résidu. Il s'agit d'un proxy pour minimiser le coût du nouveau modèle, qui est coûteux à calculer. Ce que fait XGBoost est de créer une fonction de coût personnalisée pour s'adapter aux arbres, en utilisant la série Taylor d'ordre deux comme approximation de la fonction de coût réel, de sorte qu'il peut être plus sûr que l'arbre qu'il choisit est bon. À cet égard, et pour simplifier, XGBoost est à Gradient Boosting ce que la méthode de Newton est à Gradient Descent.
Pourquoi l'ont-ils construit de cette façon
Votre question quant à la raison pour laquelle l'utilisation de cette approximation entraîne un compromis coût / performance. Cette fonction de coût est utilisée pour comparer les divisions potentielles pour les arbres de régression, donc si nos points ont disons 50 caractéristiques, avec une moyenne de 10 valeurs différentes, chaque nœud a 500 divisions potentielles, donc 500 évaluation de la fonction. Si vous supprimez une fonction continue, le nombre de divisions explose et l'évaluation de la division est de plus en plus appelée (XGBoost a une autre astuce pour gérer les fonctionnalités continues, mais cela est hors de portée). Comme l'algorithme passera la majeure partie de son temps à évaluer les divisions, la façon d'accélérer l'algorithme consiste à accélérer l'évaluation de l'arbre.
Si vous avez évalué l'arborescence avec la fonction de coût complet, , il s'agit d'un nouveau calcul pour chaque nouvelle division. Pour effectuer une optimisation dans le calcul de la fonction de coût, vous devez disposer d'informations sur la fonction de coût, ce qui est tout l'intérêt du renforcement des gradients: cela devrait fonctionner pour chaque fonction de coût.ℓ
L'approximation du second ordre est agréable à calculer, car la plupart des termes sont les mêmes dans une itération donnée. Pour une itération donnée, la plupart de l'expression peut être calculée une fois et réutilisée comme constante pour toutes les divisions:
L(t)≈∑i=1nℓ(yi,y^(t−1)i)constant+giconstantft(xi)+12hiconstantf2t(xi)+Ω(ft),
Donc, la seule chose que vous devez calculer est et , puis ce qui reste est principalement des ajouts et quelques multiplications. De plus, si vous jetez un coup d'œil au document XGBoost (arxiv) , vous verrez qu'ils utilisent le fait qu'ils construisent un arbre pour simplifier davantage l'expression jusqu'à un tas de sommation d'index, ce qui est très, très rapide.ft(xi)Ω(ft)
Sommaire
Vous pouvez voir XGBoost (avec approximation) comme une régression à partir de la solution exacte, une approximation du "vrai XGBoost", avec une évaluation exacte. Mais comme l'évaluation exacte est si coûteuse, une autre façon de voir les choses est que sur d'énormes ensembles de données, l'approximation est tout ce que nous pouvons faire de manière réaliste, et cette approximation est plus précise que l'approximation de premier ordre qu'un algorithme de renforcement de gradient "naïf" ferait. .
L'approximation utilisée est similaire à la méthode de Newton et est justifiée par Taylor Series (Wikipedia) et Taylor Theorem (Wikipedia) .
Les informations d'ordre supérieur ne sont en effet pas complètement utilisées, mais elles ne sont pas nécessaires, car nous voulons une bonne approximation au voisinage de notre point de départ .
Pour la visualisation, consultez la page Wikipedia de Taylor Series / Taylor's Theorem , ou Khan Academy sur l'approximation de Taylor Series , ou la page MathDemo sur l'approximation polynomiale des non-polynômes