差异化学习率恢复训练 | AI生成和翻译

Home 2026.06

问题: 解释 nanochat 训练命令 — 架构、超参数和训练策略。

答案:

你正在 RTX 4070 上从第 200k 步恢复训练一个 12 层 transformer,目标达到第 300k 步。以下是具体情况:

架构

depth=12              # 12 层 transformer
aspect-ratio=64       # d_model = 64 * head_dim = 64 * 128 = 8192 隐藏维度
head-dim=128          # 每个注意力头 128 维 → 约 64 个注意力头
max-seq-len=2048      # 2K 上下文窗口
window-pattern=L      # 局部/因果注意力(非全局)

aspect-ratio 是一个宽度乘数。使用 128 维注意力头,64 个头得到 8,192 维隐藏维度 — 一个中等规模模型(参数量约 60-100M,取决于词表大小)。

批次动态

device-batch-size=8        # RTX 4070 上 8 个样本
total-batch-size=65536     # 梯度累积:65536/8 = 8,192 个微批次
                           # (或使用多机,但此处为单 GPU)

在单次权重更新之前,你在 8,192 次前向传播上累积梯度。在 RTX 4070(12GB)上,批次大小 8 可以轻松容纳;梯度累积达到了 65K 目标而不会显存溢出。

不寻常的部分:差异化学习率

embedding-lr=0.018      # 词嵌入
unembedding-lr=0.00048  # 输出投影(嵌入 → logits)
matrix-lr=0.0012        # Transformer 权重(Q/K/V, FF)
scalar-lr=0.03          # 层归一化、偏置

并非标准做法。你对不同参数类型区别对待:

这是一个恢复训练策略 — 你不是从头开始训练,因此有选择性地调整不同参数。标量可以快速变化;核心权重则应该几乎保持不变。

调度(平缓,无预热)

warmup-steps=0           # 跳过预热(已在 0→200k 阶段收敛)
warmdown-ratio=0.0       # 无衰减 — 在 200k→300k 阶段保持学习率恒定
final-lr-frac=0.05       # 忽略(无衰减调度)

你在第 200k–300k 步使用恒定学习率进行训练。没有学习率调度。这意味着:

正则化

weight-decay=0.28       # 28% 权重衰减 — **非常高**

这相当激进。权重衰减会惩罚大权重:

损失 = 模型损失 + 0.28 * 权重平方和

迫使模型朝向稀疏、可解释的权重发展。有利于防止在小数据集上过拟合,或避免恢复训练时特征漂移。

采用此策略的原因

  1. 从 200k 步恢复训练:已经达到一个稳定点,不需要预热。
  2. 平缓调度:不是在收敛,而是持续改进。衰减会不必要地拖慢进度。
  3. 差异化学习率:经过 200k 步后,嵌入层/输出层噪声较大;核心权重已经调整到位。这样可以有针对性地进行优化。
  4. 高权重衰减:可能有助于防止恢复训练时出现灾难性遗忘或权重失控增长。

计算量

总迭代次数:再增加 100k 步(200k → 300k)
设备批次大小:8
有效批次大小:65,536
RTX 4070 上约 33 小时

这大约是每秒 3 次迭代 — 对于单个 4070 上使用 2K 上下文的 8K 隐藏维度模型来说,速度是合理的。


一个问题window-pattern=L 具体是做什么的?如果是局部注意力(例如滑动窗口),那么相比全局注意力会有巨大的加速。如果是其他东西(学习到的模式?),请告诉我 — nanochat 代码库中这个细节并非公开可见。


Back Donate