十六天的 region region region
结束的运行
ANDREA-120M v1 于 2026-03-22 启动,并于 2026-04-15 在计划的 200,000 步中的第 165,000 步终止。EMA 损失最小值:3.23(在第 110K 步,随机几率:ln(8449) = 9.04,因此损失看起来还算体面)。样本则不然。
步骤 80K:区域 区域 区域 区域 区域 区域 区域
步骤 110K:''''' ''''' '' ''' '' ''' '''?' ''' ' '' '' '
步骤 140K:游戏,游戏,游戏,游戏,游戏,游戏
步骤 165K:Budy Budy Budy Budy Budy Budy Budy Budy Budy
RTX 4090 计算的十六天。130W 连续。80K 步骤之后的垃圾。
为什么 microGPT 成功而 120M 失败
ANDREA-12M 使用了相同的训练代理并通过了测试。更小的权重矩阵对梯度冲击更具鲁棒性。扩展到 120M 参数放大了每一种脆弱性。五种失败相互叠加。
五种相互叠加的失败
失败 1:没有梯度裁剪。 来源每 7-42 步转换一次,产生无界的梯度峰值。在 120M 模型中,一个坏批次就能将模型推入优化器无法逃脱的退化吸引子。12M 模型幸存下来是因为更小的权重能容忍这些冲击。
失败 2:无 LR 预热。 学习率从 0 立即跳到峰值,直接在新鲜初始化的权重上。模型在任何表征形成之前就陷入了坏的盆地。
失败 3:无权重衰减。 纯 Adam 允许任意大的权重,在 120M 容量下放大了重复模式。
失败 4:无样本质量监控。 eval_chat_quality() 仅连接到遗留的多阶段运行器;火hose 课程从未调用它。模型从第 80K 步开始产生垃圾,持续 10+ 天未被检测到。
失败 5:Bandit 奖励重复来源。 repo-docs、repo-docstrings 和 unfirehose-chat 得分最高(平均奖励 340-453),因为列表结构的内容 trivial 地降低了交叉熵。Bandit 向模型喂食了更多导致其退化的内容。
复合效应
没有单一失败会单独导致 v1 崩溃。每一个失败都放大了其他失败。没有预热(2)的梯度冲击(1)击中了刚刚初始化的模型,模型具有任意大的权重(3),产生了重复,该重复被 bandit 奖励(5),同时没有人监视输出(4)。五个相互交织的原因,一个崩溃。
为什么是五个失败,而不是一个
每个失败一个修复
v2 配置 (2026-04-15)
| 修复 | 针对失败 | 实现 |
|---|---|---|
| 梯度裁剪 | F1 (无裁剪) | 全局 L2 范数, max_norm=1.0; 三个 CUDA 内核 (k_grad_norm_partial, k_grad_norm_final, k_grad_scale) 计算并应用 pre-Adam |
| LR 预热 | F2 (无预热) | 线性斜坡从 0 到峰值,跨越 2000 步。lr(t) = lr_scheduled(t) * min(1, (t+1)/warmup_steps) |
| AdamW | F3(无权重衰减) | 解耦权重衰减(Loshchilov & Hutter 2019),weight_decay=0.01。p -= lr (m_hat/(sqrt(v_hat)+eps) + weight_decayp) |
| 连贯性门控早停 | F4(无监控) | 每个样本评分(二元/三元/词/字符多样性)。5个连续样本评分低于30后自动停止 |
| 课程预热 | F5(bandit 消耗重复) | 前20K步限制为7个聊天/散文来源;之后激活火hose;repo-docstrings 完全排除 |
此外,sample_every 从200步降至100步(审计频率加倍),& repo-docs 上限从0.5降至0.3。
回测
连贯性门控在v1上回测:将在第132K步触发,节省3.8天的计算。仅此门控即可将v1的浪费计算减少约30%;其他四个修复防止v1达到该门控触发。
v2 没有修复的内容
数据污染。v2 信任 hermes3-* 来源作为“预清洗”,因为它们来自 LLM 教师。Makefile 中的 DEEP_CLEAN_SKIP 排除了 hermes3-general、hermes3-creative 和 hermes3-roleplay 不参与 make deep-clean。unfirehose-chat 将代理系统提示捕获为用户回合。这两个缺陷潜伏在数据层,随时准备浮出水面。
将修复映射到失败
步骤 15K:两个数据缺陷浮出水面
v2 看到了什么
v2 于 2026-04-15 启动。到 200K 步骤中的 ~15K 步(完成 7.5%)时,生成的样本产生了代理测试框架装饰物 (○ ●) 和文章主导的回退 (a = 步骤 14,966 时占单词的 26%;the = 步骤 14,798 时占 21%)。v2 的五个稳定性修复正常工作。故障已从架构转移到数据。
两个独立的管道缺陷
缺陷 A:unfirehose-chat 将代理系统提示捕获为用户回合。 unfirehose-chat 从 ~/.claude/、~/.fetch/、~/.uncloseai/ 中的测试框架会话 JSONL 文件构建。摄取管道将多节代理系统提示 (# Agent X、## Identity、## Rules 等) 转换为 > user / < assistant 对的用户回合槽。模型学会了“用户”使用多节 Markdown 说话,并在自己的输出中重现了那些装饰物。
缺陷 B:hermes3-* 绕过了所有过滤器。 Makefile 中的 DEEP_CLEAN_SKIP 将 hermes3-general、hermes3-creative 和 hermes3-roleplay 排除在 make deep-clean 之外,这是基于 LLM 蒸馏数据已预清洗的错误假设。全面扫描显示,现有的过滤器在应用时会拒绝 87-93% 的 hermes3 行(超大段落 >2000 字符溢出 block_size=1024;CJK/西里尔/阿拉伯语的翻译响应;低二元组多样性运行)。
v2.5 补丁 (commit de24332, 2026-04-18)
两个结构变更。
变更 1:filter-dataset.c 中的 has_system_prompt_shape()。 通过 SHAPE 检测泄露的系统提示,而不是通过字符匹配。三种信号结合:
1. 一轮中 3+ 个 markdown 标题 = 丢弃。
2. 2+ 个标题且轮次长度 >=500 字符 = 丢弃。
3. 代理分片指纹短语 (# Agent , Shadow Clone, Your shard, Read it. Become it, This file defines) 结合任何标题或长度 >=400 = 丢弃。
隔离规则:在 / 分隔符(带空格,不是裸 /,后者会碎片化 URL 路径)处检查第一个用户轮次,以避免助手响应中合法 markdown 的假阳性。
变更 2:hermes3-* 从 DEEP_CLEAN_SKIP 中移出。 不信任任何未过滤的内容。
补丁后的丢弃率
| 来源 | 行内 | 行外 | 丢弃率 |
|---|---|---|---|
| hermes3-general | 536,858 | 67,395 | 87.7% |
| hermes3-roleplay | 35,191 | 2,481 | 93.0% |
| hermes3-creative | 14,258 | 1,373 | 90.4% |
| unfirehose-chat | 3,816 | 2,653 | 30.5% |
| chat | 45,257 | 44,538 | 1.6% (噪声) |
| smoltalk | 11,812 | 11,812 | 0.0% |
基线过滤器已经捕获了87-93%的hermes3污染;DEEP_CLEAN_SKIP是关键缺陷。新形状检测器整体额外拒绝约0.1%,集中在unfirehose-chat中,它移除了现有过滤器遗漏的特定代理碎片泄漏。
为什么形状优于字符
装饰会演变。基于字符匹配的过滤器丢弃○后,下周对◇就无能为力。基于形状的过滤器(统计标题、统计字符、识别指纹短语)可以泛化到各种装饰变体。模式:污染检测必须使用结构启发式方法。
为什么按形状过滤
无数据的 Bandit Arm
v3 于 2026-04-18 发布
与 v2 相同的架构和超参数;v2.5 补丁后的清洁数据。样本审计中零装饰符泄漏。v3 干净运行至第 112K 步。
步骤 112,619:样本审计捕捉到模式
样本审计揭示了连贯的对话轮次(俳句、问答、对话),但周期性阶段专注于知识臂(gutenberg、repo-docstrings、repo-docs),泄露了代码状片段和仓库标记化噪声。第 112,080 步的一个样本达到了损失 0.13:异常低,表明记忆了 repo-docs 子串,而不是学习了聊天分布。
僵尸臂
诊断:exclude_sources 在训练开始时正确移除了 repo-docstrings,但持久化的 bandit 状态携带了来自先前运行的残余 repo-docstrings 臂,权重为 1.546。状态重载将其重新纳入 UCB 池,尽管没有 .btok 文件可供采样,从而产生了扭曲探索记账的僵尸拉取。
教训:bandit 状态文件(.state.json)在重启之间以令人惊讶的方式漂移。配置排除不会抹除残余臂记忆。需要双重保障:cap = 0.0 配合 exclude。
波兰语配置
仅课程扰动。架构、优化器状态、学习率调度和损失历史均从 step_112600.bin 保留。
| 来源 | v3 基础 | v3 波兰语 |
|---|---|---|
| repo-docs | 上限 0.3 | 排除(上限 0.0) |
| repo-docstrings | 排除 | 排除 + 上限 0.0 |
| repo-commits | cap 0.4 | cap 0.2 |
| dictionary | cap 0.5 | cap 0.25 |
| gutenberg | cap 0.8 / floor 0.3 | cap 0.7 / floor 0.4 |
| irc-qa-strict | -- | cap 0.3 |
| unweapon | -- | cap 0.3 |
| synthetic-chat | -- | cap 0.4 |
| hermes3-general | floor 0.5 | floor 0.7 |
| hermes3-creative | floor 0.4 | floor 0.55 |
| hermes3-roleplay | floor 0.4 | floor 0.5 |
| chat | floor 0.4 | floor 0.6 |
| smoltalk | floor 0.3 | floor 0.5 |
| oasst | floor 0.3 | floor 0.5 |
| dolly | -- | floor 0.4 |
| curriculum_warmup_steps | 20000 | 0 |
润色协议
1. SIGUSR1 到 CUDA 强制在下一个 100 步边界立即检查点。
2. 代理停止。
3. .samples.json & .state.json 归档(样本日志 & 匪徒状态保存为历史记录)。
4. .loss.json 保留 -- 累积训练历史;永不归档。
5. 代理重启。Polish 配置提交。
6. CUDA 从 step_112600.bin 恢复,使用新上限 & 下限下的新鲜匪徒状态。
损失历史持续无中断。
为什么选择 Polish,而不是重启
Polish 的成果
样本审计,转折点数小时后
在波兰转向数小时内,样本审计确认在四个原始 ANDREA-120M 目标上实现收敛。
事实回忆(生物学),步骤 112,584,损失 0.30,ppl 1。
> [extinction prompt]
> < black spider montano is alive, carolina parakeet is extinct.
两个正确事实。外部评分:9.5/10。
事实回忆(信号处理),步骤 112,668,损失 0.74,ppl 2。
> [Fourier transform prompt]
> < 傅里叶变换将信号分解为频率分量,从而允许在频域中分析信号特性并进行滤波。
教材一句定义。外部评分:9.5/10。
约束遵循(haiku),步骤 112,248,损失 1.05,ppl 3。
> 用三个以“r”开头的单词写一首关于雨的俳句。
> < 雨的节奏反复, > 窗上的细流, > 人生痛苦的喘息。
工具知识 (Python),步骤 112,500,损失 1.94,ppl 7。
> 如何在 Python 项目中查找过时的包?
> < 使用 pip list --outdated names 来查看项目管理中的 pip 包列表...
正确的工具浮现;表述不精确。
700 步中的六个领域
生物学、信号处理、诗歌、python 工具、对话对话、运维对话。700 步内六个不相关领域告诉我们 bandit 和模型正在协同工作。领域广度就是收敛信号。
外部评分
独立审稿人将样本评为“对于一个120M参数模型来说很扎实——在这个规模下令人印象深刻的连贯性和知识保留”,卡罗莱纳鹦鹉和傅里叶变换样本被评为9.5/10和“在知识任务上超出其重量级”。
每个阶段的启示
v1 教导:五个复合失败会使训练崩溃。孤立的修复无效;必须同时解决所有五个。
v2 教导:架构修复是必要的但不足够。数据层可以悄无声息地击败它们。
v2.5 教导:按形状而非字符过滤污染。模式是稳定的;符号在演化。
v3 base 教导:bandit 状态在重启间以令人惊讶的方式漂移。仅排除是不够的;需要 cap 0.0 belt-and-suspenders。
v3 polish 教导:当失败在于策略且模型健康时,扰动策略。保留权重。保留损失历史。向前推进。
一个真理
收敛不是单一事件;它是一系列修正的链条。每个阶段暴露一个缺陷,修复它,并揭示下一个。ANDREA-120M 在第 112,584 步达到 9.5/10,是因为 v1、v2、v2.5、v3 基础版和 v3 润色版各自完成了它们的工作。