Is AI progress accelerating? It depends on the shape of each benchmark’s curve

Epoch's Capabilities Index assumes every benchmark score follows one S-shaped curve of capability: sigmoid(slope × (capability − difficulty)). That is a choice. Below, seven different curves are fitted to each benchmark, from ECI's logistic to curves of any monotone shape, and compared on scores they never saw. Then each is fitted jointly with capability, to see how it changes the measured speed and acceleration of frontier progress. The curves agree on the rate up to a year ago (about 13.5 ECI points a year). The curves that predict newer models best measure faster recent growth than ECI, but how much faster is not pinned down by the data.

Is progress accelerating? It depends on the curve

Here each curve is fitted jointly with capability: curves and model positions alternate until they settle, with Claude 3.5 Sonnet = 130 and GPT-5 = 150 fixing the scale. Every option gives its own frontier (best capability to date, from GPT-4 on). The question is how fast it rose in the last 12 months () versus the 12 months before ().

Frontier capability under each curve

Best capability to date, straight lines between record-setting models; shaded: the two 12-month windows; dashed grey: Epoch's published ECI. The scale is fixed at two points, marked ◆: Claude 3.5 Sonnet ≡ 130 and GPT-5 ≡ 150 under every curve, so the curves can only differ in how they space models around and beyond those two.

Growth, previous vs last 12 months

ECI points per year. Hollow: previous 12 months; filled: last 12 months, with 90% interval from refits on resampled benchmarks. Right: share of resamples where growth sped up.

Which answers settle?

Last-12-month growth after each round of fitting. Solid lines settle. Dashed lines are curves free per benchmark: they keep stretching the top of the axis, so their number reflects the penalty and iteration count, not the data.

Why: the logistic saturates too fast

Later models' actual minus predicted score, on curves fitted to models released before , grouped by predicted score. Later models do better than predicted where scores are low and worse near the top.

Which benchmarks drive it?

Two views of where the logistic understates recent progress. Left: refit both curves without each benchmark in turn; leverage is how much the piecewise-linear curve's extra last-year growth over the logistic ( points a year with all benchmarks) shrinks when that benchmark is dropped. Right: on each benchmark, how much higher its own free curve places last year's models than the logistic does, relative to the year before (ECI points). Look at them on the main chart, piecewise-linear curve, implied-capability view.

Change in held-out error (RMSE in score units) relative to ECI's logistic; lower is better. Bars are 90% intervals from resampling models. Random: 5-fold over all scores. Later models: curves fitted only on models released before , then used to predict half of each later model's scores ( scores), which tests extrapolation.

Random held-out scores

Later models

Every option on one benchmark

Y axis

Joint fits: free curves and a second factor

Here capability is re-estimated together with the curves, comparing ECI's logistic with the piecewise-linear monotone curve, with one or two factors per model.

Each benchmark's curve, free shape vs sigmoid

Each panel shows one benchmark's scores against model capability θ from the one-factor nonparametric fit. The solid line is that benchmark's monotone curve, with a bootstrap 80% band. The dashed line is the best sigmoid on the same θ, which is the shape ECI assumes. Curves are drawn solid only where the benchmark has scores. Under each name, the held-out (5-fold) error of the sigmoid → the free curve. Click a panel for detail. CV-tuned curves use the penalties that predict held-out scores best, and they end up close to the sigmoid. Lightly penalised curves show where the scores alone would pull each curve. They overfit (held-out RMSE about 0.096) but are the better diagnostic for where a benchmark departs from the ECI shape.

Y axis
Free curve
Order

Residuals of each fit

Score minus prediction, out of fold. A pattern in the sigmoid's residuals that the free curve removes is real misfit. Scatter that both share is noise.

All 60 curves against the sigmoid

Each benchmark's free curve is redrawn in its own sigmoid's units. x = slope × (θ − midpoint), the sigmoid's own log-odds. y = how far the free curve's log-odds sit above (+) or below (−) that sigmoid. ECI's assumption is the zero line for every benchmark. A curve that rises at the right is steeper at the top than a sigmoid, and one that dips at the left starts slower. Curves are drawn only where the benchmark has scores and the fit is between 1% and 99%. The curve switch above (CV-tuned / lightly penalised) applies here too. Click an area in the legend to hide it.

Held-out error

Root-mean-square error in score units (0–1), on scores the fit never saw. Random: 5-fold over cells, each model keeping at least 3 training scores. Forward: curves are fit only on models released before . Each later model is placed using half of its scores, and the other half are predicted, so this tests extrapolation into a capability range the curves haven't seen. Bars are 90% intervals from resampling models.

