Gradient Boosting as Functional Gradient Descent

Imagine predicting house prices where a single decision tree captures broad trends. However, it misses subtle interactions. A natural fix is to add a second model. This model predicts the errors of the first. Then a third model fixes what remains, and so on. This iterative error-correction scheme is not an ad hoc trick. It is gradient descent, but performed differently. It works in the space of functions, not parameter vectors. Gradient boosting turns this insight into a general recipe. It works for regression, classification, ranking, and survival analysis alike. It needs only a differentiable loss function. It also needs a "weak learner" that can fit a target. The idea matters because it decouples the optimization framework from other choices. It separates the framework from the choice of loss. It also separates it from the choice of base learner. Once you see boosting as steepest descent in function space, you can plug in many losses. These include squared error, absolute error, logistic loss, and quantile loss. You can even use any custom business-relevant loss. The same machinery produces a working algorithm. This generality is why gradient boosting became a workhorse. It powers industrial-strength implementations like XGBoost, LightGBM, and CatBoost. These dominate tabular-data competitions and production systems. They are used for credit scoring, click-through-rate prediction, and search ranking. The big picture: an AdaBoost-style ensemble reweights examples and combines classifiers. It does this to minimize exponential loss. But that derivation is loss-specific. Gradient boosting generalizes it by asking a sharper question. For any differentiable loss, what direction in function space most reduces it? Can a weak learner approximate that direction? The answer is: fit the weak learner to the negative gradient of the loss. This is evaluated at each training point. It works exactly as gradient descent does. That method takes a step opposite the gradient of a parametric objective. This article builds the functional gradient descent view from first principles. It gives complete pseudocode for the generic algorithm. It also covers its regression and classification specializations. It proves why the greedy stagewise procedure provably decreases the loss. This holds subject to a step-size condition. The article analyzes complexity and works a full numeric example by hand. It surveys the pitfalls that make gradient boosting notoriously easy to overfit if left unchecked. It closes by connecting boosting to the broader theme of combining models. This theme reappears in Stacking and Model Blending.

Key takeaways
  • Gradient boosting builds an additive model F(x)=∑mρmhm(x)F(x) = \sum_m \rho_m h_m(x) by sequentially fitting weak learners to the negative gradient of a loss function, treating predictions as free parameters at each data point.
  • This is steepest descent in an infinite-dimensional function space: each weak learner is a finite-dimensional projection of the ideal (but non-parametric) gradient direction.
  • Different losses (squared error, absolute error, logistic, Huber) give different "pseudo-residuals," but the outer algorithm is identical — only the residual formula and step size change.
  • A shrinkage parameter (learning rate) and stochastic subsampling are essential regularizers; without them gradient boosting overfits the training residuals aggressively.
  • Each stage strictly reduces training loss under a line-search step, and empirical risk converges to a local/global optimum over the additive model class as the number of stages grows.
  • Complexity is O(M⋅T(n,d))O(M \cdot T(n,d)) where MM is the number of boosting rounds and T(n,d)T(n,d) is the cost of fitting one weak learner (e.g., a depth-limited tree) on nn examples with dd features.
The core insight

Gradient boosting fits each new weak learner to approximate the negative gradient of the loss with respect to the current predictions, turning boosting into gradient descent performed directly on the vector of function outputs.

The idea

In ordinary parametric gradient descent, we optimize a loss L(θ)L(\theta) over a parameter vector θ∈Rp\theta \in \mathbb{R}^p by repeatedly moving in the direction −∇θL(θ)-\nabla_\theta L(\theta). Gradient boosting applies the identical logic, but replaces the parameter vector with the vector of function values F=(F(x1),…,F(xn))\mathbf{F} = (F(x_1), \dots, F(x_n)) evaluated at the training points. The empirical risk

L(F)=∑i=1nℓ(yi,F(xi))L(\mathbf{F}) = \sum_{i=1}^n \ell(y_i, F(x_i))

is viewed as a function of the nn-dimensional vector F\mathbf{F}, not of any finite parameter set. Its gradient at the current predictions is

gi=∂ℓ(yi,F(xi))∂F(xi)∣F=Fm−1,i=1,…,n.g_i = \left. \frac{\partial \ell(y_i, F(x_i))}{\partial F(x_i)} \right|_{F=F_{m-1}}, \qquad i = 1, \dots, n.

