TensorTonic
Study Plans
Study Plan
Fit Learning-Rate and Batch-Size Scaling
Scaling LawsLanguage ModelsOptimization
Hard

Fit learning-rate and batch-size scaling laws from measured loss grids. For each model scale, select the lowest measured loss; ties favor the earlier learning-rate index, then the earlier batch-size index. Let SiS_iSi​ be model scale at index iii, ηi∗\eta_i^*ηi∗​ its selected learning rate, and Bi∗B_i^*Bi∗​ its selected batch size. Fit two independent, unweighted least-squares lines using natural logarithms:

log⁡ηi∗=log⁡aη+bηlog⁡Si.\log\eta_i^*=\log a_\eta+b_\eta\log S_i.logηi∗​=logaη​+bη​logSi​. log⁡Bi∗=log⁡aB+bBlog⁡Si.\log B_i^*=\log a_B+b_B\log S_i.logBi∗​=logaB​+bB​logSi​.

Here, aηa_\etaaη​ and aBa_BaB​ are positive coefficients; bηb_\etabη​ and bBb_BbB​ are exponents. Each residual is the observed log value minus its fitted log value. At target_scale, predict the coefficient multiplied by that scale raised to its exponent.

Return a Python dictionary with:

  • optima: a model-scale-ordered list of dictionaries with model_scale, learning_rate, batch_size and loss, all Python floats.
  • learning_rate_coefficient, learning_rate_exponent, batch_size_coefficient, batch_size_exponent, target_learning_rate and target_batch_size: Python floats.
  • learning_rate_residuals and batch_size_residuals: float64 PyTorch tensors of shape (number of model scales,) on the model-scale input device.
Loading visualization...

Examples

Input: model_scales = [1,4], learning_rates = [0.1,0.2], batch_sizes = [8,16], measured_losses = [[[1,2],[3,4]],[[4,3],[2,1]]], target_scale = 16

Output: {"optima":[{"model_scale":1,"learning_rate":0.1,"batch_size":8,"loss":1},{"model_scale":4,"learning_rate":0.2,"batch_size":16,"loss":1}],"learning_rate_coefficient":0.1,"learning_rate_exponent":0.5,"batch_size_coefficient":8,"batch_size_exponent":0.5,"learning_rate_residuals":[0,0],"batch_size_residuals":[0,0],"target_learning_rate":0.4,"target_batch_size":32}

Explanation: The two measured optima define exact square-root scaling for both hyperparameters.

Input: model_scales = [1,2], learning_rates = [0.1,0.2], batch_sizes = [8,16], measured_losses = [[[1,1],[1,1]],[[1,1],[1,1]]], target_scale = 4

Output: {"optima":[{"model_scale":1,"learning_rate":0.1,"batch_size":8,"loss":1},{"model_scale":2,"learning_rate":0.1,"batch_size":8,"loss":1}],"learning_rate_coefficient":0.1,"learning_rate_exponent":0,"batch_size_coefficient":8,"batch_size_exponent":0,"learning_rate_residuals":[0,0],"batch_size_residuals":[0,0],"target_learning_rate":0.1,"target_batch_size":8}

Input: model_scales = [1,2,4], learning_rates = [0.01,0.1,1], batch_sizes = [1,8,64], measured_losses.shape = (3, 3, 3), target_scale = 8

Output: {"optima":[{"model_scale":1,"learning_rate":0.01,"batch_size":1,"loss":1},{"model_scale":2,"learning_rate":0.1,"batch_size":64,"loss":1.01},{"model_scale":4,"learning_rate":1,"batch_size":8,"loss":1.02}],"learning_rate_coefficient":0.01,"learning_rate_exponent":3.321928,"batch_size_coefficient":2.828427,"batch_size_exponent":1.5,"learning_rate_residuals":[0,0,0],"batch_size_residuals":[-1.039721,2.079442,-1.039721],"target_learning_rate":10,"target_batch_size":64}

Hint 1

torch.argmin returns the first index when minima tie.

Hint 2

divmod recovers a row and column from a flattened index.

Hint 3

torch.linalg.lstsq solves a least-squares system.

Requirements

  • Use PyTorch float64 arithmetic for fitting and prediction.
  • Preserve model-scale order and the stated tie rules.
  • Do not modify input tensors.

Constraints

  • model_scales is a one-dimensional float64 PyTorch tensor with at least two unique positive entries.
  • learning_rates and batch_sizes are nonempty one-dimensional float64 PyTorch tensors with positive entries.
  • measured_losses is a float64 PyTorch tensor of shape (number of scales, number of learning rates, number of batch sizes).
  • target_scale is a positive finite Python number.
  • All tensor values are finite; inputs may be noncontiguous.
Try Similar Problems
Recover an IsoFLOP Compute-Optimal FrontierHardGenerate a Warmup-Stable-Decay ScheduleMediumDiagnose muP Width InvariantsMediumOrthogonalize a Muon Momentum UpdateEasyFit a Data Power Law with a Noise FloorHardExtrapolate Data-Mixture Scaling CurvesHardMixed-Precision Training Memory AccountantEasyEstimate Critical Batch SizeEasyGRPO Group-Relative AdvantageHardHungarian MatchingHardImplement Speculative Decoding and Token VerificationHardGradient ClippingHard

Accepts: array

Accepts: array

Accepts: array

Accepts: array

Accepts: number

