16日間のregion region region
終了した実行
ANDREA-120M v1は2026-03-22に開始され、計画の200,000ステップ中165,000ステップの2026-04-15に終了しました。EMA損失最小値:ステップ110Kで3.23(ランダム確率:ln(8449) = 9.04、損失は見栄えが良さそうでした)。サンプルはそうではありませんでした。
ステップ 80K: 地域 地域 地域 地域 地域 地域 地域
ステップ 110K: ''''' ''''' '' ''' '' ''' '''?' ''' ' '' '' '
ステップ 140K: ゲーム、ゲーム、ゲーム、ゲーム、ゲーム、ゲーム
ステップ 165K: ブディ ブディ ブディ ブディ ブディ ブディ ブディ ブディ ブディ
RTX 4090の16日間の計算。130W連続。ステップ80K以降はゴミ。
microGPTは成功したが120Mは失敗した理由
ANDREA-12Mは同じ訓練プロキシを使用し、合格しました。小さな重み行列は勾配ショックに対してより頑健であることが証明されました。120Mパラメータへのスケーリングはすべての脆弱性を倍増させました。5つの失敗が複合的に積み重なりました。
5つの複合的な失敗
失敗1: 勾配クリッピングなし。 ソース遷移が7-42ステップごとに発生し、境界のない勾配スパイクを生じさせました。120Mで1つの悪いバッチがモデルを最適化器が脱出できない退化吸引子に押し込む可能性があります。12Mモデルは小さな重みがショックに耐えられたため生き残りました。
失敗 2: LR ウォームアップなし。 学習率が新しく初期化された重みで即座に 0 からピークに跳ね上がった。表現が形成される前にモデルが悪い盆地に陥った。
失敗 3: 重み減衰なし。 Vanilla Adam が任意に大きな重みを許容し、120M 容量で繰り返しパターンを増幅した。
失敗 4: サンプル品質監視なし。 eval_chat_quality() はレガシー多段階ランナーにのみ接続されており、firehose カリキュラムはこれを呼び出さなかった。モデルはステップ 80K 以降ゴミを生成し、10 日以上検知されなかった。
失敗 5: Bandit が繰り返しソースを報酬づけた。 repo-docs、repo-docstrings、& unfirehose-chat が最高スコア(平均報酬 340-453)を記録した。なぜならリスト構造コンテンツがクロスエントロピーを自明に低減するため。Bandit はモデルを退化させるものをさらに供給した。
複合効果
単一の失敗だけでv1が崩壊したわけではない。それぞれが互いを増幅した。ウォームアップなし(2)の勾配ショック(1)が、新規初期化されたモデルに任意に大きな重み(3)を与え、反復を生み出し、それをバンディットが報酬づけた(5)一方で、誰も出力を見ていなかった(4)。5つの交差する原因、1つの崩壊。
なぜ5つの失敗で、1つではないのか
失敗1つにつき修正1つ
v2 設定 (2026-04-15)
| 修正 | 対象の失敗 | 実装 |
|---|---|---|
| グラディエントクリッピング | F1 (クリッピングなし) | グローバルL2ノルム、max_norm=1.0; 3つのCUDAカーネル (k_grad_norm_partial, k_grad_norm_final, k_grad_scale) がpre-Adamの計算と適用を行う |
| LR warmup | F2 (warmupなし) | 2000ステップで0からピークへの線形ランプ。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 (監視なし) | 各サンプルをスコアリング (bigram/trigram/word/char 多様性)。5連続サンプルが30未満で自動停止 |
| カリキュラムウォームアップ | F5 (bandit が繰り返しを消費) | 最初の20Kステップは7つのチャット/散文ソースに制限;その後firehoseが有効化;repo-docstringsは完全に除外 |
さらに sample_every を200から100ステップに削減 (監査頻度を倍増)、& repo-docs 上限を0.5から0.3に削減。
バックテスト
コヒーレンスゲートをv1でバックテスト:ステップ132Kでトリガーされ、3.8日分の計算を節約。このゲート単独でv1の無駄な計算を~30%削減;他の4つの修正によりv1はそのゲートトリガーに到達しない。
v2 が修正しなかったこと
データ汚染。v2 は hermes3-* ソースを LLM 教師由来のため「事前クリーン」として信頼した。Makefile の DEEP_CLEAN_SKIP が hermes3-general、hermes3-creative、& hermes3-roleplay を make deep-clean から除外した。unfirehose-chat がエージェントのシステムプロンプトをユーザーターンとしてキャプチャした。これら2つの欠陥がデータ層で待ち構え、表面化する準備ができていた。
修正を失敗にマッピング
ステップ15K: 2つのデータ欠陥が表面化
v2が見たもの
v2は2026-04-15に開始。200Kステップの約15Kステップ(7.5%完了)で、サンプルがエージェント・ハーネスの装飾(○ ●)と記事支配のフォールバック(ステップ14,966でa = 単語の26%; ステップ14,798でthe = 21%)を生成。v2の5つの安定性修正は正しく機能していた。失敗はアーキテクチャからデータに移っていた。
2つの独立したパイプライン欠陥
欠陥A: unfirehose-chatがエージェントのシステムプロンプトをユーザーターンとしてキャプチャ。 unfirehose-chatは~/.claude/、~/.fetch/、~/.uncloseai/のハーネスセッションJSONLファイルから構築。インジェストパイプラインが多節エージェントシステムプロンプト(# Agent X、## Identity、## Rulesなど)を> user / < assistantペアのユーザーターンスロットに変換。モデルは「ユーザー」が多節マークダウンで話すことを学習し、自分の出力でそれらの装飾を再現した。
欠陥 B: hermes3-* がすべてのフィルターをバイパスしました。 Makefile の DEEP_CLEAN_SKIP が hermes3-general、hermes3-creative、& hermes3-roleplay を make deep-clean から除外していました。これは、LLM蒸留データが事前にクリーンされているという誤った前提によるものです。徹底的なスキャンにより、既存のフィルターを適用すると hermes3 の行の 87-93% が拒否されることが判明しました(ブロックサイズ=1024を超える2000文字以上の過大段落;CJK/キリル/アラビア語の翻訳応答;低ビグラム多様性の実行)。
v2.5 パッチ (commit de24332, 2026-04-18)
2つの構造的変更。
変更 1: filter-dataset.c の has_system_prompt_shape()。 システムプロンプトの漏洩を文字一致ではなく形状で検出します。3つの信号を組み合わせ:
1. 1ターンに3つ以上のMarkdownヘッダー = ドロップ。
2. ターン長が500文字以上で2つ以上のヘッダー = ドロップ。
3. エージェントシャードのフィンガープリントフレーズ(# Agent , Shadow Clone, Your shard, Read it. Become it, This file defines)がヘッダーまたは長さ400以上と組み合わさった場合 = ドロップ。
分離ルール: / セパレータ(スペース付き、URLパスを断片化する生の/ではない)で最初のユーザーターンをチェックし、アシスタント応答の正当なMarkdownでの誤検知を避ける。
変更2: hermes3-* を DEEP_CLEAN_SKIP から移動。 フィルタリングされていないものは何も信用しない。
パッチ後のドロップ率
| source | in-lines | out-lines | dropped |
|---|---|---|---|
| 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% |
ベースラインのフィルターはすでにhermes3の汚染の87-93%を捕捉していました。DEEP_CLEAN_SKIPが主要な欠陥でした。新しい形状検出器は全体で約0.1%の追加拒否を追加し、unfirehose-chatに集中しており、既存のフィルターが見逃す特定のagent-shardリークを除去します。
なぜ形状が文字を上回るのか
装飾は進化します。○をドロップする文字一致フィルターは、来週の◇に対して何もできません。形状ベースのフィルター(ヘッダーのカウント、文字のカウント、フィンガープリントフレーズの認識)は、装飾のバリエーション全体に一般化します。パターン:汚染検出は構造的ヒューリスティックを使用する必要があります。
形状でフィルタリングする理由
データのないバンディットアーム
v3は2026-04-18にリリース
v2と同じアーキテクチャとハイパーパラメータ;v2.5パッチ後のクリーンなデータ。サンプル監査でゼロの装飾漏洩。v3はステップ112Kまでクリーンに実行されました。
ステップ 112,619: サンプル監査がパターンを検知
サンプル監査により、一貫した会話ターン(俳句、Q&A、対話)が明らかになったが、知識アーム(gutenberg、repo-docstrings、repo-docs)に焦点を当てた周期的なフェーズで、コードのような断片とリポジトリのトークン化ノイズが漏洩していた。ステップ 112,080 の1つのサンプルでは損失が0.13に達し:異常な低さで、学習されたチャット分布ではなく記憶された repo-docs 部分文字列を示唆。
ゾンビアーム
診断:exclude_sources はトレーニング開始時に repo-docstrings を正しく除去したが、持続された bandit 状態が以前の実行からの重み 1.546 の残留 repo-docstrings アームを保持していた。状態のリロードにより、.btok がサンプリング用に存在しないにもかかわらず、UCB プールに復活させ、探索会計を歪めるゾンビプルが発生。
教訓:bandit 状態ファイル(.state.json)は再起動間で驚くべき方法でドリフトする。構成の除外は残留アームメモリを消去しない。ベルトとサスペンダーの両方が必要:exclude とともに cap = 0.0。
ポーランド語設定
カリキュラムの摂動のみ。アーキテクチャ、オプティマイザ状態、学習率スケジュール、& 損失履歴はすべて step_112600.bin から保持されています。
| Source | v3 base | v3 polish |
|---|---|---|
| repo-docs | cap 0.3 | 除外 (cap 0.0) |
| repo-docstrings | 除外 | 除外 + cap 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 | [コンテンツ v3_polish/zombie_arm]
| chat | floor 0.4 | floor 0.6 | [コンテンツ v3_polish/zombie_arm]
| smoltalk | floor 0.3 | floor 0.5 | [コンテンツ v3_polish/zombie_arm]
| oasst | floor 0.3 | floor 0.5 | [コンテンツ v3_polish/zombie_arm]
| dolly | -- | floor 0.4 | [コンテンツ v3_polish/zombie_arm]
| curriculum_warmup_steps | 20000 | 0 | [コンテンツ v3_polish/zombie_arm]
[コンテンツ v3_polish/zombie_arm]
ポーランド語プロトコル
1. SIGUSR1 を CUDA に送信すると、次の 100 ステップ境界で即時チェックポイントが強制されます。
2. プロキシが停止します。
3. .samples.json & .state.json がアーカイブされます (サンプルログ & バンディット状態が履歴記録として保存されます)。
4. .loss.json は保持 -- 累積トレーニング履歴; 決してアーカイブされません。
5. プロキシが再起動します。Polish 設定が送信されます。
6. CUDA が step_112600.bin から新鮮なバンディット状態で新しい上限 & 下限の下で再開します。
損失履歴が途切れず継続します。
なぜ磨き上げるのか、リスタートではないのか
Polish が生み出したもの
Pivot 後数時間でのサンプル監査
ポーランドピボットから数時間以内に、サンプル監査が元の4つのANDREA-120M目標への収束を確認しました。
事実想起(生物学)、ステップ112,584、損失0.30、ppl 1。
> [extinction prompt]
> < black spider montano is alive, carolina parakeet is extinct.
2つの正しい事実。外部評価: 9.5/10。
事実想起(信号処理)、ステップ112,668、損失0.74、ppl 2。
> [Fourier transform prompt]
> < フーリエ変換は信号を周波数成分に分解し、信号特性の分析と周波数領域でのフィルタリングを可能にします。
教科書の一文定義。外部評価: 9.5/10。
制約追従(俳句)、ステップ 112,248、損失 1.05、ppl 3。
> 'r' で始まる3つの単語を使って、雨についての俳句を書いてください。
> < 雨のリズミカルな反復、 > 窓の雫、 > 人生の痛みからの休息。
ツール知識 (Python)、ステップ 112,500、損失 1.94、ppl 7。
> Pythonプロジェクトで古いパッケージをどのように見つけるか?
> < pip list --outdated names を使用して、プロジェクト管理内のpipパッケージリストを表示...
正しいツールが現れる;表現が不正確。
700ステップにおける6つのドメイン
生物学、信号処理、詩、pythonツール、会話対話、オプス対話。700ステップ以内の6つの無関係なドメインは、バンディットとモデルが協力して動作していることを示す。ドメインの広さこそが収束のシグナルである。
外部評価
独立したレビュアーがサンプルを「120Mパラメータモデルとしては堅実 -- この規模での印象的な一貫性と知識保持」と評価し、Carolina parakeetとFourier transformのサンプルは9.5/10と「知識タスクでその規模を超えたパフォーマンス」と評価されました。
各フェーズが教えたこと
v1が教えたこと: 5つの複合的な失敗がトレーニングを崩壊させる。個別の修正では救えず、すべてが同時に成功する必要がある。
v2が教えたこと: 建築的な修正は必要だが十分ではない。データ層がそれらを静かに無効化できる。
v2.5 が教えたこと:形状でフィルタリングによる汚染ではなく、文字で。パターンは安定;シンボルは進化する。
v3 base が教えたこと:bandit state は再起動間で驚くべき方法でドリフトする。Excludes だけでは不十分;cap 0.0 の belt-and-suspenders が必要。
v3 polish が教えたこと:失敗がポリシーにありモデルが健全な場合、ポリシーを摂動する。重みを保持。損失履歴を保持。前進する。
一つの真実
収束は単一のイベントではなく、修正の連鎖です。各フェーズが1つの欠陥を露呈し、それを修正し、次の欠陥を明らかにしました。ANDREA-120Mはステップ112,584で9.5/10を読み取るのは、v1、v2、v2.5、v3ベース、およびv3 polishがそれぞれの役割を果たしたからです。