The ideal update would move each F(xi)F(x_i) by −gi-g_i, exactly like unconstrained gradient descent — but this "point cloud" of updates is not a function we can evaluate at new test inputs. Gradient boosting's key move is to project this ideal but non-generalizing gradient onto the space of outputs of a weak learner (e.g. shallow regression trees), by fitting the weak learner hm(x)h_m(x) to the pseudo-residuals −gi-g_i using ordinary least squares (or whatever loss the weak learner itself minimizes). The fitted hmh_m is the best available finite-dimensional approximation to the true functional steepest-descent direction, and it generalizes to new xx because it is a genuine function, not a lookup table of per-example corrections. Having found a direction hmh_m, boosting performs a (possibly approximate) line search for a step size ρm\rho_m that minimizes ∑iℓ(yi,Fm−1(xi)+ρ hm(xi))\sum_i \ell(y_i, F_{m-1}(x_i) + \rho\, h_m(x_i)), and updates

Fm(x)=Fm−1(x)+ρm hm(x).F_m(x) = F_{m-1}(x) + \rho_m\, h_m(x).

The final model FM=F0+∑m=1MρmhmF_M = F_0 + \sum_{m=1}^M \rho_m h_m is an additive ensemble, structurally identical to AdaBoost's weighted combination of weak classifiers, but now derived for any differentiable loss rather than being tied to the exponential loss. When ℓ\ell is squared error, the pseudo-residual −gi-g_i reduces exactly to the ordinary residual yi−Fm−1(xi)y_i - F_{m-1}(x_i), so "fit a tree to the residuals" — the folk description of boosting — is the squared-error special case of a much more general procedure.

How it works

The generic algorithm requires three ingredients: a loss ℓ(y,F)\ell(y, F) differentiable in its second argument, a family of weak learners H\mathcal{H} (typically shallow regression trees), and a fitting procedure that can approximately minimize squared error against arbitrary targets (this is what "fit a weak learner" means operationally, regardless of the outer loss).

Step 1 — Initialize. Set F0(x)=arg⁡min⁡c∑iℓ(yi,c)F_0(x) = \arg\min_c \sum_i \ell(y_i, c), a constant model (e.g. the mean for squared error, the log-odds of the base rate for logistic loss).

Step 2 — For each stage m=1,…,Mm = 1, \dots, M: 1. Compute pseudo-residuals rim=−∂ℓ(yi,F)/∂F∣F=Fm−1(xi)r_{im} = -\left.\partial \ell(y_i, F)/\partial F\right|_{F=F_{m-1}(x_i)} for every training example. 2. Fit a weak learner hmh_m to the training set {(xi,rim)}i=1n\{(x_i, r_{im})\}_{i=1}^n by least-squares regression — regardless of the outer loss, this inner fit is always squared-error regression of the weak learner onto the residuals. 3. Choose a step size ρm=arg⁡min⁡ρ∑iℓ(yi,Fm−1(xi)+ρ hm(xi))\rho_m = \arg\min_\rho \sum_i \ell(y_i, F_{m-1}(x_i) + \rho\, h_m(x_i)) (exact line search, or a fixed shrinkage constant ν∈(0,1]\nu \in (0,1] used instead of a full search). 4. Update Fm(x)=Fm−1(x)+ν ρm hm(x)F_m(x) = F_{m-1}(x) + \nu\, \rho_m\, h_m(x).

