headless / tests /compare_lm5_backbone.py
logos42's picture
Upload folder using huggingface_hub
216004d verified
Raw History Blame Contribute Delete
2.83 kB
#!/usr/bin/env python3
"""lm5 多模态: MLP(新骨干) vs SSM(旧骨干), 3 seed × 2000 步 对照。"""
import json
import os
import numpy as np
R = "/work/liuyuanjie/headless/results"
SEEDS = [42, 1, 7]
def collect(bb):
out = {}
doms = None
for s in SEEDS:
p = f"{R}/lm5_d_{bb}_s{s}/lm5_mm_results.json"
if not os.path.exists(p):
continue
d = json.load(open(p))
doms = d["domains"]
out[s] = np.array(d["matrix"][-1], dtype=float)
return doms, out
doms, mlp = collect("mlp")
_, ssm = collect("ssm")
print("=" * 84)
print("LM5 多模态 · MLP(新) vs SSM(旧) —— 3 seed × 2000 步, 学完 5 域后的最终值")
print("=" * 84)
print()
print(" %-14s %-22s %-22s %8s" % ("域", "MLP mean±std (CV)", "SSM mean±std (CV)", "差值"))
print(" " + "-" * 70)
rows = []
for j, k in enumerate(doms):
a = np.array([mlp[s][j] for s in mlp])
b = np.array([ssm[s][j] for s in ssm])
ma, sa = a.mean(), a.std()
mb, sb = b.mean(), b.std()
cva = 100 * sa / max(1e-9, abs(ma))
cvb = 100 * sb / max(1e-9, abs(mb))
ok_a = "可信" if (ma > 0 and sa < ma / 2) else "不可信"
ok_b = "可信" if (mb > 0 and sb < mb / 2) else "不可信"
print(" %-14s %.4f±%.4f (%5.1f%% %s) %.4f±%.4f (%5.1f%% %s) %+.4f" %
(k, ma, sa, cva, ok_a, mb, sb, cvb, ok_b, ma - mb))
rows.append((k, ma, sa, mb, sb))
print()
print(" ── 逐 seed 原始值 (最终行) ──")
print(" %-14s %-22s %-22s" % ("域", "MLP s42/s1/s7", "SSM s42/s1/s7"))
for j, k in enumerate(doms):
print(" %-14s %-22s %-22s" %
(k, "/".join("%.3f" % mlp[s][j] for s in SEEDS),
"/".join("%.3f" % ssm[s][j] for s in SEEDS)))
print()
print(" ── 判读参照 ──")
print(" %-14s %-10s %-10s %-10s" % ("域", "随机线", "多数类基线", "结论"))
ref = [("en", "0.0002", "0.094"), ("zh", "0.0002", "0.033"),
("code", "0.0002", "0.122"), ("wave", "0.167", "-"),
("causal", "0.2", "0.296"), ("causal_do", "0.2", "0.508"),
("causal_bal", "0.2", "-"), ("causal_do_bal", "0.2", "-")]
for (k, r_, m_), (k2, ma, _, mb, _) in zip(ref, rows):
best = max(ma, mb)
if k in ("en", "zh", "code"):
msg = "低于多数类" if best < float(m_) else "高于多数类"
elif k == "causal_do":
msg = "≈多数类(无增益)" if abs(best - float(m_)) < 0.03 else "有增益"
else:
msg = "高于随机" if best > float(r_) + 0.02 else "≈随机"
print(" %-14s %-10s %-10s %s" % (k, r_, m_, msg))
print()
print(" 平均(全部 8 列): MLP %.4f SSM %.4f" %
(np.mean([r[1] for r in rows]), np.mean([r[3] for r in rows])))
print(" 平均(仅 wave+causal 四项): MLP %.4f SSM %.4f" %
(np.mean([r[1] for r in rows[3:]]), np.mean([r[3] for r in rows[3:]])))