语言模型预测什么
概率续写引擎
语言模型接收一个 token 序列,并为下一个 token 分配一个概率分布。输入 the cat sat on the,它会输出整个词汇表的概率:mat、floor、couch 的概率很高;xylophone、Tuesday 的概率很低。
对该分布进行采样,追加一个 token,并反馈:这个循环逐个 token 生成文本。自回归生成,之所以这样命名是因为每一步都回归于其自身先前的输出。
三个数字定义了一个语言模型
词汇表大小 (V)。 模型能产生的不同令牌数量。ANDREA-12M 使用了 4,353 个令牌;ANDREA-120M 使用 8,449 个。
上下文窗口 (T)。 一次前向传播能容纳多少令牌。ANDREA 模型使用 T = 1,024。
参数数量 (P)。 内部有多少可学习权重。12M、120M 和 480M 以 P 命名一个模型家族。
一个三口之家
| 变体 | d_model | 头数 | 层数 | 上下文 | 参数 |
|---|---|---|---|---|---|
| ANDREA-12M | 384 | 12 | 6 | 1024 | 12.8M |
| ANDREA-120M | 768 | 12 | 12 | 1024 | ~120M |
| ANDREA-480M | 1536 | 24 | 16 | 1024 | ~480M |
三个可扩展的旋钮:d_model(每个内部向量的宽度)、n_layer(堆叠的 Transformer 块的深度)、n_head(并行注意力投影)。在整个系列中,词汇表和上下文保持固定。
阅读系列表格
为什么小模型重要
约束即解放
拥有数千亿参数的大型语言模型需要数千个 GPU、专有数据集和企业预算。很少有人能训练一个。很少有人能修复一个。
一台 GPU 上的小型语言模型颠覆了这一切。任何拥有 4090(或 3060)的人都能从开源数据重现 ANDREA。训练配方同时就是模型卡。开源代码、开源权重、开源数据;72 小时计算即可获得完整出处。
容量 vs 质量
较小的模型无法记忆其训练语料库。ANDREA-12M 拥有 1280 万参数,缺乏存储事实内容的容量;它学习对话结构、词汇分布和响应形状。ANDREA-120M 容量为 10 倍,学习事实回忆、多段落连贯性和领域广度(通过外部评分在生物学和信号处理样本上达到 9.5/10 验证)。
要点: 容量设定了一个上限。课程决定是否能达到这个上限。活动 14-23 涵盖课程。 [TITLE decoder_only/]
三种 Transformer 变体
编码器、解码器、两者皆有
原始 Transformer(Vaswani et al., 2017)配备了一个编码器和一个解码器,用于翻译而将它们粘合在一起。从该论文衍生出三种架构谱系:
仅编码器(BERT 谱系)。双向注意力,无因果掩码。针对分类优化,而非生成。在训练期间,一个标记可以看到其过去和未来。
编码器-解码器 (T5, BART)。编码器读取输入;解码器生成输出,通过交叉注意力关注编码器。用于翻译、摘要。
仅解码器 (GPT, ANDREA)。因果掩码:每个标记仅看到其过去。训练以预测下一个标记。生成免费;训练与推理共享相同的正向传播。
为什么仅解码器在一张 GPU 上获胜
三个原因:
1. 单一目标。 下一个标记预测适用于任何文本。不需要配对的源/目标。
2. 训练与推理对称性。 相同的正向传播,无需特殊的生成逻辑。
3. 内存简单性。 无跨注意力;一层堆栈;单一激活流。
ANDREA 继承了 microGPT 的仅解码器选择,microGPT 继承自 nanoGPT,nanoGPT 继承自 GPT-2。该血统保持标准;变化发生在分词、训练基础设施和课程上。
为什么 ANDREA 使用仅解码器
24 GB 内能放什么
每个参数的字节数
RTX 4090 配备 24 GB VRAM。ANDREA-12M 训练使用了 1.4 GB。ANDREA-120M 使用了大幅更多。差距源于一个简单的计算练习:训练期间,每个参数在内存中出现多次。
对于每个参数,训练会保留:
- 权重本身 (1× 权重)
- Adam 一阶矩 (m):与权重相同形状 (1× 权重)
- Adam 二阶矩 (v):与权重相同形状 (1× 权重)
- 梯度:与权重相同形状 (1× 权重)
- 激活值 & 临时变量:~2-4× 权重 (随批次 & 上下文变化)
总计:~6-8× 权重数量,以精度决定的字节数。
精度会放大一切
| 精度 | 字节/参数 | 120M 参数总量 | 备注 |
|---|---|---|---|
| FP32 | 4 | 480 MB | 基准;最安全、最慢 |
| FP16 | 2 | 240 MB | cuBLAS,内存减半 |
| FP8 E4M3 | 1 | 120 MB | 张量核心,NaN 风险 |
训练时完整占用量需乘以 6-8 倍。ANDREA-120M 在 FP16 下轻松训练(权重 + 优化器 + 梯度约 2 GB);FP8 E4M3 在 RTX 4090 张量核心上将训练时间减半。
活动 13 (grow_a_language_model_precision) 详细讲解了 FP 精度权衡取舍。
为 ANDREA-120M 的优化器状态计算大小
二十五个活动
两部分
本课程清晰地分为两部分。第一部分涵盖 microGPT 教给该领域的知识:一个运行在单个 GPU 上的 transformer。第二部分涵盖 ANDREA 的实际贡献:一个能够学习的课程。
第一部分:单个 GPU 上的 Transformer(活动 2-13)
| # | 活动 | 节奏 |
|---|---|---|
| 2 | Harris 形态素分词器 | 分布分割,256+N+1 词汇表 |
| 3 | 分词器-饮食对齐 | 饱和点,为什么 12M 浪费了 63.6% |
| 4 | 嵌入 & 位置 | 学习令牌 + 位置查找 |
| 5 | 缩放点积注意力 | Q·Kᵀ/√d,因果掩码,softmax |
| 6 | 多头注意力 | 头分割,并行投影 |
| 7 | Transformer 块 | MLP,残差,层归一化 |
| 8 | 交叉熵 & 困惑度 | 对数似然,SMMA 损失 |
| 9 | 自定义 CUDA 中的反向传播 | 链式法则跨 microgpt_cuda.cu |
| 10 | AdamW | 解耦权重衰减;为什么原版 Adam 失效了 |
| 11 | LR 预热 + 余弦衰减 | 2000 步渐变;为什么瞬间峰值毁掉 120M |
| 12 | 梯度裁剪 | 全局 L2 范数;3 个 CUDA 内核 |
| 13 | FP32 / FP16 / FP8 E4M3 | 精度权衡;张量核心 |
下半部分:一个会学习的课程(活动 14-24)
| # | 活动 | 亮点 |
|---|---|---|
| 14 | 多臂赌博机 | UCB1,探索 vs 利用 |
| 15 | 阶段式骰子控制 | 7/14/21/28/42 阶段,1d3/1d4 骰子 |
| 16 | 奖励归因 & EMA | 按来源损失 EMA,1000× 缩放 |
| 17 | 来源底线 & 周期惩罚 | 1/(1+epochs) 防止记忆化 |
| 18 | 覆盖奖励 | 文档级跟踪,1.3× 新鲜度 |
| 19 | 课程预热 | 前 20K 步使用 7 个聊天/散文来源 |
| 20 | 按形状过滤,而非字符 | has_system_prompt_shape() |
| 21 | 相干门控早停 | bigram/trigram/word/char auto-halt |
| 22 | 检查点、恢复、信号 | format, SIGTERM/SIGUSR1, loss.json continuity |
| 23 | 样本审计 & 外部评分 | reading a run, 9.5/10 territory |
| 24 | 从 microGPT 到 ANDREA-120M | v1 collapse, v2 fixes, v2.5 patch, v3 polish |
另外还有一个配套项目:geometry_of_andrea 将每一层视为几何(嵌入空间、注意力作为投影、损失表面、bandit 作为离散单纯形上的行走)。
建议顺序
活动 2-13 将构建一个可工作的 transformer。如果您之前训练过 transformer,可以跳到下半部分;好奇心来临时再回来。
每个活动尽可能独立。数学参考会通过名称引用较早的活动(参见活动 5:缩放点积注意力)。代码引用指向 ~/git/uncloseai-cli/ 中的 microgpt/microgpt_cuda.cu 和 microgpt/training_proxy.py。