Step 3 — Output FMF_M, the sum of the initial constant and all weighted weak learners. ``` Algorithm: GradientBoosting Input: data {(x_i, y_i)}_{i=1..n}, loss L(y, F), weak learner class H, number of stages M, shrinkage rate nu in (0, 1] Output: additive model F_M(x) F_0(x) := argmin_c sum_i L(y_i, c) # constant baseline for m = 1 to M:

# 1. functional gradient (pseudo-residuals) for i = 1 to n: r_i := - dL(y_i, F)/dF evaluated at F = F_{m-1}(x_i)

# 2. fit weak learner to the negative gradient (least squares) h_m := FitLeastSquares( {(x_i, r_i)}_{i=1..n}, H )

# 3. line search for optimal step length along h_m rho_m := argmin_rho sum_i L( y_i, F_{m-1}(x_i) + rho * h_m(x_i) )

# 4. shrink and update F_m(x) := F_{m-1}(x) + nu rho_m h_m(x) return F_M ``` Two loss-specific instantiations illustrate the generality:

  • Squared error, ℓ(y,F)=12(y−F)2\ell(y,F) = \tfrac12 (y-F)^2: gradient is F−yF - y, so ri=yi−Fm−1(xi)r_i = y_i - F_{m-1}(x_i), the ordinary residual. This recovers "L2Boosting."
  • Logistic loss for binary classification with y∈{−1,+1}y \in \{-1,+1\}, ℓ(y,F)=log⁡(1+e−2yF)\ell(y,F) = \log(1+e^{-2yF}): the negative gradient is ri=2yi1+e2yiFm−1(xi)r_i = \dfrac{2y_i}{1+e^{2y_i F_{m-1}(x_i)}}, a smoothly-weighted margin residual, and FM(x)F_M(x) is passed through a sigmoid to obtain class probabilities. This is the algorithm underlying gradient-boosted logistic classifiers (and is closely related to, but distinct from, AdaBoost's exponential-loss update).

The diagram below shows the computational structure: predictions flow forward, the loss gradient flows backward to produce residual targets, and a new weak learner is trained on those targets at every stage.

Figure
Gradient boosting as an iterative residual-fitting pipeline
Stagewise Functional Gradient Descent F₀ = mean(y) r_i = −∂ℓ/∂F (pseudo-residual) fit h₁(x) weak learner F₁ = F₀ + ν·ρ₁·h₁ updated model repeat for m = 2 … M, using F_{m-1} in place of F₀ Fₘ₋₁(x) rᵢ = −∂ℓ/∂F at Fₘ₋₁(xᵢ) fit hₘ(x) tree/stump Fₘ = Fₘ₋₁ + ν·ρₘ·hₘ next stage output After M rounds: F_M(x) = F₀(x) + Σ ν·ρₘ·hₘ(x)

Complexity & correctness

Time complexity. Each of the MM stages requires (i) computing nn pseudo-residuals in O(n)O(n) time, (ii) fitting a weak learner, and (iii) a line search. If the weak learner is a regression tree of maximum depth dd built by the standard greedy split-finding procedure, fitting one tree costs O(n⋅p⋅d)O(n \cdot p \cdot d) where pp is the number of features (each of the dd levels considers, for each of pp features, a sort/scan over nn points; with pre-sorted features this is O(nlog⁡n⋅p)O(n\log n \cdot p) once, reused across levels via level-order data structures, giving O(n⋅p⋅d)O(n \cdot p \cdot d) amortized in practice). Line search for many common losses (squared error, exponential) has a closed form and costs O(n)O(n); for losses without closed form (e.g. absolute or Huber loss for arbitrary residual shapes), a small number of Newton or golden-section steps each costing O(n)O(n) suffices. Total training time is

O(M⋅n⋅p⋅d).O\big(M \cdot n \cdot p \cdot d\big).

Space complexity. O(n)O(n) for the residual vector and current predictions per stage, plus O(M⋅size(hm))O(M \cdot \text{size}(h_m)) to store the ensemble; a depth-dd tree needs O(2d)O(2^d) nodes, so total model storage is O(M⋅2d)O(M \cdot 2^d), typically small since dd is kept shallow (3–8) by design.

Correctness — why each stage decreases the loss. The argument mirrors why parametric gradient descent decreases a convex differentiable objective, adapted to the function-space setting. Treat LL as a function of the vector F∈Rn\mathbf{F} \in \mathbb{R}^n of predictions at the training points. A first-order Taylor expansion around Fm−1\mathbf{F}_{m-1} gives, for a candidate update Fm−1+ρ h\mathbf{F}_{m-1} + \rho\,\mathbf{h},

L(Fm−1+ρ h)≈L(Fm−1)+ρ g⊤h,L(\mathbf{F}_{m-1} + \rho\,\mathbf{h}) \approx L(\mathbf{F}_{m-1}) + \rho \, \mathbf{g}^\top \mathbf{h},

where g=∇L(Fm−1)\mathbf{g} = \nabla L(\mathbf{F}_{m-1}) is the vector of true pointwise gradients (gig_i as defined above). Among all unit-length directions h\mathbf{h}, the choice h=−g/∥g∥\mathbf{h} = -\mathbf{g}/\|\mathbf{g}\| makes g⊤h\mathbf{g}^\top\mathbf{h} most negative — this is the standard steepest-descent argument, applied here coordinatewise over the nn training points rather than over parameter coordinates. Since we cannot realize the ideal −g-\mathbf{g} exactly (it isn't a function of xx we can evaluate elsewhere), we instead fit hm∈Hh_m \in \mathcal{H} by least squares to −g-\mathbf{g}:

hm=arg⁡min⁡h∈H∑i(−gi−h(xi))2.h_m = \arg\min_{h \in \mathcal{H}} \sum_i \big(-g_i - h(x_i)\big)^2.

This maximizes the correlation of the achievable direction hm=(hm(x1),…,hm(xn))\mathbf{h}_m = (h_m(x_1), \dots, h_m(x_n)) with the ideal descent direction −g-\mathbf{g}, subject to the constraint that hmh_m lies in the weak-learner family. Provided g⊤hm<0\mathbf{g}^\top \mathbf{h}_m < 0 (i.e., the weak learner is even weakly correlated with the true negative gradient — the same "better than random" condition required in AdaBoost), the line search finds a ρm>0\rho_m > 0 small enough that the first-order Taylor approximation is accurate and

L(Fm−1+ρmhm)<L(Fm−1).L(\mathbf{F}_{m-1} + \rho_m \mathbf{h}_m) < L(\mathbf{F}_{m-1}).

Hence the sequence of training losses L(F0)>L(F1)>⋯L(F_0) > L(F_1) > \cdots is strictly decreasing as long as the weak learner can achieve nonzero correlation with the residual — exactly analogous to the weak learning assumption in boosting theory. If LL is convex in F\mathbf{F} (true for squared error, logistic loss, and exponential loss) and the weak learner family is rich enough that the achievable directions eventually span the relevant subspace, the greedy stagewise procedure converges to the global minimum of LL over the additive span of H\mathcal{H}; more generally it is a form of coordinate-free steepest descent and inherits the standard non-increasing property of gradient descent under a sufficiently small step size (this is the role shrinkage ν\nu plays: it enforces the small-step regime where the first-order approximation used above remains valid, at the cost of needing more stages MM to converge).

Honest tradeoffs. The procedure is greedy and stagewise: once hmh_m is fixed it is never revisited, so the algorithm does not jointly optimize all weak learners together, unlike, say, fully retraining a neural network end to end. This greediness is precisely what makes it computationally tractable — O(Mnpd)O(Mnpd) instead of a combinatorial search over ensembles — but it means gradient boosting can get stuck fitting noise late in training if MM is too large or ν\nu too close to 1, which is why regularization (subsampling, shrinkage, tree-depth limits, early stopping on a validation set) is not optional in practice but integral to the method as actually deployed.

Worked example

Consider a tiny 1-D regression problem with squared-error loss, ℓ(y,F)=12(y−F)2\ell(y,F) = \tfrac12(y-F)^2, so residuals are just y−Fy - F. Weak learners are decision stumps (single-split regression trees). Data:

iixix_iyiy_i
112.0
222.2
335.0
445.4

Stage 0. F0(x)=yˉ=(2.0+2.2+5.0+5.4)/4=3.65F_0(x) = \bar y = (2.0+2.2+5.0+5.4)/4 = 3.65.

Stage 1. Residuals ri=yi−F0r_i = y_i - F_0:

iiyiy_iF0F_0rir_i
12.03.65−1.65
22.23.65−1.45
35.03.651.35
45.43.651.75

Fit a stump: the best split is between x=2x=2 and x=3x=3 (it separates the negative residuals from the positive ones). Left region {x≤2}\{x\le 2\} predicts the mean residual (−1.65−1.45)/2=−1.55(-1.65-1.45)/2 = -1.55; right region {x>2}\{x>2\} predicts (1.35+1.75)/2=1.55(1.35+1.75)/2 = 1.55. So

h1(x)={−1.55x≤21.55x>2.h_1(x) = \begin{cases}-1.55 & x \le 2\\ 1.55 & x > 2\end{cases}.

Exact line search for squared error with a stump target reduces to ρ1=1\rho_1=1 (the stump already predicts the mean residual per region, which is the exact least-squares fit). Apply shrinkage ν=0.5\nu = 0.5:

F1(x)=F0(x)+0.5⋅h1(x).F_1(x) = F_0(x) + 0.5 \cdot h_1(x).

For x≤2x\le2: F1=3.65−0.775=2.875F_1 = 3.65 - 0.775 = 2.875. For x>2x>2: F1=3.65+0.775=4.425F_1 = 3.65+0.775=4.425.

Stage 2. New residuals against F1F_1:

iiyiy_iF1(xi)F_1(x_i)rir_i
12.02.875−0.875
22.22.875−0.675
35.04.4250.575
45.44.4250.975

The same split location is again optimal (residual sign still changes between x=2x=2 and x=3x=3). New stump: left mean =(−0.875−0.675)/2=−0.775= (-0.875-0.675)/2 = -0.775, right mean =(0.575+0.975)/2=0.775=(0.575+0.975)/2=0.775. Update with ν=0.5\nu=0.5:

F2(x≤2)=2.875−0.3875=2.4875,F2(x>2)=4.425+0.3875=4.8125.F_2(x\le2) = 2.875 - 0.3875 = 2.4875, \qquad F_2(x>2) = 4.425+0.3875=4.8125.

Observe the pattern. Each stage halves the remaining residual magnitude (because ν=0.5\nu=0.5 and the stump exactly captures the group means), converging geometrically toward the true group means 2.12.1 (average of y1,y2y_1,y_2) and 5.25.2 (average of y3,y4y_3,y_4):

StagePrediction, x≤2x\le2Prediction, x>2x>2Training SSE
03.653.652×1.652+2×1.352=10.892\times1.65^2+2\times1.35^2 = 10.89
12.8754.4252×0.7752×2≈2.4012\times0.775^2\times2\approx2.401
22.48754.8125≈0.600\approx 0.600
32.293755.00625≈0.150\approx 0.150

This numerically confirms strict monotone decrease of training loss, converging toward the piecewise-constant function that perfectly separates the two clusters — exactly the additive-model global optimum over stumps split at x=2.5x=2.5.

Common pitfalls & traps

PitfallWhy it happensFix
Too many boosting rounds, no shrinkageEach stage chases training residuals; without a small ν\nu the model memorizes noiseUse small learning rate (0.01–0.1) with early stopping on validation loss
Confusing "residual" with squared-error residual for every lossThe pseudo-residual formula depends on ℓ\ell; e.g. logistic loss residual is not y−Fy-FAlways re-derive −∂ℓ/∂F-\partial\ell/\partial F for the chosen loss before implementing
Deep weak learnersDeep trees are strong learners on their own; boosting them compounds variance rather than correcting biasRestrict tree depth (typically 3–8) so each stage stays a weak learner
Ignoring feature scale/leakage in line searchAn overly generous line search can take a huge step on one outlier-driven residualCombine line search with shrinkage; use robust losses (Huber) if outliers present
Treating ρm=1\rho_m=1 as always correctExact for squared-error stumps in isolation, but wrong once shrinkage or non-quadratic losses are involvedAlways run the actual line-search or Newton step per loss, don't hardcode ρ=1\rho=1
Ignoring stagewise greedinessAssuming boosting jointly optimizes all hmh_m together like end-to-end trainingRemember weak learners are never revisited — treat MM, ν\nu as first-class hyperparameters

Pioneers & history

Gradient boosting's core formulation — casting boosting as functional gradient descent for arbitrary differentiable losses — was developed by Jerome H. Friedman at Stanford in the late 1990s, unifying the AdaBoost framework (loss-specific, exponential loss) into a general-purpose machine that works with any smooth loss and any weak learner supporting least-squares fitting.

Origins · 1 minJerome H. Friedman and how this was discovered
JH
Jerome H. Friedman
1939– · Stanford University, statistics and computational learning

Friedman co-developed CART (classification and regression trees) and later formalized "Greedy Function Approximation: A Gradient Boosting Machine," the paper that recast boosting as stagewise steepest descent in function space, directly enabling gradient boosted trees as used today.

History
1997
Freund and Schapire's AdaBoost is shown to minimize exponential loss via reweighting, motivating a search for a general loss-agnostic boosting theory.
1999
Leo Breiman notes boosting can be interpreted as a gradient descent procedure in function space.
2001
Jerome Friedman publishes "Greedy Function Approximation: A Gradient Boosting Machine," formalizing pseudo-residuals, line search, and stochastic subsampling (stochastic gradient boosting).
2014
XGBoost is released, adding second-order (Newton) approximations, regularized objectives, and highly engineered parallel tree construction to the gradient boosting framework.
2017
LightGBM and CatBoost introduce histogram-based splitting and ordered boosting, further scaling gradient boosted trees to massive tabular datasets.

Where this matters

Gradient boosted trees are the default choice for structured/tabular prediction problems across industry: credit risk scoring, fraud detection, click-through-rate and conversion prediction in online advertising, search ranking (e.g. learning-to-rank systems built on gradient boosting), and demand forecasting in logistics. Libraries such as XGBoost, LightGBM, and CatBoost implement the functional gradient descent framework described here, augmented with second-order Newton corrections, regularized leaf weights, and engineering optimizations (histogram binning, GPU acceleration, categorical feature handling) — but the mathematical core remains: fit a weak learner to the negative gradient, take a controlled step, repeat. Kaggle-style competitions on tabular data are dominated almost exclusively by gradient boosting variants, and production ML pipelines routinely combine boosted trees with other model families, a practice formalized under Stacking and Model Blending.

Ask the tutor: How does the line-search step size interact with shrinkage, and why do modern libraries often replace exact line search with a fixed learning rate plus second-order (Newton) leaf weights?

How is gradient boosting different from AdaBoost?

AdaBoost is derived specifically to minimize exponential loss by reweighting misclassified examples and combining weak classifiers with weights proportional to their accuracy. Gradient boosting generalizes this: it shows that AdaBoost's reweighting scheme is a special case of fitting a weak learner to the negative gradient of exponential loss. By replacing the loss with squared error, logistic loss, or Huber loss, the exact same stagewise fitting procedure yields regression boosting, robust regression, or probabilistic classification, without needing a bespoke derivation for each loss. AdaBoost is thus one instance within the broader gradient boosting framework, not a separate algorithm family.

Why is it called "functional" gradient descent rather than just gradient descent?

Ordinary gradient descent optimizes over a finite-dimensional parameter vector θ\theta, computing ∇θL\nabla_\theta L. Gradient boosting instead treats the entire prediction function FF as the object being optimized, working in the (infinite-dimensional) space of functions. The gradient is computed pointwise on training data, giving an nn-dimensional gradient vector that lives in function-evaluation space, not parameter space. Since we cannot represent arbitrary functions exactly, each step projects this ideal gradient onto the closest approximation achievable by a weak learner, which is why the "functional" qualifier is essential to the name.

What weak learners are typically used, and why trees?

Shallow regression trees (stumps to depth ~8) are the near-universal choice because they naturally handle mixed numerical/categorical features, require no feature scaling, capture nonlinearities and interactions up to their depth, and are cheap to fit via greedy recursive splitting. Crucially, a tree's leaf values are trivial to set to the least-squares-optimal residual mean per leaf, making the "fit weak learner to pseudo-residuals" step exact and fast. Linear models or splines can also serve as weak learners, but trees' robustness to feature scaling and missing values makes them dominant in practice.

How does gradient boosting relate to bagging or random forests?

Bagging and random forests train many strong-ish trees independently on bootstrap samples and average their predictions to reduce variance; each tree sees the original targets. Gradient boosting instead trains weak trees sequentially, each targeting the current residual/gradient, explicitly reducing bias stage by stage. Boosting typically achieves lower bias but is more prone to overfitting and is sensitive to hyperparameters (learning rate, depth, number of rounds), whereas random forests are more robust out-of-the-box but often plateau at higher error on structured tabular tasks.

Why do practical implementations add a second-order (Newton) term instead of pure gradient descent?

Pure functional gradient descent uses only the first derivative of the loss to define pseudo-residuals, which is a first-order (steepest descent) approximation. XGBoost and similar systems additionally use the second derivative (Hessian) to weight each residual, effectively performing a Newton step in function space. This typically converges faster and more stably, especially for losses like logistic loss where the curvature varies substantially across the margin. The core "fit weak learner to a target" loop stays the same; only the target and per-example weights change.

Does gradient boosting always converge to the global minimum of the loss?

Only under favorable conditions: if the loss is convex in the prediction vector and the weak learner family is expressive enough to eventually cover the directions needed to descend, stagewise steepest descent converges toward the global minimum over the additive span of the weak learner class. In practice, the weak-learning condition (nonzero correlation with the negative gradient at every stage) can fail to hold indefinitely, and finite MM with early stopping means training halts well before literal convergence — which is desirable, since converging fully to the training-loss minimum usually means overfitting.

What causes gradient boosting to overfit, and how serious is the risk compared to other methods?

Because every stage is fit to reduce the training loss, and stages are never revisited, boosting will keep improving training performance indefinitely unless stopped — it has no automatic notion of "enough." Combined with sufficiently flexible trees, given enough rounds it can memorize noise in the training set, harming generalization more aggressively than bagging-based ensembles, which average away noise rather than sequentially fitting it. This is why shrinkage, subsampling, tree-depth limits, and validation-based early stopping are considered mandatory rather than optional tuning knobs.

Before this

Where this leads