Ez az ellenőrzőpont egyetlen kérdés köré szervezi az eddigi anyagot: milyen feltételek mellett állítható, hogy a megtanult modell nemcsak a tanítóhalmazon, hanem az új mintán is jól teljesít? A 8.3. Kapacitás, regularizálás és modellválasztás alfejezetben láttuk, hogy a kapacitás, a regularizálás és a modellválasztás protokollja mind a tanulási állítás feltételrendszerét alkotják. Most ezeket egyetlen, teljes specifikációvá zárjuk össze.
Értékelés. A közös 0–4 rubrikát, a PASS-szabályt és a hibatípusonkénti visszautakat az 1.4. Tanulási diagnózis és kísérleti napló „Tanulási főút és ellenőrző pontok” szakasza adja meg; itt csak az eltérés: a riport itt a bizonyítékjegyzék; a súlypont a D3 és a D5.
A szükséges előismeret: a 6.1. Objektív, reguláris tag és gradienslépés alfejezetben bevezetett empirikus kockázat, a 6.3. Sztochasztikus és minibatch gradiens alfejezetben tárgyalt minibatch gradiens, a 7.4. Numerikus stabilitás és jelentésmegőrző implementáció alfejezetben bizonyított stabil veszteségszámítás, valamint a 4.4. I. ellenőrző pont: matematika és kód megfelelése alfejezetben felépített gradiensellenőrzési protokoll. A 8.3. Kapacitás, regularizálás és modellválasztás nested choice és a felfelé torzított validációs maximum gondolata közvetlenül folytatódik itt.
Induló becslés. Legyen a hipotézisosztály mérete , a minta mérete , a konfidenciaszint . Mielőtt levezetjük, becsüljük meg: mekkora egyszerű, adattól függetlenül számolható sávot kaphatunk az általánosítási hibára? A választ a következő pont után ellenőrizzük.
Distribution (eloszlás). Legyen a megfigyelés egy pár, ahol a bemenet, a cél. A tanulási feladat mögötti feltételezés egy közös eloszlás a párokon. A tanítóhalmaz , ahol a párok függetlenek és azonos eloszlásúak szerint (iid). A tesztminta ugyanebből a -ből származik, de diszjunkt -től. A a gyakorlatban nem ismert; ami ismert, az a minta.
Risk (kockázat). Az prediktor kockázata a várható veszteség:
A kockázat egyetlen valós szám, a veszteség dimenziójával. Az empirikus kockázat a tanítóhalmazon vett átlag:
A két mennyiség szerepe eltér: az, amit számolni tudunk, az, amiről állítani szeretnénk. A 8.1. Kockázat, mintavétel és baseline alfejezetben tárgyalt baseline-tól való eltérés mindig és közötti rés becslésének minőségén múlik.
Objective (célfüggvény). A tanítás a paraméterezett modellen egy célfüggvény minimalizálását jelenti. A 6.1. Objektív, reguláris tag és gradienslépés és 8.3. Kapacitás, regularizálás és modellválasztás jelölése szerint:
ahol a súlyregularizáló együttható. A célfüggvény kettős: az első tag az adathoz való illeszkedést, a második a kapacitáskorlátot képviseli. A a 8.3. Kapacitás, regularizálás és modellválasztás bias–variance kompromisszum operatív formája.
Gradient (gradiens). A gradiens a vektor, alakja megegyezik alakjával. A gyakorlatban a veszteség összegéből vagy átlagából indulunk ki. Átlagos veszteség esetén, ha az -edik minta egyedi vesztesége , a gradiens:
Az átlag faktora a 6.3. Sztochasztikus és minibatch gradiens alfejezetben tárgyalt batchskála miatt nem hagyható el, ha a tanulási rátát egy adott konvencióra hangoljuk.
Stochastic update (sztochasztikus frissítés). Az -ből vett minibatch az indexek véletlen, méretű részhalmaza. A minibatch gradiens:
és a frissítés . A frissítés azért sztochasztikus, mert véletlen; a teljes helyett annak egy közelítését használjuk. A sztochasztikus gradiens várható értéke a feltételes várható érték linearitása miatt , ha a regularizáló tagot is beleszámítjuk.
Independent test (független teszt). A tesztminta , mérete , diszjunkt a tanító- és validációs halmaztól. A teszt kockázatbecslője:
Ha független -től, akkor torzítatlan becslése -nek:
a függetlenség és az azonos eloszlás miatt. Ez a torzítatlanság azonnal megszűnik, ha a modellt a teszt eredménye alapján választjuk ki; ezt a 8.3. Kapacitás, regularizálás és modellválasztás adaptivitási protokollja már kimondta.
A jelen egység levezetési kötelezettsége: vegyünk egy konkrét elméleti állítást, soroljuk fel az összes feltételét, és ellenőrizzük azokat egy példán. A kiválasztott állítás a véges hipotézisosztály egyenletes korlátja, amelyet a 8.2. Véges hipotézisosztály egyenletes korlátja vezetett le a Hoeffding-koncentrációból és az uniókorlátból.
Tétel (véges egyenletes általánosítási korlátja, Hoeffding-alapú). Tegyük fel, hogy
Ekkor:
A bizonyítás két lépésből áll. (i) Egyetlen rögzített -ra a -be eső veszteségek független összegére alkalmazott Hoeffding-állítás [P27] adja . (ii) Az uniókorlát szerint . A egyenletet -ra megoldva kapjuk a tétel sávját. A teljes Hoeffding-bizonyítás nem része ennek a kéziratnak; a [P27] eredeti kiadói rekordja ellenőrzött, de a bizonyítás szövege nem lett olvasva. Az uniókorlátos levezetés saját, a 8.2. Véges hipotézisosztály egyenletes korlátja alfejezetben történt meg.
A tétel kimondásakor különösen fontos, mit nem állítunk: nem állítja, hogy a tanult kockázata alacsony; csak azt, hogy a kockázat nem haladja meg az empirikus értéket plusz a sávot, valószínűséggel. Ha , a korlát a értékre vonatkozik, ami használhatatlan lehet.
Feltétel-ellenőrzés a példán. Válasszuk a következő játékfeladatot. Legyen a bemenettér , a cél . A generáló : , és determinisztikus címke . A hipotézisosztály négy előre rögzített tengelyirányú küszöbszabály:
A feltételek ellenőrzése:
A valódi kockázatok ebben a modellben zárt alakban ismertek: , mert a generáló szabály; , mert mindenütt ellentmond; , mert és függetlenek, így a második koordináta előjele a címkétől független. Ez a tudás a szimulációban használható, valós adatnál viszont nem áll rendelkezésre; ezt a különbséget a laborban kifejezetten megőrizzük.
Kézi példa. Legyen , . A sáv:
A minta legyen:
| döntés | |||
|---|---|---|---|
A tétel garantálja, hogy minden -ra . A négy egyenlőtlenség ezen az egyetlen realizáción teljesül. Ez azonban nem a -os lefedettség bizonyítéka: a tétel valószínűségi állítás, egyetlen realizáció nem igazolja. A lefedettséget Monte Carlo szimulációval tudjuk empirikusan vizsgálni, amelyet a labor kódja tartalmaz.
Minimális kód a korlát és a lefedettség kiszámítására.
import numpy as np
def uniform_bound(n_h, m, delta):
return float(np.sqrt((np.log(n_h) + np.log(1.0 / delta)) / (2.0 * m)))
def simulate_coverage(n_sim=2000, m=64, delta=0.05, seed=123):
rng = np.random.default_rng(seed)
b = uniform_bound(4, m, delta)
true_risk = np.array([0.0, 1.0, 0.5, 0.5])
covered = 0
for _ in range(n_sim):
X = rng.uniform(-1.0, 1.0, size=(m, 2))
y = (X[:, 0] > 0).astype(np.float64)
pred = np.vstack([
X[:, 0] > 0,
X[:, 0] <= 0,
X[:, 1] > 0,
X[:, 1] <= 0,
])
err = (pred != y).mean(axis=1)
if np.all(true_risk <= err + b):
covered += 1
return covered / n_sim, bA uniform_bound(4, 64, 0.05) értéke
,
ami az induló becslésre adott válasz. A szimuláció a kockázatok
ismeretében számolja a lefedettséget; a várt érték legalább
.
A labor kis logisztikus regressziót tanít szintetikus 2D adaton. Szándékosan nem a GlyphLab-képeket használjuk, mert azok a CNN-részekben kerülnek elő; itt a cél a 7.4. Numerikus stabilitás és jelentésmegőrző implementáció alfejezetből ismert stabil BCE, a 4.4. I. ellenőrző pont: matematika és kód megfelelése gradiensellenőrzési elve és a 8.3. Kapacitás, regularizálás és modellválasztás független tesztelési protokoll összezárása.
Munkakönyvtár és futtatás. A fájl:
lab/n032/checkpoint_lab.py. Parancs:
python lab/n032/checkpoint_lab.pyA kód végig CPU-n fut, NumPy-val; nincs GPU- vagy keretrendszerfüggés.
import json
import numpy as np
SEED = 20261020
rng = np.random.default_rng(SEED)
def bce_logits_stable_f64(z, y):
"""z: (N,) logits, y: (N,) float cél {0,1}. Átlagos BCE, stabil."""
z = np.asarray(z, dtype=np.float64)
y = np.asarray(y, dtype=np.float64)
return float(np.mean(np.maximum(z, 0) - y * z + np.log1p(np.exp(-np.abs(z)))))
def make_data(n, rng):
X = rng.normal(0.0, 1.0, size=(n, 2)).astype(np.float32)
logit_p = (2.0 * X[:, 0] - X[:, 1]).astype(np.float32)
p = 1.0 / (1.0 + np.exp(-logit_p))
y = (rng.random(n) < p).astype(np.float32)
return X, yA tanítási lépés float32-ben, a 7.4. Numerikus stabilitás és jelentésmegőrző implementáció stabil BCE-formulát a kiértékelésnél float64-ben használjuk. A paramétergradiens a logitokra vett vektorból adódik; ez a 4.4. I. ellenőrző pont: matematika és kód megfelelése affin backward speciális esete logisztikus célra.
def train_one(X, y, lr, epochs, batch, lam):
n, d = X.shape
w = np.zeros(d, dtype=np.float32)
b = np.float32(0.0)
for _ in range(epochs):
idx = rng.permutation(n)
for start in range(0, n, batch):
bi = idx[start:start + batch]
Xb = X[bi].astype(np.float32)
yb = y[bi]
z = Xb @ w + b
p = 1.0 / (1.0 + np.exp(-z))
g = (p - yb) / len(bi)
gw = Xb.T @ g + lam * w
gb = np.sum(g)
w -= lr * gw
b -= lr * gb
return w, bA gradiensellenőrzés a 4.4. I. ellenőrző pont: matematika és kód megfelelése protokoll szerint: kis float64 batch, középső differencia, , stabil abszolút/relatív hibamérce.
def loss_and_grad(w, b, X, y, lam):
z = X @ w + b
p = 1.0 / (1.0 + np.exp(-z))
loss = bce_logits_stable_f64(z, y) + 0.5 * lam * float(w @ w)
g = (p - y) / len(y)
return loss, X.T @ g + lam * w, np.sum(g)
def grad_check(X8, y8, lam=1e-3):
w0 = rng.normal(0.0, 0.5, size=2)
b0 = np.float64(0.2)
_, gw, gb = loss_and_grad(w0, b0, X8, y8, lam)
max_abs = 0.0
for j in range(2):
wp, wm = w0.copy(), w0.copy()
wp[j] += 1e-6
wm[j] -= 1e-6
lp, _ = loss_and_grad(wp, b0, X8, y8, lam)[:2]
lm, _ = loss_and_grad(wm, b0, X8, y8, lam)[:2]
num = (lp - lm) / (2e-6)
max_abs = max(max_abs, abs(num - gw[j]))
bp, bm = b0 + 1e-6, b0 - 1e-6
num_b = (loss_and_grad(w0, bp, X8, y8, lam)[0]
- loss_and_grad(w0, bm, X8, y8, lam)[0]) / (2e-6)
max_abs = max(max_abs, abs(num_b - gb))
return float(max_abs)A kísérleti protokoll: train 1800, valid 200, test 2000 minta, egyetlen adatgeneráló seeddel. A validáción két learning rate közül választunk; a tesztet a kiválasztás után egyszer hívjuk meg.
def main():
n_train, n_val, n_test = 1800, 200, 2000
Xt, yt = make_data(n_train, rng)
Xv, yv = make_data(n_val, rng)
Xs, ys = make_data(n_test, rng)
# Baseline: a tanító címkearány mint konstans valószínűség
q = float(np.mean(yt))
base_ce = -float(np.mean(ys * np.log(q) + (1.0 - ys) * np.log(1.0 - q)))
base_acc = float(max(np.mean(ys), 1.0 - np.mean(ys)))
results = {}
for lr in (0.1, 0.5):
w, b = train_one(Xt, yt, lr=lr, epochs=50, batch=16, lam=1e-3)
zv = Xv.astype(np.float32) @ w + b
val_loss = bce_logits_stable_f64(zv, yv)
results[lr] = {"w": w, "b": b, "val_loss": val_loss}
best_lr = min(results, key=lambda k: results[k]["val_loss"])
w, b = results[best_lr]["w"], results[best_lr]["b"]
zs = Xs.astype(np.float32) @ w + b
test_ce = bce_logits_stable_f64(zs, ys)
test_acc = float(np.mean((zs > 0.0) == (ys > 0.0)))
X8 = Xt[:8].astype(np.float64)
y8 = yt[:8].astype(np.float64)
grad_err = grad_check(X8, y8)
cov, band = simulate_coverage(n_sim=2000, m=64, delta=0.05, seed=123)
manifest = {
"theorem": "finite_H_uniform_bound",
"assumptions_checked": [
"finite fixed H", "iid sample", "loss in [0,1]", "delta fixed"
],
"bound_band_m64_delta005": band,
"coverage_simulation_p2000": cov,
"baseline": {"ce": base_ce, "acc": base_acc},
"chosen_lr": best_lr,
"final_test": {"ce": test_ce, "acc": test_acc},
"grad_check_max_abs_err": grad_err,
"seed": SEED,
"device": "CPU",
"dtype": "float32 training, float64 checks",
}
with open("lab/n032/evidence.json", "w", encoding="utf-8") as fh:
json.dump(manifest, fh, indent=2)
print(json.dumps(manifest, indent=2))A kódból számolt, jelölt szemléltető kimenet — ezt a generátor nem futtatta, a tényleges futást a bizonyítékjegyzékbe kell írni:
{
"bound_band_m64_delta005": 0.185,
"coverage_simulation_p2000": 0.97,
"baseline": {"ce": 0.69, "acc": 0.62},
"chosen_lr": 0.1,
"final_test": {"ce": 0.41, "acc": 0.83},
"grad_check_max_abs_err": 2.1e-09
}Értelmezés. A lefedettség egyetlen szimulációs becslés, ismétlésből; a binomiális szórás körülbelül , tehát az érték összhangban van az elméleti korláttal. Ez empirikus, nem bizonyítás. A teszt BCE a baseline -hez képest; ez a konkrét adatgenerálóra vonatkozó, egyszer mért eredmény, nem általános modellképesség-állítás. A tesztet a validációs választás lezárása után egyszer értékeltük, tehát a 8.3. Kapacitás, regularizálás és modellválasztás adaptivitási tilalma teljesül.
F1 (fogalmi, nehézség 1, előfeltétel: 8.1. Kockázat, mintavétel és baseline). Definiálja a kockázat és az empirikus kockázat különbségét. Adjon konkrét elrendezést, amelyben , de . Átadandó: definíciók és egy leírt konstrukció a kockázatértékek indoklásával.
F2 (levezetési, nehézség 1, előfeltétel: 8.2. Véges hipotézisosztály egyenletes korlátja). Legyen , , . Számítsa ki a véges korlát sávját, és mondja ki a garantált állítást szövegesen. Átadandó: a sáv numerikus értéke és az állítás pontos megfogalmazása.
F3 (implementációs, nehézség 1, előfeltétel: 7.4. Numerikus stabilitás és jelentésmegőrző
implementáció). Írjon bce_logits_stable(z, y)
függvényt, és ellenőrizze a
és
pontokon. Hasonlítsa össze a naiv
-alapú
formulával. Átadandó: kód és a négy kimenet magyarázattal.
F4 (hibakeresési, nehézség 2, előfeltétel: 8.3. Kapacitás, regularizálás és modellválasztás). Egy hallgató 20 tanulási rátát próbál ki a validációs halmazon, a legjobb modellt a tesztre értékeli, majd a kapott tesztpontosságot „a modell várható pontosságának bizonyítékaként” írja a jelentésbe. Melyik állítás hibás, mi a torzítás iránya, és mi a helyes protokoll? Átadandó: a hiba lokalizálása, a torzítás iránya indoklással és a javított eljárás.
F5 (kísérlettervezési, nehézség 3, előfeltétel: 8.2. Véges hipotézisosztály egyenletes korlátja és 8.3. Kapacitás, regularizálás és modellválasztás). Tervezze meg a lefedettségi szimuláció teljes protokollját a fenti négy hipotézisre: mi a generáló eloszlás, a minta mérete, az ismétlésszám, a mért metrika, a várható kimenet és a következtetési határ? Átadandó: protokoll leírása, a standard hiba képlete és az érvényességi korlát kimondása.
F1. A a teljes eloszlás feletti várható veszteség; a elemű tanítóminta átlaga. Az előbbi nem számolható ismeretlen mellett, az utóbbi igen. Konstrukció: a fenti , , és a hipotézis. Ekkor , mert és függetlenek. Egy elemű realizáción azonban lehetséges, hogy minden -re , így . Az esemény valószínűsége , de pozitív; a feladat csak a konstrukciót kéri, nem a konkrét mintát.
F2. A sáv:
A garantált állítás: legalább valószínűséggel minden -ra . Alakellenőrzés: a logaritmusok dimenziómentesek, a nevező mintaméret, a gyök dimenziómentes, ami a kockázat dimenziójával egyezik. Szélsőeset: mellett a sáv nullához tart, ami azt fejezi ki, hogy nagyobb minta mellett az empirikus kockázat jobban koncentrál.
F3. A megoldás a stabil formula:
import numpy as np
def bce_logits_stable(z, y):
z = np.asarray(z, dtype=np.float64)
y = np.asarray(y, dtype=np.float64)
return np.maximum(z, 0) - y * z + np.log1p(np.exp(-np.abs(z)))Az ellenőrzés:
for z, y in [(1000.0, 0.0), (-1000.0, 1.0)]:
print(z, y, bce_logits_stable(z, y))A
esetben a stabil formula
,
ami a matematikai érték; a naiv
az
kerekítés miatt inf-et ad. A
esetben a stabil érték
?
Számoljunk pontosan:
,
:
,
,
,
az eredmény
.
A BCE matematikai értéke
;
a naiv
a
kerekítés miatt -inf-et ad. Mindkét ponton a stabil formula
véges és helyes; tolerancia: a
tag
nagyságrendű, f64-ben a
mellett elhanyagolható.
F4. A hibás állítás a tesztpontosság értelmezése. A validáció adaptív használata után a kiválasztott modell validációs és tesztpontossága felfelé torzított becslése a várható pontosságnak, mert a maximum művelet a legjobb pillanatnyi teljesítményt választja; a 8.3. Kapacitás, regularizálás és modellválasztás ellenpéldájában próba várható maximumot adott valós képesség mellett. A torzítás iránya felfelé. A helyes protokoll: a keresést a tanító/validációs halmazon zárjuk le, a tesztet a kiválasztott végleges modellen egyszer értékeljük, és a teszt eredményét külön jelöljük, vagy beágyazott keresztvalidációval becsüljük a modellválasztási folyamat egészének általánosítási hibáját.
F5. Protokoll: rögzítsük a generáló eloszlást (, ), a négyelemű osztályt, az mintaméretet és a konfidenciaszintet. Ismételjünk -szer: generáljunk iid mintát, számítsuk ki minden -ra az empirikus hibát és a -sávot, ellenőrizzük az egyenlőtlenséget. A mért metrika a lefedettség, a sikeres realizációk aránya. A binomiális standard hiba , mellett , tehát a alsó korlátot a becsült SE is meghaladja. A következtetési határ: a szimuláció a tétel feltételeinek teljesülése mellett a lefedettség empirikus ellenőrzése, de nem a tétel bizonyítása; a tétel a Hoeffding-állításon és az uniókorláton nyugszik, nem a szimuláción.
Tipikus tévedés és ellenpélda. „Az én futásomban a tanítóhiba , a tesztpontosság ; ez bizonyítja, hogy a modell általánosan pontosságú.” Ez az állítás három helyen sérülhet. Egyetlen futás nem valószínűségi garancia; a tesztpontosság becslés, a saját mintavételi bizonytalanságával; és ha a modellt a teszt alapján választottuk, a becslés torzított. Elvi ellenpélda: a fenti hipotézis ponton eséllyel nulla empirikus hibát ér el, miközben valódi kockázata . Egy ilyen szerencsés futás naplózott sikere ugyanolyan adat, mint a többi, de nem cáfolja a kockázatot.
Rövid önellenőrzés. Tegyük fel, hogy a hallgató a tesztet ötször futtatja, és a legjobb eredményt jelenti. A jelentés melyik szava lesz hibás: „pontosság” vagy „becslés”? A válasz: mindkettő, ha a validáció fogalmát a tesztre alkalmazta; a teszt ekkor validációs halmazzá vált, és a torzítatlan független teszt feltétele megszűnt.
Korábbi fogalom visszahívása. A 7.4. Numerikus stabilitás és jelentésmegőrző
implementáció alfejezetben a stabil
-t
a
azonossággal számoltuk; ez tért vissza a labor BCE-értékében. A 4.4. I. ellenőrző pont: matematika és kód
megfelelése alfejezetben a középső differenciás ellenőrzés abszolút
hibáját használtuk nullközeli gradiensekhez; ezt a labor
grad_check függvénye örökölte. A 8.3.
Kapacitás, regularizálás és modellválasztás alfejezetben a
beágyazott választás felfelé torzító hatását mutattuk meg; ez az F4
feladat háttere.
A tanulási állítás teljes lánca: a eloszlásból vett iid minta adja az empirikus kockázatot, a célfüggvény a kockázat és a regularizáló tag összege, a gradiens a frissítés irányát adja, a sztochasztikus minibatch frissítés pedig a cél közelítését. A véges korlát megadja azt a sávot, amelyen belül a kockázat az empirikus érték felett marad valószínűséggel, feltéve, hogy az osztály előre rögzített, a minta iid, a veszteség -be esik. A korlát nem garantál alacsony kockázatot, és egyetlen sikeres futás sem bizonyít tételt. A független teszt a keresés lezárása után egyszer mér, és a becslés torzítatlansága a függetlenségen múlik.
A következő egység 9.1. Neuron és perceptron a perceptront és a neuront vezeti be; ott a kockázatminimalizálás kerete először kap konkrét paraméteres modellt és tanulási szabályt.