You must run your code first.

Fit Learning-Rate and Batch-Size Scaling

Scaling LawsLanguage ModelsOptimization
Hard

Fit learning-rate and batch-size scaling laws from measured loss grids. For each model scale, select the lowest measured loss; ties favor the earlier learning-rate index, then the earlier batch-size index. Let SiS_iSi​ be model scale at index iii, ηi∗\eta_i^*ηi∗​ its selected learning rate, and Bi∗B_i^*Bi∗​ its selected batch size. Fit two independent, unweighted least-squares lines using natural logarithms:

log⁡ηi∗=log⁡aη+bηlog⁡Si.\log\eta_i^*=\log a_\eta+b_\eta\log S_i.logηi∗​=logaη​+bη​logSi​. log⁡Bi∗=log⁡aB+bBlog⁡Si.\log B_i^*=\log a_B+b_B\log S_i.logBi∗​=logaB​+bB​logSi​.

Here, aηa_\etaaη​ and aBa_BaB​ are positive coefficients; bηb_\etabη​ and bBb_BbB​ are exponents. Each residual is the observed log value minus its fitted log value. At target_scale, predict the coefficient multiplied by that scale raised to its exponent.

Return a Python dictionary with:

  • optima: a model-scale-ordered list of dictionaries with model_scale, learning_rate, batch_size and loss, all Python floats.
  • learning_rate_coefficient, learning_rate_exponent, batch_size_coefficient, batch_size_exponent, target_learning_rate and target_batch_size: Python floats.
  • learning_rate_residuals and batch_size_residuals: float64 PyTorch tensors of shape (number of model scales,) on the model-scale input device.
Loading visualization...

Examples

Input: model_scales = [1,4], learning_rates = [0.1,0.2], batch_sizes = [8,16], measured_losses = [[[1,2],[3,4]],[[4,3],[2,1]]], target_scale = 16

Output: {"optima":[{"model_scale":1,"learning_rate":0.1,"batch_size":8,"loss":1},{"model_scale":4,"learning_rate":0.2,"batch_size":16,"loss":1}],"learning_rate_coefficient":0.1,"learning_rate_exponent":0.5,"batch_size_coefficient":8,"batch_size_exponent":0.5,"learning_rate_residuals":[0,0],"batch_size_residuals":[0,0],"target_learning_rate":0.4,"target_batch_size":32}

Explanation: The two measured optima define exact square-root scaling for both hyperparameters.

Input: model_scales = [1,2], learning_rates = [0.1,0.2], batch_sizes = [8,16], measured_losses = [[[1,1],[1,1]],[[1,1],[1,1]]], target_scale = 4

Output: {"optima":[{"model_scale":1,"learning_rate":0.1,"batch_size":8,"loss":1},{"model_scale":2,"learning_rate":0.1,"batch_size":8,"loss":1}],"learning_rate_coefficient":0.1,"learning_rate_exponent":0,"batch_size_coefficient":8,"batch_size_exponent":0,"learning_rate_residuals":[0,0],"batch_size_residuals":[0,0],"target_learning_rate":0.1,"target_batch_size":8}

Input: model_scales = [1,2,4], learning_rates = [0.01,0.1,1], batch_sizes = [1,8,64], measured_losses.shape = (3, 3, 3), target_scale = 8

Output: {"optima":[{"model_scale":1,"learning_rate":0.01,"batch_size":1,"loss":1},{"model_scale":2,"learning_rate":0.1,"batch_size":64,"loss":1.01},{"model_scale":4,"learning_rate":1,"batch_size":8,"loss":1.02}],"learning_rate_coefficient":0.01,"learning_rate_exponent":3.321928,"batch_size_coefficient":2.828427,"batch_size_exponent":1.5,"learning_rate_residuals":[0,0,0],"batch_size_residuals":[-1.039721,2.079442,-1.039721],"target_learning_rate":10,"target_batch_size":64}

Hint 1

torch.argmin returns the first index when minima tie.

Hint 2

divmod recovers a row and column from a flattened index.

Hint 3

torch.linalg.lstsq solves a least-squares system.

Requirements

  • Use PyTorch float64 arithmetic for fitting and prediction.
  • Preserve model-scale order and the stated tie rules.
  • Do not modify input tensors.

Constraints

  • model_scales is a one-dimensional float64 PyTorch tensor with at least two unique positive entries.
  • learning_rates and batch_sizes are nonempty one-dimensional float64 PyTorch tensors with positive entries.
  • measured_losses is a float64 PyTorch tensor of shape (number of scales, number of learning rates, number of batch sizes).
  • target_scale is a positive finite Python number.
  • All tensor values are finite; inputs may be noncontiguous.
Try Similar Problems
Recover an IsoFLOP Compute-Optimal FrontierHardGenerate a Warmup-Stable-Decay ScheduleMediumDiagnose muP Width InvariantsMediumOrthogonalize a Muon Momentum UpdateEasyFit a Data Power Law with a Noise FloorHardExtrapolate Data-Mixture Scaling CurvesHardMixed-Precision Training Memory AccountantEasyEstimate Critical Batch SizeEasyGRPO Group-Relative AdvantageHardHungarian MatchingHardImplement Speculative Decoding and Token VerificationHardGradient ClippingHard

Accepts: array

Accepts: array

Accepts: array

Accepts: array

Accepts: number

You must run your code first.