09d-斯坦福 CS336 作业三:缩放定律(Scaling Laws)

09d-斯坦福 CS336 作业三:缩放定律(Scaling Laws)📈

本文档详解斯坦福 CS336 课程的作业三,聚焦语言模型的缩放定律(Scaling Laws)。通过理论与实践相结合的方式,帮助读者理解如何在给定计算预算下最优地分配模型大小和训练 token 数,以及如何拟合缩放曲线预测模型性能 🎯

This document explains Assignment 3 of Stanford CS336 course, focusing on Scaling Laws for language models. It helps readers understand how to optimally allocate model size and training tokens under a given compute budget, and how to fit scaling curves to predict model performance 🎯


术语表 / Terminology

术语 / Term 中文 说明 / Description
Scaling Laws 缩放定律 描述模型性能与模型大小、数据量、计算量之间关系的经验法则
IsoFLOPs 等计算量 保持总计算量(FLOPs)不变,改变模型大小和数据量的配置
FLOPs 浮点运算次数 Floating Point Operations,衡量计算成本的单位
Compute Budget 计算预算 训练模型时可用的总计算量限制
Compute-Optimal 计算最优 在给定计算预算下达到最佳性能的配置
Power Law 幂律 数学关系 y=a×x−by = a \times x^{-b} y=a×x−b,描述缩放趋势
Kaplan Laws Kaplan 定律 OpenAI 2020 年提出的早期缩放定律
Chinchilla Laws Chinchilla 定律 DeepMind 2022 年提出的计算最优缩放定律
Loss 损失 交叉熵损失(Cross-Entropy Loss),衡量模型预测误差

章节阅读路线图 🗺️ / Chapter Reading Roadmap

  1. 缩放定律概述 📊 / Overview of Scaling Laws → 理解缩放定律的核心概念和历史发展
  2. Kaplan 缩放定律(2020) 📐 / Kaplan Scaling Laws → 学习早期的幂律关系和过拟合分析
  3. Chinchilla 缩放定律(2022) 🦫 / Chinchilla Scaling Laws → 掌握计算最优的模型与数据配比
  4. IsoFLOPs 分析方法 🔬 / IsoFLOPs Analysis Method → 理解等计算量下的实验设计
  5. 作业三任务详解 📝 / Assignment 3 Tasks → 拆解三个核心任务的要求和实现思路
  6. 拟合缩放曲线 📈 / Fitting Scaling Curves → 学习如何使用幂律函数拟合实验数据
  7. 优化计算预算分配 ⚖️ / Optimizing Compute Budget → 找到最佳的模型大小和 token 数配比
  8. 总结 🎯 / Summary → 回顾核心要点和实际应用价值

1. 缩放定律概述 📊 / Overview of Scaling Laws

📖 Note: 本章介绍缩放定律的核心概念和历史发展 / This chapter introduces the core concepts and historical development of scaling laws.

1.1 什么是缩放定律?🤔

缩放定律(Scaling Laws) 是描述神经网络性能(通常是损失 Loss)与关键因素(模型大小、训练数据量、计算量)之间关系的经验法则(Empirical Rules) 📏。

直观类比 🎨:想象你在投资理财产品

  • 模型大小 = 你投入的本金多少
  • 数据量 = 你投资的时间长短
  • 计算量 = 你花费的总成本(本金 × 时间)
  • 损失 = 你的投资风险(越低越好)

缩放定律告诉我们:如何分配本金和时间,才能让风险最低、收益最高? 💰

1.2 为什么需要缩放定律?🎯

在训练大语言模型(LLM)时,我们面临一个核心问题:

💭 给定固定的计算预算(比如 100 万美元的 GPU 费用),应该训练多大的模型?用多少数据?

如果没有缩放定律,我们只能盲目尝试

  • ❌ 训练一个小模型,用过量的数据 → 浪费计算资源
  • ❌ 训练一个超大模型,用很少的数据 → 严重过拟合
  • ✅ 找到计算最优(Compute-Optimal) 的配置 → 性能最大化

缩放定律的价值 💎:

  1. 预测性能 📈:在小规模实验后,预测大规模模型的表现
  2. 指导决策 🧭:在有限预算下,选择最佳的模型大小和数据量
  3. 节省成本 💰:避免浪费计算资源在次优配置上
  4. 理解趋势 🔍:揭示模型性能随规模变化的内在规律

1.3 缩放定律的发展历史 📅

时间 研究 核心发现
2020 Kaplan 等(OpenAI)🏢 损失与模型大小、数据量呈幂律关系
2022 Hoffmann 等(DeepMind)🧠 Chinchilla 定律:模型大小和 token 数应等比例缩放
2023-2024 后续研究 🔬 验证和扩展缩放定律到更大规模

关键转折点 🔄:

  • Kaplan(2020) 认为:应该训练更大的模型 ,用相对较少的数据,在收敛前停止训练
  • Chinchilla(2022) 发现:Kaplan 的模型严重欠训练(Under-trained) ,应该同时增加模型大小和数据量

