179 lines
5.5 KiB
Python
179 lines
5.5 KiB
Python
#!/usr/bin/env python3
|
|
"""Rebuild the Round 06 scoping table from frozen Round 05 raw files."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
import json
|
|
import math
|
|
import statistics
|
|
from pathlib import Path
|
|
from typing import Any, Callable
|
|
|
|
|
|
SEEDS = (2026073001, 2026073002, 2026073003)
|
|
|
|
|
|
def parse_args() -> argparse.Namespace:
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument(
|
|
"--raw-dir",
|
|
type=Path,
|
|
default=Path(__file__).resolve().parents[1]
|
|
/ "attnres_gradient"
|
|
/ "results"
|
|
/ "raw",
|
|
)
|
|
return parser.parse_args()
|
|
|
|
|
|
def pearson(left: list[float], right: list[float]) -> float:
|
|
left_mean = statistics.fmean(left)
|
|
right_mean = statistics.fmean(right)
|
|
numerator = sum(
|
|
(x - left_mean) * (y - right_mean)
|
|
for x, y in zip(left, right)
|
|
)
|
|
left_square = sum((value - left_mean) ** 2 for value in left)
|
|
right_square = sum((value - right_mean) ** 2 for value in right)
|
|
return numerator / math.sqrt(left_square * right_square)
|
|
|
|
|
|
def mixer_metrics(value: dict[str, Any]) -> dict[str, float | int]:
|
|
weights = value["mean_weights"]
|
|
sources = value["sources"]
|
|
return {
|
|
"sources": sources,
|
|
"latest": weights[-1],
|
|
"maximum": max(weights),
|
|
"normalized_entropy": (
|
|
1.0
|
|
if sources == 1
|
|
else value["entropy_mean"] / math.log(sources)
|
|
),
|
|
}
|
|
|
|
|
|
def average(rows: list[dict[str, Any]], key: Callable[[dict[str, Any]], float]) -> float:
|
|
return statistics.fmean(key(row) for row in rows)
|
|
|
|
|
|
def main() -> None:
|
|
args = parse_args()
|
|
rows = []
|
|
source_hashes = {}
|
|
for seed in SEEDS:
|
|
path = (
|
|
args.raw_dir
|
|
/ f"formal-depth-32-block-seed-{seed}.json"
|
|
)
|
|
run = json.loads(path.read_text())
|
|
source_hashes[str(seed)] = run["canonical_sha256_without_self"]
|
|
diagnostic = next(
|
|
item for item in run["diagnostics"] if item["step"] == 8000
|
|
)
|
|
gradients = diagnostic["activation_grad_rms_by_block"]
|
|
gradient_mean = statistics.fmean(gradients)
|
|
for layer in range(32):
|
|
rows.append(
|
|
{
|
|
"seed": seed,
|
|
"layer": layer + 1,
|
|
"group": layer // 4 + 1,
|
|
"offset": layer % 4 + 1,
|
|
"normalized_gradient": gradients[layer] / gradient_mean,
|
|
"attention": mixer_metrics(
|
|
diagnostic["depth_weights"][2 * layer]
|
|
),
|
|
"mlp": mixer_metrics(
|
|
diagnostic["depth_weights"][2 * layer + 1]
|
|
),
|
|
}
|
|
)
|
|
|
|
layer_means = []
|
|
for layer in range(1, 33):
|
|
selected = [row for row in rows if row["layer"] == layer]
|
|
layer_means.append(
|
|
{
|
|
"layer": layer,
|
|
"group": selected[0]["group"],
|
|
"offset": selected[0]["offset"],
|
|
"normalized_gradient": average(
|
|
selected, lambda row: row["normalized_gradient"]
|
|
),
|
|
"attention_latest": average(
|
|
selected, lambda row: row["attention"]["latest"]
|
|
),
|
|
"mlp_latest": average(
|
|
selected, lambda row: row["mlp"]["latest"]
|
|
),
|
|
"attention_normalized_entropy": average(
|
|
selected,
|
|
lambda row: row["attention"]["normalized_entropy"],
|
|
),
|
|
"mlp_normalized_entropy": average(
|
|
selected, lambda row: row["mlp"]["normalized_entropy"]
|
|
),
|
|
"per_seed_normalized_gradient": [
|
|
row["normalized_gradient"] for row in selected
|
|
],
|
|
}
|
|
)
|
|
|
|
correlations = {}
|
|
for label, selected in (
|
|
("all_layers", rows),
|
|
("layers_19_28", [
|
|
row for row in rows if 19 <= row["layer"] <= 28
|
|
]),
|
|
):
|
|
gradients = [row["normalized_gradient"] for row in selected]
|
|
correlations[label] = {
|
|
"points": len(selected),
|
|
"attention_latest": pearson(
|
|
gradients,
|
|
[row["attention"]["latest"] for row in selected],
|
|
),
|
|
"mlp_latest": pearson(
|
|
gradients, [row["mlp"]["latest"] for row in selected]
|
|
),
|
|
"attention_normalized_entropy": pearson(
|
|
gradients,
|
|
[
|
|
row["attention"]["normalized_entropy"]
|
|
for row in selected
|
|
],
|
|
),
|
|
"mlp_normalized_entropy": pearson(
|
|
gradients,
|
|
[row["mlp"]["normalized_entropy"] for row in selected],
|
|
),
|
|
"attention_maximum": pearson(
|
|
gradients,
|
|
[row["attention"]["maximum"] for row in selected],
|
|
),
|
|
"mlp_maximum": pearson(
|
|
gradients, [row["mlp"]["maximum"] for row in selected]
|
|
),
|
|
}
|
|
|
|
print(
|
|
json.dumps(
|
|
{
|
|
"schema_version": 1,
|
|
"identity": "exploratory Round 05 scoping; not confirmatory Round 06",
|
|
"source_canonical_sha256": source_hashes,
|
|
"layers_19_28": layer_means[18:28],
|
|
"correlations": correlations,
|
|
},
|
|
ensure_ascii=False,
|
|
indent=2,
|
|
sort_keys=True,
|
|
)
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|