モデルはどれだけ驚くべきか?
Logitsから確率へ
12個のトランスフォーマーブロックの後、ANDREA-120Mは各トークン位置ごとにvocab_size個の数字からなるベクトルを生成します:logitsです。ANDREA-120Mの場合、vocab_size = 8449なので、各位置で8449個のlogitsが出力されます。Logitsは非正規化スコアです;一部は正、一部は負で、1に合計する制約はありません。
Softmaxはロジットを確率分布に変換します:
p_i = exp(logit_i) / sum_j exp(logit_j)
Softmax適用後、すべての8449個の数字が0~1の間に収まり、合計は1になります。モデルはすべての可能な次のトークンに確率を割り当てます。
クロスエントロピー損失
訓練には損失関数が必要です。これは、与えられた正解に対してモデルの予測がどれだけ間違っていたかを測定する数値です。クロスエントロピーは言語モデリングに適しています:
loss_t = -log(p_correct_token_t)
モデルの実際の次のトークン(訓練データにあるもの)に対する予測確率を取ります。その確率の負の対数を取ります。それが1つの位置あたりの損失です。
なぜ負の対数なのか
-log(p) を自然な損失関数にする3つの性質があります:
- -log(1) = 0: モデルが正しいトークンを100%の確信で予測した場合、損失はゼロです。
- -log(0) = ∞: モデルが正しいトークンにゼロの確率を割り当てた場合、損失は無限大です。(実際には、softmaxは正確に0を出力しません;損失は有限ですが大きくなります。)
- 単調増加: 正しいトークンの予測確率が増加するにつれて、損失が滑らかに減少します。
正解に対する高い確信度 = 低い損失。トレーニングの目的はシンプルです:実際の次のトークンに対する予測確率を最大化する。
シーケンスごとの損失
ANDREA は長さ 1024 のシーケンス(コンテキストウィンドウ)でトレーニングします。各シーケンスは 1024 個の次のトークン予測を生成します。シーケンス損失はすべての位置で平均化されます:
sequence_loss = mean(-log(p_correct_t)) for t in 0..1023
シーケンスの損失はバッチ全体で平均化されます(ANDREA-120Mはbatch_size = 8を使用)。トレーニングステップごとに1つのスカラー値です。その値が損失曲線にプロットされます。
1つの位置に対する損失の計算
Perplexity = exp(loss)
より親しみやすいスケール
2.0 や 3.43 のような損失値は、モデルが何ができるかを即座に伝えてくれません。Perplexity は損失をより直感的なスケールに変換します:
perplexity = exp(loss)
Perplexity は明確な質問に答えます:モデルが効果的に選択している同等にあり得るトークンは何個ですか? Perplexity が 7 ということは、モデルが各位置で 7 個のあり得る次のトークンから選んでいるように振る舞っていることを意味します。Perplexity が 1 ということは完璧な予測です。
一般的な Loss-Perplexity のペア
| Loss | Perplexity | どんな感じか |
|---|---|---|
| 0.0 | 1.0 | 完璧な予測 |
| 1.0 | 2.7 | ~3 個のありえそうなトークンの中から選択する |
| 2.0 | 7.4 | ANDREA-12M 最終 SMMA 領域 |
| 3.0 | 20.1 | 合理的なテキストだが不確実 |
| 3.43 | 30.9 | ANDREA-120M v1 最小値(磨き前) |
| 5.0 | 148 | 初期訓練、語彙分布を学習中 |
| 9.04 | 8449 | ANDREA-120M の語彙に対するランダム推測ベースライン |
Perplexity は損失値を文脈に置きます:損失 2.0 は、モデルが ~7 個のトークンから効果的に選択することを意味し、8449 からではありません。
ランダム推測のベースライン
何も知らないモデルが一様に推測する場合、各トークンに確率 1/V を割り当てます。ここで V = vocab_size:
p_uniform = 1 / V
loss = -log(1/V) = log(V)
V = 8449 の ANDREA-120M の場合:
loss_uniform = ln(8449) ≈ 9.04
V = 2305 の ANDREA-12M の場合:
loss_uniform = ln(2305) ≈ 7.74
このベースラインを超える損失は、モデルがランダムよりも悪い性能を示していることを意味します。このベースラインを下回る損失は、モデルが何かを学習したことを意味します:均等分布よりも小さなトークンのサブセットに確率質量を集中させています。
損失値の読み取り
ステップレベルのノイズをスムーズにする
生の損失はノイジーです
ステップごとの損失が上下に揺れ動きます。ANDREA の bandit は 7-42 ステップごとに異なるソースを選択します。一部のソース(辞書定義)は簡単な損失を生み、他(gutenberg の段落)は難しい損失を生みます。ステップ番号に対する生のステップ損失をプロットすると、混沌とした散布図になります。
スムーズ化修正移動平均 (SMMA) はノイズを抑制し、トレンドを明らかにします。ANDREAのトレーニングプロキシはSMMAを次のように計算します:
SMMA[0] = loss[0]
SMMA[t] = (SMMA[t-1] * (N-1) + loss[t]) / N
N = 100(ANDREAのデフォルトスムージングウィンドウ)では、各新しいSMMA値は前のSMMAの99%と新しいステップ損失の1%を混合します。急激なスパイクは吸収され、持続的なシフトは徐々に現れます。
単純平均ではダメな理由は?
過去100ステップの単純移動平均には100個の損失値を保存する必要があります。SMMAは1つの値(走行平均)と1つの定数(ウィンドウサイズ)のみを保存します。メモリが安価で、計算が些細で、曲線を読むのに十分滑らかです。
異なるスムージングウェイトは異なる質問に答えます:
- N = 10: 短期変化を追跡;位相遷移中に有用
- N = 100: ANDREAのデフォルト;中期的な進捗を追跡
- N = 1000: 長期トレンドのみ; トレーニングの終わりで有用
ANDREA が追跡するもの
100ステップごとに、トレーニングプロキシが現在のSMMA、生の損失、ステップ数、およびソースごとの内訳を含む loss.json を書き込みます。training.ai.unturf.com/dashboard のダッシュボードは、このファイルを10秒ごとにポーリングします。外部ビューアはライブ進捗を確認でき、ダッシュボードは読み取り専用です。
ANDREA-12M の実際の曲線
SMMA 2.0 に到達したレシピ
| ステップ数 | 平均損失 | メモ |
|---|---|---|
| 0--2.5K | 4.50 | ランダム初期化、初期学習 |
| 2.5K--5K | 3.88 | 構造フェーズを通じた急激な低下 |
| 5K--10K | 3.30 | 一貫性境界に近づく |
| 10K--20K | 2.80 | バンディットが最適な混合比を発見 |
| 20K--25K | 2.40 | プラトー --- データ枯渇 |
| 25K--30K | 2.50 | Hermesデータ導入 + LR再起動 |
| 30K--35K | 2.35 | Hermes統合、新たな最低値 |
| 35K--40K | 2.10 | 4-arm focus, steep descent |
| 40K--43.6K | 2.00 | 知識領域、SMMAが2.0を下回る |
3つの段階が際立っています:
1. 急激な初期下降(0-10K)。 損失が4.50から3.30に低下し、モデルが語彙分布と基本的なターン構造を学習します。ランダムチャンスのベースライン ln(2305) ≈ 7.74 はこの曲線よりはるか上にあり、埋め込みが安定するとモデルは確率質量を素早く集中させます。
2. 停滞期(20K-25K)。 損失が2.40で停滞します。バンディットは現在のソースミックスのヘッドルームを使い果たしました。25KステップでHermesデータが追加され、LRウォーム再起動により停滞が打破されました。
3. 最終下降(35K-43.6K)。 カリキュラムを16ソースから4つ(hermes3-general + dictionary + gutenberg + chat)に絞り込み。フルアームバンディットより急激な損失低下。最終SMMA: 2.0。
ANDREA-120M v1: 警告の曲線
同じ語彙計算: ln(8449) ≈ 9.04。ANDREA-120M v1はステップ110KでSMMA 3.43(その最小値)に達した後、発散:
| ステップ | EMA Loss | 傾向 |
|---|---|---|
| 26K--40K | 4.29 | 収束中 |
| 70K--85K | 3.60 | 最適領域 |
| 85K--110K | 3.43 | 最小値 |
| 110K--125K | 3.54 | 発散中 |
| 140K--155K | 4.05 | 発散中 |
| 155K--165K | 4.54 | 崩壊 |
損失値は数値的に妥当な範囲全体(3.43はランダムベースライン9.04を大きく下回る)。しかしサンプルは繰り返し崩壊:Budy Budy Budy Budy。損失は誤解を招く物語を語った;サンプル監査はそうではなかった。
v2のcoherence-gated early stopping(アクティビティ78)では、並行シグナルとしてbigram diversity、trigram diversity、English word presence、character diversityが追加されました。4つのスコアすべてが5連続サンプルで30未満を維持すると、トレーニングが自動停止します。このシグナルはv1を132Kステップで捕捉し、3.8日分の計算を節約できたはずです。
各フェーズが教えてくれること
120M v1 レッスン
2つの独立したシグナル
ANDREA-120M v1 はステップ 110K で SMMA 3.43 に到達しました。数値的に:ランダムチャンス(perplexity 31 vs 語彙サイズ 8449)より 273倍優れています。曲線上では素晴らしい見た目です。
ステップ 110K のサンプル::
''''' ''''' '' ''' '' ''' '''?' ''' ' '' '' '
損失と一貫性は独立したシグナルです。低い損失は、モデルが確率質量を効果的に集中させていることを意味します。一貫性は、モデルが人間が読めるテキストを生成することを意味します。最初のものが2番目のものを意味するわけではありません。
ギャップが存在する理由
モデルは次の方法で損失を下げることができます:
1. 本物の言語パターンを学習する (良い): 主語-動詞の一致、一般的なフレーズ、事実的な関連付け。
2. 構造的な人工物の暗記 (悪い): 高頻度繰り返しパターン、データセット特有の癖、退化吸引子。
どちらも損失を減らす。最初のものは人間が好むサンプルを生成する。2番目のものは Budy Budy Budy Budy を生成する。訓練目標だけではそれらを区別できない。
ANDREA-120M v3 Polish: Loss & Coherence が交わる場所
v3 polish(ステップ112K以降)後、ANDREA-120M は以下を生成します:
Step 112,584, loss 0.30, ppl 1::
> [extinction prompt]
< ブラックスパイダーモンタノは生息中、カロライナインコは絶滅。
両方の事実が正しい。カロライナインコは1939年に絶滅宣言;ブラックスパイダーモンキーは現存。損失が低い (0.30) かつ 事実の回想が一貫性あり。
ステップ 112,500、損失 1.94、ppl 7::
> Pythonプロジェクトで古いパッケージをどうやって見つける?
< `pip list --outdated` を使用して pip パッケージリストを表示...
損失が高い (1.94 → ppl 7) が、トレーニングデータから正しいツールが現れる。表現の流暢さはまだ56%のトレーニング時点で発展中。
2つのシグナル規律
現代のトレーニングパイプラインは両方を監視します:
- 損失曲線。モデルが定量的に何かを学習しているかどうかを教えてくれます。
- サンプル監査。モデルが学習したものが有用かどうかを教えてくれます。
v2では一貫性ゲート付き早期停止(アクティビティ78)が追加されました。v3の洗練は損失値ではなくサンプル監査によって引き起こされたカリキュラム摂動でした。損失だけでは必要ですが決して十分ではありません。