File size: 5,000 Bytes
b707206
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
"""AUBIN-Learn çevrimiçi deney: soru akışında her cevaptan sonra doğru etiket gelir (geri bildirim), sistem anında öğrenir.

İki akış:
  * kev_transfer_test — Kev'in de AUBIN'in de HİÇ eğitilmediği kaynaklar (mmlu, emotion, tweet_offensive, qnli, paws, sciq);
    bellek BOŞ başlar, yalnız geri bildirimle dolar → "bilmediğini anında öğrenme" ölçümü.
  * kev_test — bellek Kev train (+ek veri) ile başlar.
Yöntemler: model (sabit), AUBIN-Learn = bellek + öz-kalibrasyon (Hedge: model/bellek/birleşik uzmanlarına güven kaynak-başına
geri bildirimle kendiliğinden ayarlanır). Aynı maddelerde, aynı sırada; ikinci yarı ayrıca raporlanır (öğrenme etkisi).
Not: Bu, statik kilitli test skoru DEĞİLDİR (akışta etiket görülür); statik skorlar learn_eval.py raporundadır.

    python learn_online.py --emb emb_bge.npz --pack model_lp.json.gz --out learn_online.json
"""
import argparse, glob, gzip, json, os, sys
import numpy as np

HERE = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, HERE)
import kevdata
from kev_llm import items
from aubin.learn import DecisionMemory, SelfCalibrator


def run_stream(its, V, lps, T, mem, cal, k=16, tau=0.05, wf=1.0):
    hm, hl, src, hk = [], [], [], {}
    for j, it in enumerate(its):
        lp = np.asarray(lps[j], dtype=np.float64) / T
        p, _ = mem.recall(None, it["src"], it["keys"], k, tau, vec=V[j])
        if p is not None:
            hk.setdefault(it["src"], []).append(int(np.argmax(p)) == it["y"])
        E = SelfCalibrator.experts(lp, p, wf)
        mix, _ = cal.predict(it["src"], E)
        hm.append(int(np.argmax(lp)) == it["y"]); hl.append(int(np.argmax(mix)) == it["y"]); src.append(it["src"])
        cal.update(it["src"], E, it["y"])
        mem.learn(None, it["src"], it["keys"], it["y"], vec=V[j])
    half = len(its) // 2
    by = {}
    for s, a, b in zip(src, hm, hl):
        by.setdefault(s, [[], []]); by[s][0].append(a); by[s][1].append(b)
    r = lambda x: round(float(np.mean(x)), 4)
    return {"n": len(its), "model": r(hm), "aubin_learn": r(hl), "model_2nd_half": r(hm[half:]), "aubin_learn_2nd_half": r(hl[half:]),
            "by_source": {s: {"n": len(v[0]), "model": r(v[0]), "aubin_learn": r(v[1]),
                              "memory_only_when_available": (r(hk[s]) if hk.get(s) else None), "memory_available": len(hk.get(s, [])),
                              "model_2nd_half": r(v[0][len(v[0]) // 2:]), "aubin_learn_2nd_half": r(v[1][len(v[1]) // 2:])} for s, v in sorted(by.items())}}


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("--work", default="/tmp/kev"); ap.add_argument("--emb", default="")
    ap.add_argument("--pack", required=True); ap.add_argument("--out", default="learn_online.json")
    a = ap.parse_args()
    emb = a.emb or (glob.glob("/kaggle/input/**/emb_bge.npz", recursive=True) or [""])[0]
    Z = np.load(emb)
    K = kevdata.load(a.work); tr = items(K["kev_train"])
    VP = Z["VP"].astype(np.float32)
    assert len(VP) == len(tr), f"gömme/bellek boyu uyuşmuyor {len(VP)} != {len(tr)} (KEV_EXTRA_TRAIN aynı mı?)"
    pack = json.load(gzip.open(a.pack, "rt", encoding="utf-8"))
    R = {"protocol": __doc__.split("Not:")[0].strip(), "note": "Statik kilitli test skoru değildir; statik skorlar learn_eval raporunda.",
         "runs": {}}
    def stream(rp, s, warm, eta, prior):
        its = items(K[s]); V = Z["VE_" + s].astype(np.float32); L = rp["suites"][s]
        assert all(int(y) == it["y"] for y, it in zip(L["y"], its))
        mem = DecisionMemory()
        if warm:
            mem.learn_vectors(VP, [x["src"] for x in tr], [x["keys"] for x in tr], [x["y"] for x in tr])
        return run_stream(its, V, L["lp"], rp.get("T", 1.0), mem, SelfCalibrator(eta, prior))

    GRID = [(eta, pr) for eta in (0.3, 1.0, 3.0) for pr in ((0.6, 0.1, 0.3), (0.8, 0.05, 0.15), (0.34, 0.33, 0.33))]
    for rn, rp in pack.items():
        out = {}
        # öz-kalibrasyon hiperparametreleri (η, başlangıç güveni) YALNIZ dev akışlarında seçilir; test akışlarına bir kez uygulanır
        devs = [(s, w) for s, w in (("kev_transfer_dev", False), ("kev_dev", True)) if s in rp["suites"] and "VE_" + s in Z.files]
        best = (1.0, (0.6, 0.1, 0.3))
        if devs:
            best = max(GRID, key=lambda g: np.mean([stream(rp, s, w, *g)["aubin_learn"] for s, w in devs]))
        out["selected_on_dev"] = {"eta": best[0], "prior_model_memory_fused": best[1], "dev_streams": [s for s, _ in devs]}
        for s, warm in (("kev_transfer_test", False), ("kev_test", True)):
            if s not in rp["suites"]:
                continue
            out[s] = stream(rp, s, warm, *best)
            print(rn, s, best, {k: out[s][k] for k in ("model", "aubin_learn", "model_2nd_half", "aubin_learn_2nd_half")}, flush=True)
        R["runs"][rn] = out
        json.dump(R, open(a.out, "w"), indent=1)
    print("BITTI", a.out, flush=True)


if __name__ == "__main__":
    main()