| |
| from __future__ import annotations |
|
|
| import os |
| from pathlib import Path |
|
|
| os.environ.setdefault("MPLCONFIGDIR", "/tmp/matplotlib") |
|
|
| import matplotlib.pyplot as plt |
|
|
|
|
| OUT_DIR = Path("figures") |
| OUT_DIR.mkdir(exist_ok=True) |
|
|
| FINAL_LONG_RUN_PPL = 19.7822 |
|
|
| EXPERIMENTS = [ |
| { |
| "name": "Naive\nbaseline", |
| "legend": "baseline", |
| "color": "#6b7280", |
| "public_ppl": 42.2650, |
| "train_loss_4500": 3.6290, |
| "internal_val_loss_4500": 3.6823, |
| "curve": [ |
| (0, 10.9696), (250, 6.0841), (500, 5.2423), (750, 4.6500), |
| (1000, 4.3752), (1250, 4.2232), (1500, 4.1024), |
| (1750, 3.9847), (2000, 3.9412), (2250, 3.8667), |
| (2500, 3.8559), (2750, 3.7679), (3000, 3.7503), |
| (3250, 3.7585), (3500, 3.7046), (3750, 3.7635), |
| (4000, 3.6673), (4250, 3.6389), (4500, 3.6823), |
| ], |
| }, |
| { |
| "name": "Mixed\ndata", |
| "legend": "data", |
| "color": "#2563eb", |
| "public_ppl": 38.7702, |
| "train_loss_4500": 3.4646, |
| "internal_val_loss_4500": 3.4312, |
| "curve": [ |
| (0, 10.9799), (250, 5.8726), (500, 5.1043), (750, 4.5490), |
| (1000, 4.1688), (1250, 4.0293), (1500, 3.9846), |
| (1750, 3.8147), (2000, 3.7881), (2250, 3.7224), |
| (2500, 3.6965), (2750, 3.6746), (3000, 3.5739), |
| (3250, 3.5122), (3500, 3.5903), (3750, 3.4440), |
| (4000, 3.5392), (4250, 3.4584), (4500, 3.4312), |
| ], |
| }, |
| { |
| "name": "Muon\noptimizer", |
| "legend": "Muon", |
| "color": "#dc2626", |
| "public_ppl": 40.0987, |
| "train_loss_4500": 3.5600, |
| "internal_val_loss_4500": 3.6192, |
| "curve": [ |
| (0, 10.9696), (250, 5.9106), (500, 5.1345), (750, 4.4705), |
| (1000, 4.2422), (1250, 4.1028), (1500, 3.9927), |
| (1750, 3.8881), (2000, 3.8523), (2250, 3.7771), |
| (2500, 3.7735), (2750, 3.6887), (3000, 3.6751), |
| (3250, 3.6859), (3500, 3.6309), (3750, 3.6952), |
| (4000, 3.6025), (4250, 3.5744), (4500, 3.6192), |
| ], |
| }, |
| { |
| "name": "Lyra\narchitecture", |
| "legend": "arch", |
| "color": "#059669", |
| "public_ppl": 36.5445, |
| "train_loss_4500": 3.4135, |
| "internal_val_loss_4500": 3.4889, |
| "curve": [ |
| (0, 10.9630), (250, 5.5041), (500, 4.6324), (750, 4.2915), |
| (1000, 4.0727), (1250, 3.9969), (1500, 3.8429), |
| (1750, 3.7813), (2000, 3.7209), (2250, 3.7253), |
| (2500, 3.6427), (2750, 3.6593), (3000, 3.5319), |
| (3250, 3.6220), (3500, 3.5259), (3750, 3.5657), |
| (4000, 3.5040), (4250, 3.5018), (4500, 3.4889), |
| ], |
| }, |
| { |
| "name": "Combined\nshort run", |
| "legend": "combined", |
| "color": "#7c3aed", |
| "public_ppl": 32.1195, |
| "train_loss_4500": 3.2819, |
| "internal_val_loss_4500": 3.3663, |
| "curve": [ |
| (0, 10.9511), (250, 5.5112), (500, 4.4614), (750, 4.0177), |
| (1000, 3.8477), (1250, 3.7237), (1500, 3.7700), |
| (1750, 3.6963), (2000, 3.5705), (2250, 3.5041), |
| (2500, 3.4608), (2750, 3.3681), (3000, 3.3872), |
| (3250, 3.4139), (3500, 3.3327), (3750, 3.3329), |
| (4000, 3.3754), (4250, 3.2846), (4500, 3.3663), |
| ], |
| }, |
| ] |
|
|
|
|
| def main() -> None: |
| plt.style.use("seaborn-v0_8-whitegrid") |
| fig, axes = plt.subplots(1, 2, figsize=(13.5, 5.2), constrained_layout=True) |
|
|
| ax = axes[0] |
| labels = [exp["name"] for exp in EXPERIMENTS] |
| ppls = [exp["public_ppl"] for exp in EXPERIMENTS] |
| colors = [exp["color"] for exp in EXPERIMENTS] |
| bars = ax.bar(labels, ppls, color=colors, width=0.68) |
| ax.axhline(FINAL_LONG_RUN_PPL, color="#111827", linewidth=1.8, linestyle="--") |
| ax.text( |
| 0.02, |
| FINAL_LONG_RUN_PPL + 0.3, |
| f"final long run: {FINAL_LONG_RUN_PPL:.2f}", |
| transform=ax.get_yaxis_transform(), |
| ha="left", |
| va="bottom", |
| fontsize=9, |
| color="#111827", |
| ) |
| ax.set_title("Course Public Validation Perplexity", fontsize=13, weight="bold") |
| ax.set_ylabel("perplexity, lower is better") |
| ax.set_ylim(FINAL_LONG_RUN_PPL * 0.85, max(ppls) * 1.12) |
| for bar, val in zip(bars, ppls): |
| ax.text( |
| bar.get_x() + bar.get_width() / 2, |
| val, |
| f"{val:.1f}", |
| ha="center", |
| va="bottom", |
| fontsize=9, |
| ) |
|
|
| ax = axes[1] |
| for exp in EXPERIMENTS: |
| steps = [x for x, _ in exp["curve"]] |
| losses = [y for _, y in exp["curve"]] |
| ax.plot( |
| steps, |
| losses, |
| marker="o", |
| linewidth=2.0, |
| markersize=4, |
| color=exp["color"], |
| label=exp["legend"], |
| ) |
| ax.set_title("Short-Run Heldout Loss Curves", fontsize=13, weight="bold") |
| ax.set_xlabel("training iteration") |
| ax.set_ylabel("validation loss") |
| ax.legend(frameon=True, fontsize=9) |
| ax.text( |
| 0.02, |
| -0.18, |
| "Each run changes one variable and uses the same 4,500-iteration budget; public PPL is the comparable metric.", |
| transform=ax.transAxes, |
| fontsize=8.5, |
| color="#4b5563", |
| ) |
|
|
| fig.suptitle("Ablation Summary for the Presentation", fontsize=15, weight="bold") |
| for suffix in ("png", "pdf"): |
| out = OUT_DIR / f"presentation_ablation_summary_standalone.{suffix}" |
| fig.savefig(out, dpi=220) |
| print(out) |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|