缩放定律参考资料:


2. Kaplan 缩放定律(2020)📐 / Kaplan Scaling Laws

📖 Note: 本章学习 OpenAI 2020 年提出的早期缩放定律 / This chapter learns the early scaling laws proposed by OpenAI in 2020.

2.1 核心发现 🔍

Kaplan 等人(2020)在论文《Scaling Laws for Neural Language Models》中研究了语言模型在交叉熵损失(Cross-Entropy Loss)上的经验缩放规律 📊。

三大核心发现 💎:

  1. 幂律关系(Power-Law Relationship) 📈

    损失 LL L 与模型大小 NN N、数据集大小 DD D、计算量 CC C 之间都遵循幂律(Power Law)
    L(N)= ( NcN ) αN +L0L(N) = \left(\frac{N_c}{N}\right)^{\alpha_N} + L_0 L(N)=(NNc)αN+L0
    L(D)= ( DcD ) αD +L0L(D) = \left(\frac{D_c}{D}\right)^{\alpha_D} + L_0 L(D)=(DDc)αD+L0

    其中:📝

    • NN N:模型参数量(Number of Parameters)
    • DD D:训练 token 数量(Dataset Size)
    • Nc,Dc N_c, D_c Nc,Dc:特征尺度(Characteristic Scale)
    • αN,αD \alpha_N, \alpha_D αN,αD:幂律指数(Power-Law Exponent)
    • L0 L_0 L0:不可约损失(Irreducible Loss),数据集的内在噪声
  2. 架构细节影响很小 🏗️

    在很大范围内,网络宽度(Width)或深度(Depth)等架构细节对性能影响微乎其微

  3. 最优计算分配 ⚖️

    给定固定计算预算,更大的模型更样本高效(Sample-Efficient),应该:

    • 训练非常大的模型
    • 使用相对适度的数据量
    • 在收敛前显著提前停止训练(Stop Significantly Before Convergence)

2.2 幂律的直观理解 💡

什么是幂律? 🤔

幂律是一种数学关系,形式为 y=a×x−by = a \times x^{-b} y=a×x−b。在双对数坐标(Log-Log Plot)上,幂律表现为一条直线 📏。

直观类比 🎨:想象你在减肥

  • 第 1 个月:减 10 斤(效果显著)
  • 第 2 个月:减 5 斤(效果减半)
  • 第 3 个月:减 2.5 斤(效果再次减半)
  • ...

每次努力的效果都在递减,但永远不会达到零------这就是幂律的特征。

在缩放定律中 📊:

  • 模型大小增加 10 倍 → 损失下降一个固定比例
  • 数据量增加 10 倍 → 损失下降另一个固定比例
  • 这种趋势可以跨越7 个数量级(7 Orders of Magnitude)

2.3 过拟合分析 🎭

Kaplan 发现了一个简单方程描述过拟合(Overfitting) 与模型/数据集大小的关系:
L(N,D)= ( NcN ) αN + ( DcD ) αD +L0L(N, D) = \left(\frac{N_c}{N}\right)^{\alpha_N} + \left(\frac{D_c}{D}\right)^{\alpha_D} + L_0 L(N,D)=(NNc)αN+(DDc)αD+L0