Two dimensions: models as points, benchmarks as directions

In the two-factor model, each model is a point and each benchmark a direction. A benchmark's score rises, along its own monotone curve, with a model's projection onto that direction. Axis 1 is on the ECI scale (Claude 3.5 Sonnet = 130, GPT-5 = 150). Axis 2 is in the same units and centred at 0. Colour is release date. Rays show the benchmark directions, and the strip on the right lists their angles.

Curves
Labels

Does the ranking change?

Each model's capability in the one-factor nonparametric fit (θ) against its published ECI. Points on the diagonal are placed the same by both, and the largest movers are labelled. With a free monotone curve only the ordering on this axis is identified. Its spacing comes from the ECI starting point and the two anchors (see method).

What one factor leaves over

Residuals (score − in-sample fit) for every scored cell. Benchmarks are rows, sorted by the capability at which their curve crosses 50%. Models are columns, sorted by θ. Orange = scored higher than predicted, blue = lower, blank = not scored. A block of one colour is structure a single factor can't explain. Switch to the two-factor fit to see how much of it a second axis absorbs.

Fit

The frontier, measured on each benchmark's own curve

The thick line is frontier θ (running best by release date, from GPT-4 on). Each thin line reads the same frontier models off one benchmark's free curve and converts back to capability as if that curve were a sigmoid: midpoint + log-odds ÷ slope. If ECI's sigmoid were exactly right, every thin line would lie on the thick one. Where they fan out, the measured rate of progress depends on which benchmark's scale you trust. Lines are drawn only where the frontier is inside a benchmark's scored range and the curve is between 2% and 98%, since inverting a saturated curve is meaningless. The curve switch in the first section applies here too.

Method

Model. scoremb = gb(um · db), where um is a model's position (one or two coordinates), db = (cos αb, sin αb) a benchmark's direction (|α| ≤ 70°, softly shrunk towards 0), and gb a nondecreasing curve. A sigmoid gb with one factor is ECI. A monotone gb is piecewise linear on knots with nonnegative rises, fit by nonnegative least squares. It is penalised for changes in slope and shrunk towards that benchmark's own best sigmoid, so a benchmark with few scores stays close to the ECI shape and one with many can bend.

Fitting. Same objective as Epoch's: squared error in score space over the 2,844 scored cells, plus penalties. The curve penalties (smoothness , shrinkage ) and the two-factor priors (axis-2 sd, angle sd) sit near the minimum of a flat 5-fold CV surface on the same folds reported above (scripts/npca_tune.py). Other settings on that surface predict held-out scores about as well but imply different spacing above GPT-5, so the curve penalties are a choice, not an estimate. The forward test in this section caps later models near 152 (curves flat beyond their knots); scripts/npca_forward.py is the corrected version. Fitting alternates three steps until the error stops falling: refit each curve; for two factors, choose each benchmark's angle by grid search; place each model by coarse-to-fine grid search, with a weak prior. Positions are re-anchored after each pass so Claude 3.5 Sonnet = 130 and GPT-5 = 150 on axis 1. Every fit, including those inside cross-validation, starts from Epoch's ECI refit on that fit's own training scores (scripts/eci_fit.py), so no held-out score enters through the starting point. The one-factor sigmoid fit reproduces Epoch's in-sample error to within 0.3%.

What is identified. With a free monotone curve and one factor, any monotone stretch of the capability axis can be absorbed into the curves. The data then pin down only the order of models, not the distances between them. Here the spacing is inherited from the ECI start and the anchors. Claims about the speed of progress therefore rest on the sigmoid assumption. The last chart shows how much they would change if each benchmark's own curve defined the scale. With two factors, the requirement that every direction's projection works through one curve constrains the plane much more tightly.

Uncertainty. Bands on the curves are the 10th–90th percentiles over refits on models resampled with replacement (the two anchor models always kept). Intervals on held-out error come from resampling models.

Not done here. A Gaussian-copula (rank-likelihood) factor model would give a fully Bayesian version and handle tied 0/1 scores formally. Three or more factors are not fit: with a median of 9 scores per model, two is already a lot to ask. Code: scripts/npca_fit.py (model), scripts/npca_build.py (fits, CV, bootstrap → data/npca.json), scripts/npca_build_page.py. Data: Epoch AI, CC BY 4.0, snapshot of 1 Oct 2026.