解读 🔍:

  • 第一项:模型不够大导致的误差(欠拟合误差
  • 第二项:数据不够多导致的误差(过拟合误差
  • 第三项:数据集的内在噪声(不可约误差

直观理解 🎯:

  • 如果 NN N 很小, NcN \frac{N_c}{N} NNc 很大 → 模型太简单,学不会(欠拟合)
  • 如果 DD D 很小, DcD \frac{D_c}{D} DDc 很大 → 数据太少,死记硬背(过拟合)
  • 要同时增大 NN N 和 DD D,才能让两项都变小

Kaplan 定律参考资料:


3. Chinchilla 缩放定律(2022)🦫 / Chinchilla Scaling Laws

📖 Note: 本章掌握 DeepMind 2022 年提出的计算最优缩放定律 / This chapter masters the compute-optimal scaling laws proposed by DeepMind in 2022.

3.1 核心发现 🔍

Hoffmann 等人(2022)在论文《Training Compute-Optimal Large Language Models》中训练了超过 400 个语言模型(从 7000 万到 160 亿参数),得出了颠覆性的结论 🧠。

Chinchilla 定律的核心 💎:

🎯 对于计算最优训练,模型大小和训练 token 数应该等比例缩放:模型大小每翻一倍,训练 token 数也应翻一倍。

数学表达 📐:
Doptimal≈20×N D_{\text{optimal}} \approx 20 \times N Doptimal≈20×N

其中:📝

  • Doptimal D_{\text{optimal}} Doptimal:最优训练 token 数
  • NN N:模型参数量

这意味着 💡:一个 70 亿参数的模型,应该用约 1400 亿 token 训练( 70B×20=1400B70\text{B} \times 20 = 1400\text{B} 70B×20=1400B)。

3.2 Chinchilla vs Kaplan 对比 ⚔️

特性 Kaplan(2020)🏢 Chinchilla(2022)🧠
模型大小趋势 越大越好 📈 与数据量等比例缩放 ⚖️
数据量建议 相对较少 📉 与模型大小匹配 📊
训练策略 提前停止(Early Stopping)🛑 训练到收敛 ✅
核心发现 幂律关系 📐 20:1 的最优比例 🔢
实验规模 较少模型 400+ 个模型 🔬

关键差异 🔄:

  • Kaplan 认为应该训练超大模型,用较少数据,在收敛前停止
  • Chinchilla 发现之前的模型严重欠训练(Significantly Under-Trained)

3.3 Chinchilla 的实验验证 🧪

DeepMind 团队用实验验证了他们的理论:

Chinchilla 模型 🦫:

  • 参数量:70B(700 亿)
  • 训练数据:1.4T token(1.4 万亿)
  • 计算预算:与 Gopher(280B 参数)相同

性能对比 📊:

模型 参数量 MMLU 准确率
Gopher 280B ~60%
GPT-3 175B ~62%
Chinchilla 70B 67.5%

结论 💎:Chinchilla 用更少的参数 (70B vs 280B),但更多的数据 ,在相同计算预算下大幅超越了所有大模型!

3.4 为什么 Chinchilla 更重要?🎯

对业界的冲击 💥:

  1. GPT-3 欠训练 😱:175B 参数的 GPT-3 应该用更多数据训练
  2. 节省计算成本 💰:Chinchilla 用 1/4 的参数达到更好的效果,推理和微调成本大幅降低
  3. 指导后续模型 🧭:Llama、PaLM 等后续模型都参考了 Chinchilla 的比例

直观类比 🎨:想象你在准备考试

  • Kaplan 策略:买一本超厚的参考书(大模型),但只看前几章(少数据)
  • Chinchilla 策略:买一本适中的书(适中模型),但反复精读每一页(多数据)
  • 结果:Chinchilla 策略考试成绩更好!📚

Chinchilla 定律参考资料:


4. IsoFLOPs 分析方法 🔬 / IsoFLOPs Analysis Method

🔬 Note: 本章理解等计算量下的实验设计 / This chapter understands the experimental design under equal compute.

4.1 什么是 IsoFLOPs?🤔

IsoFLOPs (等计算量)是一种实验设计方法:保持总计算量(FLOPs)不变,改变模型大小和数据量的组合 ⚖️。

计算量公式 📐:
C≈6×N×DC \approx 6 \times N \times D C≈6×N×D

其中:📝

  • CC C:总计算量(FLOPs)
  • NN N:模型参数量
  • DD D:训练 token 数
  • 66 6:每个 token 的近似 FLOPs 系数(前向 + 反向传播)

4.2 IsoFLOPs 实验设计 🧪

核心思路 💡:

给定固定的计算预算 CC C,我们可以选择不同的 (N,D)(N, D) (N,D) 组合:

配置 模型大小 NN N Token 数 DD D 计算量 C=6NDC = 6ND C=6ND
A 10M 100B 6×1096 \times 10^9 6×109
B 100M 10B 6×1096 \times 10^9 6×109
C 1B 1B 6×1096 \times 10^9 6×109
D 10B 100M 6×1096 \times 10^9 6×109

目标 🎯:找到哪个配置的损失最低(Lowest Loss)

4.3 IsoFLOPs Profile 📊

IsoFLOPs Profile 是一张图,显示在固定计算预算下,不同模型大小的损失变化 📈。

典型趋势 🔍:

  • 模型太小 → 欠拟合,损失高
  • 模型太大 → 数据不足,过拟合,损失高
  • 中间某个点 → 计算最优,损失最低 ⭐

IsoFLOPs Profile 图表 👁️:

下图展示了 Chinchilla 论文中的 IsoFLOP 曲线(来源:mbrenndoerfer.com):

图解读 🔍:

这张图是理解 IsoFLOPs 分析的核心可视化工具 💎:

  1. 横轴(X 轴) 📏:模型大小(Model Size),从左到右逐渐增大

    • 左侧:小模型(如 10M、100M 参数)
    • 右侧:大模型(如 10B、100B 参数)
  2. 纵轴(Y 轴) 📊:损失值(Loss),从下到上逐渐增大

    • 下方:低损失(性能好)✅
    • 上方:高损失(性能差)❌
  3. 每条曲线 🌈:代表一个固定的计算预算(Fixed Compute Budget)

    • 例如:最上方的曲线可能是 101810^{18} 1018 FLOPs(计算预算小,损失高)
    • 下方的曲线可能是 101910^{19} 1019、 102010^{20} 1020 FLOPs 等(计算预算大,损失低)
    • 关键规律:计算预算越大,曲线位置越靠下(损失越低)
  4. 曲线的形状 📈:呈 U 型(或山谷型)

    • 左侧上升 ⬆️:模型太小,容量不足,欠拟合(Underfitting)
    • 右侧上升 ⬆️:模型太大,数据不足,过拟合(Overfitting)
    • 底部最低点 ⭐:计算最优配置(Compute-Optimal)
  5. 最优点的移动 🎯:

    • 随着计算预算增加(从上到下的曲线),最优点向右移动
    • 这意味着:预算越大,最优模型越大
    • 但关键是:最优 token 数也在同步增加

直观类比 🎨:想象你在调音响的均衡器

  • 低音太多 → 声音浑浊
  • 高音太多 → 声音刺耳
  • 均衡 → 音质最佳 🎵

IsoFLOPs 分析就是在找这个"均衡点"。

关键洞察 💡:

从图中可以清晰看到:

  • 每条 IsoFLOP 曲线都有明确的最低点(Clear Minimum)
  • 这个最低点对应的就是该计算预算下的最优模型大小
  • 随着预算增加,最优点沿着一条隐藏的最优路径移动
  • 这条路径就是 Chinchilla 发现的 D≈20ND \approx 20N D≈20N 比例线

4.4 为什么用 IsoFLOPs?🎯

优势 💎:

  1. 公平比较 ⚖️:所有配置使用相同计算量,排除计算成本差异
  2. 找到最优 🎯:直接定位给定预算下的最佳配置
  3. 验证理论 🔬:检验 Kaplan 和 Chinchilla 的预测
  4. 指导实践 🧭:为实际训练提供可操作的建议

实际应用 🛠️:

  • 在训练大模型前,先用小规模 IsoFLOPs 实验找到最优比例
  • 避免盲目训练浪费计算资源

IsoFLOPs 参考资料:


5. 作业三任务详解 📝 / Assignment 3 Tasks

📝 Note: 本章拆解 CS336 作业三的三个核心任务 / This chapter breaks down the three core tasks of CS336 Assignment 3.

5.1 任务概览 🎯

CS336 作业三聚焦于缩放定律(Scaling Laws),包含三个主要任务 📋:

  1. 拟合缩放定律 📈:使用提供的 IsoFLOPs 训练数据拟合缩放曲线
  2. 实验收集缩放数据 🔬:在有限的 FLOPs 预算下查询训练 API
  3. 优化计算预算分配 ⚖️:分析如何在给定计算预算下最优地分配模型大小和训练 token 数

5.2 任务一:拟合缩放定律 📈 / Task 1: Fit Scaling Laws

任务目标 🎯:

使用课程提供的 IsoFLOPs 训练数据,拟合出缩放曲线,验证 Kaplan 或 Chinchilla 的幂律关系 🔬。

具体步骤 📝:

  1. 加载数据 📂

    • 读取 IsoFLOPs Profile 数据(通常包含模型大小 NN N、token 数 DD D、损失 LL L)
    • 数据格式可能是 CSV 或 JSON
  2. 定义幂律函数 📐

    使用 Kaplan 的公式:
    L(N)=A×N−α+L0L(N) = A \times N^{-\alpha} + L_0 L(N)=A×N−α+L0

    或者包含数据的完整形式:
    L(N,D)=ANα+BDβ+EL(N, D) = \frac{A}{N^{\alpha}} + \frac{B}{D^{\beta}} + E L(N,D)=NαA+DβB+E

    其中:📝

    • A,BA, B A,B:缩放系数
    • α,β\alpha, \beta α,β:幂律指数
    • EE E:不可约损失(Irreducible Loss)
  3. 曲线拟合 📊

    • 使用 scipy.optimize.curve_fit 进行非线性最小二乘拟合
    • 或者在双对数坐标(Log-Log Plot)上用线性回归
  4. 验证拟合质量

    • 计算 R2R^2 R2 值(决定系数)
    • 可视化拟合曲线与实验数据点的对比

代码示例框架 💻:

python 复制代码
import numpy as np                                              # 导入 NumPy 用于数值计算 🔢
from scipy.optimize import curve_fit                            # 导入曲线拟合工具 📊
import matplotlib.pyplot as plt                                 # 导入绘图模块 📈

"""定义幂律损失函数

参数:
    N: 模型参数量
    A: 缩放系数
    alpha: 幂律指数
    L0: 不可约损失
    
返回:
    预测损失值
"""
def power_law_loss(N, A, alpha, L0):
    return A * (N ** (-alpha)) + L0                             # 返回幂律损失,数据流动:N[数组] → L[数组]

# 加载 IsoFLOPs 数据 📂
# model_sizes = [...]  # 模型大小列表
# losses = [...]       # 对应的损失值列表

# 拟合曲线 📊
# popt, pcov = curve_fit(power_law_loss, model_sizes, losses)

# 可视化 📈
# plt.loglog(model_sizes, losses, 'o', label='Data')
# plt.loglog(model_sizes, power_law_loss(model_sizes, *popt), '-', label='Fit')

关键理解 💡:

  • 双对数坐标 上,幂律表现为直线 📏
  • 斜率 = 幂律指数 −α-\alpha −α
  • 截距 = log⁡(A)\log(A) log(A)

拟合缩放定律参考资料:


5.3 任务二:实验收集缩放数据 🔬 / Task 2: Collect Scaling Data

任务目标 🎯:

有限的 FLOPs 预算下,查询课程提供的训练 API,收集不同配置下的训练数据 🧪。

具体步骤 📝:

  1. 理解 FLOPs 预算 💰

    计算量公式:
    C=6×N×DC = 6 \times N \times D C=6×N×D

    给定总预算 CC C,需要选择多个 (N,D)(N, D) (N,D) 组合。

  2. 设计实验配置 🧭

    例如,给定 C=6×1018C = 6 \times 10^{18} C=6×1018 FLOPs:

    配置 模型大小 NN N Token 数 DD D 验证
    1 10M 100B 6×107×1011=6×10186 \times 10^7 \times 10^{11} = 6 \times 10^{18} 6×107×1011=6×1018 ✅
    2 100M 10B 6×108×1010=6×10186 \times 10^8 \times 10^{10} = 6 \times 10^{18} 6×108×1010=6×1018 ✅
    3 1B 1B 6×109×109=6×10186 \times 10^9 \times 10^9 = 6 \times 10^{18} 6×109×109=6×1018 ✅
  3. 查询训练 API 🔌

    对每个配置,调用 API 获取训练后的损失值:

    python 复制代码
    # 伪代码示例 💻
    for N, D in configurations:                                 # 遍历所有配置组合
        loss = training_api.query(N=N, D=D)                     # 查询训练 API,返回损失值
        results.append({'N': N, 'D': D, 'loss': loss})          # 保存结果到列表
  4. 记录结果 📊

    • 保存每个配置的最终损失
    • 可能还需要记录训练曲线(Loss Curve)

关键挑战 ⚠️:

  • 预算有限 :不能尝试所有配置,需要智能选择有代表性的点
  • API 限制:可能有调用次数限制,需要合理规划
  • 噪声处理:训练结果可能有随机性,需要多次运行取平均

直观类比 🎨:想象你在调咖啡配方

  • 预算 = 你只有 100 元买咖啡豆
  • 配置 = 不同深浅烘焙(模型大小)和研磨粗细(数据量)的组合
  • 目标 = 找到最好喝的配置(最低损失)

实验收集数据参考资料:


5.4 任务三:优化计算预算分配 ⚖️ / Task 3: Optimize Compute Budget

任务目标 🎯:

分析如何在给定计算预算下最优地分配 模型大小和训练 token 数,找到最佳的训练配置 🏆。

具体步骤 📝:

  1. 理解计算最优(Compute-Optimal) 💎

    根据 Chinchilla 定律:
    Doptimal≈20×N D_{\text{optimal}} \approx 20 \times N Doptimal≈20×N

    代入计算量公式:
    C=6×N×(20N)=120N2C = 6 \times N \times (20N) = 120 N^2 C=6×N×(20N)=120N2

    解得最优模型大小:
    Noptimal= C120 N_{\text{optimal}} = \sqrt{\frac{C}{120}} Noptimal=120C

    最优 token 数:
    Doptimal=20× C120 D_{\text{optimal}} = 20 \times \sqrt{\frac{C}{120}} Doptimal=20×120C

  2. 使用拟合的缩放定律预测 📈

    从任务一得到了缩放曲线后,可以预测任意配置的损失:

    python 复制代码
    # 预测不同配置的损失 💻
    def predict_loss(N, D, params):
        A, alpha, beta, E = params                            # 解包拟合参数
        return A / (N ** alpha) + B / (D ** beta) + E         # 返回预测损失
    
    # 在预算约束下搜索最优配置 🔍
    best_config = None
    best_loss = float('inf')
    
    for N in model_size_range:                                # 遍历可能的模型大小
        D = C / (6 * N)                                       # 根据预算计算对应的 token 数
        loss = predict_loss(N, D, fitted_params)              # 预测该配置的损失
        
        if loss < best_loss:                                  # 如果找到更低的损失
            best_loss = loss                                  # 更新最优损失
            best_config = {'N': N, 'D': D}                    # 更新最优配置
  3. 验证 Chinchilla 比例

    检查找到的最优配置是否接近 D=20ND = 20N D=20N 的比例。

  4. 给出建议 💡

    基于分析结果,给出实际训练的建议:

    • 推荐模型大小
    • 推荐训练 token 数
    • 预期达到的损失值

关键理解 💡:

  • Kaplan 策略:偏向更大的模型,更少的数据
  • Chinchilla 策略:模型和数据等比例缩放(20:1)
  • 实际选择:取决于具体任务和数据集特性

直观类比 🎨:想象你在投资组合中分配资金

  • 股票(模型大小)= 高风险高回报
  • 债券(数据量)= 低风险稳定收益
  • 最优配置 = 找到风险和收益的最佳平衡点 ⚖️

优化预算分配参考资料:


6. 拟合缩放曲线 📈 / Fitting Scaling Curves

📈 Note: 本章详细学习如何使用幂律函数拟合实验数据 / This chapter details how to fit experimental data using power-law functions.

6.1 幂律函数的数学形式 📐

基础幂律 🔢:
L(N)=A×N−α+L0L(N) = A \times N^{-\alpha} + L_0 L(N)=A×N−α+L0

完整形式(包含模型大小和数据量) 📊:
L(N,D)=ANα+BDβ+EL(N, D) = \frac{A}{N^{\alpha}} + \frac{B}{D^{\beta}} + E L(N,D)=NαA+DβB+E

参数解释 📝:

  • A,BA, B A,B:缩放系数(Scaling Coefficients),反映模型和数据的重要性
  • α,β\alpha, \beta α,β:幂律指数(Power-Law Exponents),通常在 0.05 到 0.1 之间
  • EE E:不可约损失(Irreducible Loss),数据集的内在噪声下限

6.2 拟合方法 🔧

方法一:非线性最小二乘拟合(Nonlinear Least Squares)

使用 scipy.optimize.curve_fit

python 复制代码
from scipy.optimize import curve_fit                            # 导入曲线拟合工具 📊

"""完整幂律损失函数

参数:
    ND: 拼接的 (N, D) 数组 [N1, N2, ..., D1, D2, ...]
    A: 模型缩放系数
    alpha: 模型幂律指数
    B: 数据缩放系数
    beta: 数据幂律指数
    E: 不可约损失
    
返回:
    预测损失数组
"""
def full_power_law(ND, A, alpha, B, beta, E):
    N = ND[:len(ND)//2]                                         # 提取前半部分为模型大小
    D = ND[len(ND)//2:]                                         # 提取后半部分为 token 数
    return A / (N ** alpha) + B / (D ** beta) + E               # 返回完整幂律损失

# 准备数据 📂
# ND_combined = np.concatenate([model_sizes, token_counts])
# losses = np.array([...])

# 执行拟合 📊
# popt, pcov = curve_fit(full_power_law, ND_combined, losses, p0=[1.0, 0.1, 1.0, 0.1, 1.0])

# 提取参数 📝
# A, alpha, B, beta, E = popt
方法二:对数线性回归(Log-Log Linear Regression)

在双对数坐标上,幂律变成线性关系:
log⁡(L−L0)=log⁡(A)−α×log⁡(N)\log(L - L_0) = \log(A) - \alpha \times \log(N) log(L−L0)=log(A)−α×log(N)

python 复制代码
import numpy as np                                              # 导入 NumPy 🔢

# 对数据取对数 📊
# log_N = np.log(model_sizes)
# log_loss = np.log(losses - L0)

# 线性回归 📈
# alpha, log_A = np.polyfit(log_N, log_loss, 1)
# A = np.exp(log_A)

6.3 评估拟合质量 ✅

决定系数 R2R^2 R2 📊:
R2=1− ∑(yi− y^i )2 ∑(yi−yˉ)2 R^2 = 1 - \frac{\sum (y_i - \hat{y}_i)^2}{\sum (y_i - \bar{y})^2} R2=1−∑(yi−yˉ)2∑(yi−y^i)2

其中:📝

  • yi y_i yi:实际损失值
  • y^i \hat{y}_i y^i:预测损失值
  • yˉ \bar{y} yˉ:平均损失值

解读 💡:

  • R2=1R^2 = 1 R2=1:完美拟合
  • R2>0.95R^2 > 0.95 R2>0.95:非常好的拟合
  • R2>0.9R^2 > 0.9 R2>0.9:良好的拟合

可视化检查 👁️:

python 复制代码
import matplotlib.pyplot as plt                                 # 导入绘图模块 📈

# 绘制实验数据 📊
plt.loglog(model_sizes, losses, 'o', label='Experimental Data')

# 绘制拟合曲线 📈
# N_fit = np.linspace(min(N), max(N), 100)
# L_fit = power_law_loss(N_fit, A, alpha, L0)
# plt.loglog(N_fit, L_fit, '-', label=f'Fit: $R^2={r2:.3f}$')

plt.xlabel('Model Size (Parameters)')                           # 设置 x 轴标签
plt.ylabel('Cross-Entropy Loss')                                # 设置 y 轴标签
plt.title('Scaling Law Fit')                                    # 设置标题
plt.legend()                                                    # 显示图例
plt.grid(True, which='both', ls='--')                           # 显示网格
plt.show()                                                      # 显示图表

拟合方法参考资料:


7. 优化计算预算分配 ⚖️ / Optimizing Compute Budget

⚖️ Note: 本章学习如何在给定计算预算下找到最佳配置 / This chapter learns how to find the optimal configuration under a given compute budget.

7.1 计算预算约束 📊

计算量公式 📐:
C=6×N×DC = 6 \times N \times D C=6×N×D

约束优化问题 🎯:
最小化: L(N,D)=ANα+BDβ+E 约束: 6ND=Cbudget \begin{aligned} \text{最小化:} & \quad L(N, D) = \frac{A}{N^{\alpha}} + \frac{B}{D^{\beta}} + E \\ \text{约束:} & \quad 6ND = C_{\text{budget}} \end{aligned} 最小化:约束:L(N,D)=NαA+DβB+E6ND=Cbudget

7.2 拉格朗日乘数法求解 🔧

使用拉格朗日乘数法(Lagrange Multipliers):
L(N,D,λ)=ANα+BDβ+E+λ(6ND−C)\mathcal{L}(N, D, \lambda) = \frac{A}{N^{\alpha}} + \frac{B}{D^{\beta}} + E + \lambda(6ND - C) L(N,D,λ)=NαA+DβB+E+λ(6ND−C)

NN N、 DD D、 λ\lambda λ 求偏导并令其为 0:
∂L∂N =−αANα+1+6λD=0 \frac{\partial \mathcal{L}}{\partial N} = -\alpha \frac{A}{N^{\alpha+1}} + 6\lambda D = 0 ∂N∂L=−αNα+1A+6λD=0
∂L∂D =−βBDβ+1+6λN=0 \frac{\partial \mathcal{L}}{\partial D} = -\beta \frac{B}{D^{\beta+1}} + 6\lambda N = 0 ∂D∂L=−βDβ+1B+6λN=0
∂L∂λ =6ND−C=0 \frac{\partial \mathcal{L}}{\partial \lambda} = 6ND - C = 0 ∂λ∂L=6ND−C=0

解得最优比例 💎:
DN=βα \frac{D}{N} = \frac{\beta}{\alpha} ND=αβ

Chinchilla 的发现 🦫:

实验测得 α≈β\alpha \approx \beta α≈β,因此:
D≈20×ND \approx 20 \times N D≈20×N

7.3 实际求解步骤 📝

步骤 1:确定计算预算 💰

python 复制代码
C_budget = 1e18  # 1e18 FLOPs 💰

步骤 2:使用 Chinchilla 比例 🦫

python 复制代码
# 根据 D = 20N 和 C = 6ND 求解 📐
# C = 6 × N × 20N = 120N²
N_optimal = np.sqrt(C_budget / 120)                             # 计算最优模型大小
D_optimal = 20 * N_optimal                                      # 计算最优 token 数

步骤 3:验证结果

python 复制代码
# 验证计算量 📊
C_actual = 6 * N_optimal * D_optimal                            # 计算实际使用的 FLOPs
print(f"预算:{C_budget:.2e} FLOPs")
print(f"实际:{C_actual:.2e} FLOPs")
print(f"最优模型大小:{N_optimal:.2e} 参数")
print(f"最优 token 数:{D_optimal:.2e}")
print(f"比例 D/N = {D_optimal/N_optimal:.1f}")

步骤 4:预测损失 📈

python 复制代码
# 使用拟合的缩放定律预测损失 🔮
L_optimal = A / (N_optimal ** alpha) + B / (D_optimal ** beta) + E
print(f"预期损失:{L_optimal:.4f}")

7.4 数值搜索方法 🔍

如果缩放定律形式复杂,无法解析求解,可以用数值搜索

python 复制代码
"""在预算约束下搜索最优配置

参数:
    C_budget: 计算预算(FLOPs)
    params: 拟合的缩放定律参数 (A, alpha, B, beta, E)
    
返回:
    最优配置字典 {'N': 模型大小, 'D': token数, 'loss': 损失}
"""
def search_optimal_config(C_budget, params):
    A, alpha, B, beta, E = params                               # 解包参数
    
    best_config = None                                          # 初始化最优配置
    best_loss = float('inf')                                    # 初始化最优损失为正无穷
    
    # 遍历可能的模型大小 🔍
    N_range = np.logspace(7, 11, 100)                           # 从 10M 到 100B,取 100 个点
    
    for N in N_range:                                           # 遍历每个模型大小
        D = C_budget / (6 * N)                                  # 根据预算计算 token 数
        
        # 预测损失 📊
        loss = A / (N ** alpha) + B / (D ** beta) + E
        
        # 更新最优配置 ✅
        if loss < best_loss:                                    # 如果找到更低的损失
            best_loss = loss                                    # 更新最优损失
            best_config = {'N': N, 'D': D, 'loss': loss}        # 更新最优配置
    
    return best_config                                          # 返回最优配置

# 使用示例 💻
# params = (A, alpha, B, beta, E)
# optimal = search_optimal_config(1e18, params)

7.5 实际应用建议 💡

对于不同预算的配置建议 📋:

计算预算 推荐模型大小 推荐 Token 数 适用场景
101810^{18} 1018 FLOPs ~100M ~2B 学术研究、原型验证
101910^{19} 1019 FLOPs ~300M ~6B 中型项目
102010^{20} 1020 FLOPs ~1B ~20B 工业级应用
102110^{21} 1021 FLOPs ~3B ~60B 大规模商用

关键原则 🎯:

  1. 遵循 Chinchilla 比例 ⚖️: D≈20ND \approx 20N D≈20N
  2. 不要过早停止训练 🛑:训练到损失收敛
  3. 验证实验 🧪:在大规模训练前,先用小规模 IsoFLOPs 实验验证
  4. 考虑实际约束 🛠️:显存限制、训练时间、数据获取成本

优化预算参考资料:


8. 总结 🎯 / Summary

8.1 核心要点回顾 📝

概念 关键内容 公式/比例
缩放定律 性能与规模呈幂律关系 📈 L(N)=A×N−α+L0L(N) = A \times N^{-\alpha} + L_0 L(N)=A×N−α+L0
Kaplan 定律 大模型 + 少数据 + 提前停止 🏢 偏向增大模型
Chinchilla 定律 模型与数据等比例缩放 🦫 D≈20ND \approx 20N D≈20N
IsoFLOPs 固定计算量下找最优配置 🔬 C=6NDC = 6ND C=6ND
计算最优 在预算下最小化损失 ⚖️ Noptimal= C/120 N_{\text{optimal}} = \sqrt{C/120} Noptimal=C/120

8.2 作业三的核心价值 💎

  1. 理论联系实际 🌉

    • 从论文中的缩放定律 → 实际拟合实验数据
    • 理解抽象的幂律关系如何指导工程实践
  2. 培养直觉 💡

    • 通过 IsoFLOPs 实验,建立对"多大模型配多少数据"的直觉
    • 理解为什么 Chinchilla 的比例更优
  3. 工程能力 🛠️

    • 学习曲线拟合技术
    • 掌握在约束条件下优化配置的方法
    • 为未来训练大模型打下基础

8.3 实际应用意义 🌍

对业界的指导价值 💼:

  • GPT-4、Llama、PaLM 等大模型都参考了缩放定律来设计配置
  • 节省计算成本:避免在次优配置上浪费数百万美元的 GPU 费用
  • 预测性能:在训练前就能预估模型的最终表现

对研究者的启示 🔬:

  • 缩放定律可能不是永恒的,在更大规模下可能出现相变(Phase Transition)
  • 需要持续验证和更新缩放定律
  • 理解缩放定律的理论机制(为什么是幂律?)仍是开放问题

8.4 下一步学习方向 🧭

虽然本文档聚焦于作业三的内容,但缩放定律领域还有很多值得探索的方向:

  • 稀疏模型的缩放定律 🕸️:MoE(Mixture of Experts)架构的缩放规律
  • 多模态缩放定律 🖼️:文本、图像、音频联合训练的缩放规律
  • 推理期缩放定律 🔍:测试时计算(Test-Time Compute)的缩放规律
  • 理论解释 📐:为什么神经网络遵循幂律?与统计物理的联系

总结参考资料:


最后更新时间:2026-06-23

相关推荐
JieE2121 小时前
从"无状态"到"懂你":深入理解 LLM 对话的本质,以及 Prompt/Context/Loop 三层工程进化之路
人工智能·llm·ai编程
稚雪九月1 小时前
永久记忆,丰富情感,Atrium AI框架:给AI一颗真正的心
人工智能
小鼻子的猫1 小时前
万字长文讲透 AI Agent 架构设计:从 ReAct 到多 Agent 协作,附完整 Python 代码
人工智能
Hector_zh1 小时前
实战·第八篇:当模型陷入死循环——FACA破解JSON生成的架构陷阱
人工智能·agent·vibecoding
魏祖潇2 小时前
AI 能记住了,但能自己干活吗?——看懂执行系统,你就知道它怎么完成复杂任务
人工智能·ai编程
Lkstar2 小时前
Function Calling 原理深度拆解:让 LLM 调用外部工具的机制与工具设计原则
人工智能·llm
IT_陈寒2 小时前
Vue的响应式真把我坑惨了,原来问题出在这
前端·人工智能·后端
武子康2 小时前
调查研究-190 Continue.dev 被 Cursor 收购:AI 编程工具正从“插件竞争“迈入“平台整合“阶段
人工智能·ai编程·cursor
武子康3 小时前
调查研究-189 Kronos 调研:金融 K 线基础模型,是真突破,还是量化圈的新玩具?
人工智能·深度学习·openai