35.4 Korlátok, eredet és döntési felelősség

35.4.1 Cél, előismeret és induló kérdés

A 35.2. Magyarázat sanity check egységben a paraméter- és címkerandomizálás megmutatta, hogy egy Grad-CAM vagy saliency hőtérkép önmagában nem bizonyítja a modell mechanizmusát. Ebben az alfejezetben a kérdést kiterjesztjük: mely feltételek mellett szabad a tanított modell kimenetét valódi döntésben felhasználni? A cél annak a három fogalomnak a pontos elválasztása, amelyet a mérnöki gyakorlat gyakran összemos: a mért benchmarkpontosság, a felhasználási körre vonatkozó állítás és a döntési felelősség.

Induló becslés: egy csapat a GlyphLab clean tesztjén 98%-os osztályozási pontosságot mér. Jogos-e ebből azt állítani, hogy a modell egy valódi beléptetési terminálban is 98%-ban jól dönt? A válasz a becslés szerint igen, a valóságban nem. A fejezet ezt a különbséget teszi operatívvá.

35.4.2 Definíciók: modellkártya, adathatár, privacy, licenc, nagy tét és emberi felülvizsgálat

Legyen f:𝒳→𝒴f:\mathcal X\to\mathcal Y a tanított modell. A leggyakoribb hiba az, hogy az accD(f)\mathrm{acc}_D(f) mérőszámot a DD adathalmazt leíró eloszlástól elszakítjuk. Az alábbi fogalmak mind a DD-t és a felhasználást rögzítik.

Felhasználási kör (use context). Az ötös (A,𝒳,𝒴,δ,C)(A,\mathcal X,\mathcal Y,\delta,C), ahol AA az automatizált döntés leírása, 𝒳\mathcal X a bemenet, 𝒴\mathcal Y a kimenet, δ\delta a rendszer által a kimenetre végrehajtott beavatkozás, CC pedig a hibás döntés következménye. A GlyphLab tanulási környezetben például AA = „orientációfelismerés gyakorlófeladat”, δ\delta = „naplóbejegyzés”, CC = „gyakorlópontvesztés”. Ugyanaz a modell más δ\delta mellett más felhasználási kör, és más validációt igényel.

Modellkártya (model card). Strukturált, verziózott dokumentum, amely legalább a következőket rögzíti: rendeltetés és felhasználási kör; bemeneti specifikáció (alak, dtype, intenzitástartomány, kamerafeltétel); kimeneti specifikáció és a kimenetből képzett döntési szabály; tanító/validáló/teszt adat eredete, splitprotokollja és jelenetszintű csoportosítása; mért metrikák a szeletbontásokkal; ismert korlátok és tiltott felhasználások; a súly- és kódváltozat lenyomata; karbantartási és újravalidálási feltétel.

Adathatár (data boundary). Az a 𝒟⊂𝒳\mathcal D\subset \mathcal X eloszlás, illetve eloszláscsalád, amelyre az empirikus teljesítmény állítást igazoltuk. Formálisan: ha a teszt D={(xi,yi)}D=\{(x_i,y_i)\} a P𝒟P_{\mathcal D} eloszlásból származik, akkor accD(f)\mathrm{acc}_D(f) a P𝒟P_{\mathcal D}-re vonatkozó becslés. A P𝒟P_{\mathcal D}-n kívüli pontokra semmilyen numerikus garanciát nem ad a teszt. A GlyphLab esetében 𝒟\mathcal D a 24×24, egy csatornás, [0,1][0,1]-intenzitású szintetikus alakzatképek eloszlása, osztályonként kiegyensúlyozott mintavétellel.

Privacy és licenc. A privacy az adatvédelmi követelmények gyűjtőneve: milyen azonosítót tárol a rendszer, meddig, kinek van hozzáférése, mi a törlési út. Az adatminimalizálás a privacy egyik implementációja: csak a célhoz szükséges legkisebb felbontást, legrövidebb megőrzést és legkevesebb azonosítót használjuk. A licenc ezzel szemben jogi felhasználási engedély: a tanítóadat, a kód és a mentett súly licencét külön kell nyilvántartani, mert ezek eltérő jogi státuszúak.

Nagy tétű alkalmazás (high-stakes). Olyan döntés, amelyben a modell hibája alapjogot, egészséget, szabadságot, biztonságot vagy jelentős vagyoni érdeket érint. A gyakorlati határjelölés az CC következmény függvénye: ha a hiba visszafordíthatatlan vagy személyre szóló, az alkalmazás nagy tétű.

Emberi felülvizsgálat (human review). Olyan folyamat, amelyben a modell kimenetét egy emberi döntéshozó előre rögzített szabály szerint felülvizsgálhatja. A felülvizsgálat maga is mérendő folyamat: ugyanúgy van saját accuracy-ja, késleltetése és döntési torzítása, mint a modellnek. A „van ember a hurokban” önmagában nem bizonyíték, csak akkor, ha a felülvizsgálati pontosságot és a beavatkozási arányt mértük.

35.4.3 A benchmarkeredményből nem következik az új eloszláson mért teljesítmény: formális ellenpélda

A levezetési kötelezettség egy cáfolat: megmutatjuk, hogy két modell azonos clean tesztpontossága nem határozza meg a shift utáni pontosságukat. Az állítás, amelyet cáfolunk, a következő.

Téves állítás. Legyen DD teszt és TT egy labelmegőrző transzformáció. Ha accD(f1)=accD(f2)\mathrm{acc}_D(f_1)=\mathrm{acc}_D(f_2), akkor accT(D)(f1)=accT(D)(f2)\mathrm{acc}_{T(D)}(f_1)=\mathrm{acc}_{T(D)}(f_2) is teljesül.

Ellenpélda. Legyen a bemenet 𝒳={0,1}1×2×2\mathcal X=\{0,1\}^{1\times2\times2}, azaz egy csatornás, 2×2-es bináris kép; a cél 𝒴={0,1}\mathcal Y=\{0,1\}, ahol 0 a függőleges, 1 a vízszintes osztály. A teszt két eleme

x(1)=(1010),y(1)=0,x(2)=(0011),y(2)=1. x^{(1)}=\begin{pmatrix}1&0\\1&0\end{pmatrix},\quad y^{(1)}=0, \qquad x^{(2)}=\begin{pmatrix}0&0\\1&1\end{pmatrix},\quad y^{(2)}=1.

Minden xx képre legyen s(x)=∑i(ai0−ai1)s(x)=\sum_i(a_{i0}-a_{i1}), ahol aija_{ij} a 2×2 mátrix eleme. Két modellt definiálunk:

f1(x)=0 ha |s(x)|>0, különben 1,f2(x)=0 ha s(x)>0, különben 1. f_1(x)=0 \text{ ha } |s(x)|>0,\text{ különben }1, \qquad f_2(x)=0 \text{ ha } s(x)>0,\text{ különben }1.

A clean teszt levezetése:

Így accD(f1)=accD(f2)=1\mathrm{acc}_D(f_1)=\mathrm{acc}_D(f_2)=1. Legyen T(x)=1−xT(x)=1-x elemenként, az intenzitásinverzió. A geometriai orientáció nem változik, tehát TT labelmegőrző ebben a példában. A shiftelt képek:

T(x(1))=(0101),T(x(2))=(1100). T(x^{(1)})=\begin{pmatrix}0&1\\0&1\end{pmatrix},\quad T(x^{(2)})=\begin{pmatrix}1&1\\0&0\end{pmatrix}.

A T(x(1))T(x^{(1)}) képre s=0−1+0−1=−2s=0-1+0-1=-2, ezért |s|=2>0|s|=2>0, így f1=0f_1=0 (helyes), de s≯0s\not>0, ezért f2=1f_2=1 (hiba). A T(x(2))T(x^{(2)}) képre s=0s=0, így mindkét modell 11-et ad (helyes). Tehát accT(D)(f1)=1\mathrm{acc}_{T(D)}(f_1)=1, míg accT(D)(f2)=0.5\mathrm{acc}_{T(D)}(f_2)=0.5. Az azonos clean pontosság ellenére a shiftelt pontosságok eltérnek, a téves állítás cáfolva.

A cáfolat módszertani tanulsága: a clean teszt pontossága csak a P𝒟P_{\mathcal D} eloszlásra vonatkozó becslés. A TT shift új eloszlást definiál; annak méréséhez új, előre rögzített teszt és új metrika kell. A GlyphLab saját corrupt tesztje is ilyen: a fényességgradiens és a hozzáadott zaj egyetlen konkrét shiftosztály, nem a „valós világ” reprezentánsa.

35.4.4 Kézi példa ellenőrzése minimális kóddal

A következő kód a fenti 2×2-es példát reprodukálja, független implementációként. A kimenet a képletből számított, nem mért futás.

# labs/n140/line_shift_counterexample.py
# Munkakönyvtár: project/labs/n140/
import numpy as np

def pred_f1(a):
    s = float(a[0,0] + a[1,0] - a[0,1] - a[1,1])
    return 0 if abs(s) > 0 else 1

def pred_f2(a):
    s = float(a[0,0] + a[1,0] - a[0,1] - a[1,1])
    return 0 if s > 0 else 1

x1 = np.array([[1, 0], [1, 0]], dtype=np.float64)
x2 = np.array([[0, 0], [1, 1]], dtype=np.float64)
D = [(x1, 0), (x2, 1)]
T = lambda x: 1.0 - x

for name, f in [("f1", pred_f1), ("f2", pred_f2)]:
    acc_clean = np.mean([f(x) == y for x, y in D])
    acc_shift = np.mean([f(T(x)) == y for x, y in D])
    print(name, "clean=", acc_clean, "shift=", acc_shift)

Várt, számított kimenet:

f1 clean= 1.0 shift= 1.0
f2 clean= 1.0 shift= 0.5

A dtype float64, a device a CPU, seed nincs, mert a számítás determinisztikus. Az alakellenőrzés: mindkét kép 2×2, az egy csatornás 1×2×2 tensorból a csatornaindexet elhagytuk, ez a példában jelölt konvenció.

35.4.5 Labor: korlátjegyzék és adatminimalizálási terv a PageTurn fiktív alkalmazáshoz

Az alkalmazás PageTurn: fiktív szolgáltatás, amely beszkennelt formanyomtatványok oldalait automatikusan elforgatja. A modell a GlyphLab tanuló CNN, 24×24 grayscale bemenettel. A labor célja nem a modell leszállítása, hanem két dokumentum előállítása, mielőtt bármilyen valós használatba kerülne. A PageTurn nem klinikai, jogi vagy személyazonosító alkalmazás; erről a korlátjegyzékben explicit tiltó mondat szerepel.

Korlátjegyzék, 1. vázlat.

  1. Bemeneti adathatár: a modell 24×24, egy csatornás, float32, [0,1][0,1]-intenzitású, szintetikus alakzatképekre validált. A PageTurn 300 dpi szkennelt, szöveges, színes oldalakat adna; ez kívül esik a határon, amíg külön kísérlet nem méri.
  2. Osztályprior: a tanítás 1/3–1/3–1/3 arányú. A valós forgalmi eloszlás ismeretlen; a balanced accuracy nem vihető át.
  3. Korrupciós határ: a GlyphLab corrupt tesztje zaj és fényességgradiens. A scanner elmosás, ferde világítás, részleges takarás más shift, ezért újra kell mérni.
  4. Geometriai szimmetria: a modell nem 90°-forgás-invariáns; a diagonal osztály csak az egyik ferde irányt tartalmazza. A forgatott bemenet címkéje nem ugyanaz.
  5. Konfidenciaértelmezés: a softmax kimenet nem kalibrált valószínűség garancia; küszöbalapú döntési szabály validálása külön feladat.
  6. Származás: a súly a labor saját checkpointja; a state_dict SHA-256 lenyomata és a training recept verziója a modellkártya része.
  7. Nagy tétű tiltás: nem használható személyazonosításra, klinikai, jogi vagy pénzügyi döntéshozatalra; a PageTurn kimenete csak tájékoztató javaslat, a végső elfogadás emberi.

Adatminimalizálási terv, 1. vázlat.

  1. A kliens oldal a beolvasott oldalt 64×64-es grayscale, simított, float32 képpé alakítja; az eredeti felbontású kép nem hagyja el a kliens gépet.
  2. A szolgáltatás csak a döntést (0/1/2) és a logit hármasát tárolja, 30 napig; a kép törlődik a válasz után.
  3. A munkamenet azonosítója véletlen UUID; a képhez személyes azonosító nem kapcsolódik.
  4. A valós PageTurn képek nem használhatók tanításra, amíg nincs célhoz kötött adatkezelési tájékoztató és törlési út.

A korlátjegyzék accuracy-bontásának ellenőrzésére szolgáló sablon, feltételezett pilotértékekkel; a kimenet számított, nem mért:

# labs/n140/page_turn_limit_check.py
import numpy as np

preds = np.array([0, 0, 1, 1, 2, 2, 0, 1], dtype=np.int64)
labels = np.array([0, 0, 1, 0, 2, 2, 0, 1], dtype=np.int64)
split_ids = np.array(["clean", "clean", "clean", "clean",
                      "corrupt", "corrupt", "corrupt", "corrupt"], dtype=str)

def report_by_split(preds, labels, split_ids, class_names):
    out = {}
    for split in np.unique(split_ids):
        m = split_ids == split
        out[str(split)] = {
            "n": int(m.sum()),
            "accuracy": float(np.mean(preds[m] == labels[m])),
            "class": {
                class_names[c]: float(np.mean(preds[m & (labels == c)] == labels[m & (labels == c)]))
                for c in sorted(set(labels[m].tolist()))
                if (m & (labels == c)).sum() > 0
            }
        }
    return out

print(report_by_split(preds, labels, split_ids,
                      {0: "vertical", 1: "horizontal", 2: "diagonal"}))

Számított kimenet: clean n=4, accuracy=0.75, osztálybontás vertical=0.6667, horizontal=1.0; corrupt n=4, accuracy=1.0. Az ellenőrzés: a clean súlyozott osztálypontosság (3⋅0.6667+1⋅1.0)/4=0.75(3\cdot0.6667+1\cdot1.0)/4=0.75, ami megegyezik az összesített értékkel. A futás parancsa a fenti könyvtárból python page_turn_limit_check.py. A kimenetet nem szabad éles eredménynek nevezni, mert a predikciók feltételezett értékek.

35.4.6 Feladatok

F1 – fogalmi, nehézség 1. Adja meg a data boundary definícióját, majd két konkrét példát arra, ahogyan a PageTurn megsértené, ha a GlyphLab 98%-os clean tesztpontosságát változatlanul átmásolná a modellkártyájába. Átadandó: definíció és két, a labor 1. és 3. pontjától különböző sértés.

F2 – levezetési, nehézség 2. Az alfejezet 2×2-es példájának mintájára konstruáljon egy új (f3,f4)(f_3,f_4) modellpárt és egy új labelmegőrző transzformációt, amelyre a clean tesztpontosságok egyenlők, a shift utáni pontosságok viszont eltérnek. Adja meg a képeket, a szabályokat és a pontosságokat. Átadandó: teljes levezetés, a cáfolt állítás kimondása.

F3 – implementációs, nehézség 2. Írjon teljes Python függvényt, amely a GlyphLab teszt predikcióiból clean/corrupt és osztályonkénti accuracy-t számol a metadata split oszlopa alapján; a corrupt teszt a clean teszt képeinek ugyanabban a sorrendben vett változata. A függvény inputja preds, labels, split_ids, mind numpy tömb; a kimenet a fenti laborformátumú dict. Ellenőrizze a függvényt a 2×2-es mini példán. Átadandó: kód, dtype-ok, egy kiszámított ellenőrző eset.

F4 – hibakeresési, nehézség 1. Az alábbi indoklás hibás: „A modell clean teszt accuracy-ja 0.99, ezért a valós dokumentumokon is 0.99 pontossággal működik, és az emberi felülvizsgálatra nincs szükség.” Azonosítsa a három elkülönült hibát, és írja át az állítást korrekt formába. Átadandó: három megnevezett hiba és a javított állítás.

F5 – kísérlettervezési/transzfer, nehézség 3. Tervezzen emberi felülvizsgálati protokollt a PageTurn számára: milyen döntési szabály mellett kér a rendszer emberi jóváhagyást, milyen metrikákat mér a pilotban, mekkora a pilot, és mi a kontroll. Rögzítse a következtetési határt. Átadandó: protokoll, baseline, metrikák, érvényességi korlát.

35.4.7 Megoldások és indoklás

F1. A data boundary az az 𝒟\mathcal D eloszláscsalád, amelyre az empirikus teszt replikálható mintavételi eljárással mér; a 0.98 becslés csak P𝒟P_{\mathcal D}-re érvényes. Két sértés a PageTurnben: (a) színes, 300 dpi oldalakat fogad, de a modell egy csatornás, 24×24 alakzatokra tanult; az upscaling és a színcsatorna-eldobás új eloszlást ad. (b) A valós oldalakon aláírás, pecsét és részleges kitakarás jelenik meg, amelyek a GlyphLab generátorban nem szerepelnek, tehát a szintetikus alakzatok eloszlásán kívül esnek.

F2. Legyen DD ugyanaz a két kép, mint a leckében. Definiáljuk

f3(x)=0 ha az (a00,a10) és (a01,a11) oszloppárok homogének, különben 1, f_3(x)=0 \text{ ha az } (a_{00},a_{10}) \text{ és } (a_{01},a_{11}) \text{ oszloppárok homogének, különben }1,

f4(x)=0 ha s(x)>0, különben 1. f_4(x)=0 \text{ ha } s(x)>0,\text{ különben }1.

A DD-n f3f_3 és f4f_4 is 100%-ot ér el: x(1)x^{(1)} oszlopai homogének, f3=0f_3=0; x(1)x^{(1)}-nél s=2>0s=2>0, f4=0f_4=0. x(2)x^{(2)} oszlopai nem homogének, f3=1f_3=1; x(2)x^{(2)}-nél s=0s=0, f4=1f_4=1. Legyen TT a függőleges tükrözés, az oszlopok felcserélése. Ez labelmegőrző e két képre. A tükrözés az oszlopok homogenitását megtartja, ezért f3f_3 pontossága T(D)T(D)-n is 100%. A T(x(1))T(x^{(1)}) képre s=−2s=-2, ezért f4f_4 1-et ad a 0 címke helyett, hiba; T(x(2))T(x^{(2)}) képre s=0s=0, helyes. Így f4f_4 pontossága 50%. Az azonos clean 100% nem határozza meg a shift pontosságot.

F3. A kód:

# labs/n140/report_by_split.py
# Munkakönyvtár: project/labs/n140/
import numpy as np

def report_by_split(preds, labels, split_ids, class_names):
    assert preds.shape == labels.shape == split_ids.shape
    assert preds.dtype in (np.int64, np.int32)
    out = {}
    for split in np.unique(split_ids):
        m = split_ids == split
        out[str(split)] = {
            "n": int(m.sum()),
            "accuracy": float(np.mean(preds[m] == labels[m])),
            "class": {}
        }
        for c in sorted(set(labels[m].tolist())):
            mm = m & (labels == c)
            if mm.sum() > 0:
                out[str(split)]["class"][class_names[c]] = float(
                    np.mean(preds[mm] == labels[mm]))
    return out

# Ellenőrzés a mini példán:
preds = np.array([0, 0, 1, 0, 1, 0], dtype=np.int64)
labels = np.array([0, 0, 1, 1, 1, 1], dtype=np.int64)
split_ids = np.array(["clean", "clean", "clean",
                      "corrupt", "corrupt", "corrupt"], dtype=str)
print(report_by_split(preds, labels, split_ids,
                      {0: "vertical", 1: "horizontal"}))

Számított kimenet: clean accuracy 2/3=0.66672/3=0.6667, corrupt accuracy 1/3=0.33331/3=0.3333, a class-bontások konzisztensek. A függvény a GlyphLab esetén a preds tömböt a befagyasztott modell 60 tesztképre adott predikcióiból kapja, split_ids a metadata.csv split oszlopának a teszt soraira vett értéke; a corrupt teszt ugyanezt a split_ids tömböt használja, mert a corrupt képek ugyanabban a sorrendben a clean teszt páros változatai.

F4. A három hiba: (1) a benchmark eloszlásból következtet a valós eloszlásra, ez az adathatár figyelmen kívül hagyása; (2) a 0.99 pontosság kiegyensúlyozott teszten mért, a valós osztályarány ismeretlen vagy ritka esemény; (3) az emberi felülvizsgálat szükségességét a pontosság nem szünteti meg, mert a hiba következménye a felhasználási körben más. Javított állítás: „A modell 0.99 accuracy-t ért el a GlyphLab clean tesztjén, amely 24×24 szintetikus, kiegyensúlyozott alakzatképekből áll; ezért ettől eltérő kamerafeltételre vagy osztályarányra az állítást nem terjesztjük ki. A PageTurn bevezetéséhez külön, előre rögzített pilot méri a valós eloszláson a pontosságot és az emberi felülvizsgálati arányt.”

F5. Egy lehetséges terv. Döntési szabály: a PageTurn csak akkor forgat automatikusan, ha a softmax legnagyobb logitja és a második legnagyobb logitja közti különbség nagyobb, mint 2.02.0; minden más esetben a rendszer kijelölt emberi felülvizsgálóhoz irányítja az oldalt. Pilot: 200 független, emberileg annotált oldal, amelyek nem vettek részt a küszöb választásában. Baseline: automatikus forgatás nélküli manuális döntés pontossága; a metrika a forgatási accuracy, a felülvizsgálati arány és az emberi felülvizsgálat saját accuracy-ja. A kontroll: ugyanaz a 200 oldal a modell nélküli, vak jelölésben. A következtetési határ: a pilot eredménye csak az adott scannerre, dokumentumtípusra és osztályeloszlásra érvényes; új intézmény vagy formanyomtatvány új pilotot igényel.

Alak- és szélsőeset-ellenőrzés az F3-hoz: üres osztály esetén a ciklus kihagyja a cellát, a dict nem tartalmaz hamis nullát; a split_ids dtype str, a preds int64, így a címkeegyezés logikai tömbbé alakul. A labor toleranciája: a kimenet float64, az ellenőrzésnél az összegzés kerekítési hibája 10−1210^{-12} alatt marad, mert a darabszámok kis egész értékek.

35.4.8 Tipikus tévedés, önellenőrzés és visszahívás

A gyakori tévedés pontosan a szintetikus benchmark összekeverése a valós alkalmazással. Ellenpélda a prevalencia-csapda: ha egy beléptető rendszerben a valódi „érvényes token” aránya p=0.01p=0.01, akkor a mindig-érvényes osztályozó accuracy-ja 1−p=0.991-p=0.99. Ezzel a baseline-nal a kiegyensúlyozott GlyphLab 0.98-as érték nem bizonyít védelmi képességet; a releváns metrika a sensitivity/specificity és a következménymátrix. A második ellenpélda a licenchez kötődik: egy letöltött súly 0.99-as publikus benchmarkeredménye nem ad jogot a súly kereskedelmi felhasználására, és nem is igazolja a saját kameraeloszlásra. A [P25] sanity check arra emlékeztet, hogy a magyarázat sem pótolja a modellfüggőség ellenőrzését; a [P23] Grad-CAM lokalizációja nem ok-okozati bizonyíték; a [D21] FGSM-példa pedig oktatási demonstráció, nem éles biztonsági határ.

Önellenőrző kérdések: Meg nevezi-e a modellkártya a bemeneti alakot és intenzitástartományt? A split jelenetszintű-e, és a corrupt teszt ugyanazon párokat használja-e? A valós alkalmazás osztályaránya mért vagy feltételezett? A súly SHA-256-ja és licence a mentési verzióhoz kötött-e? Mit mér az emberi felülvizsgálat? Visszahívás: 23.4. Hibaszeletek és alkalmazási határ megmutatta, hogy az összesített accuracy a szeletbontás nélkül elfedi a koncentrált hibát; 35.2. Magyarázat sanity check pedig azt, hogy a paraméterrandomizálás kontrollja nélkül a hőtérkép nem igazol modellfüggést.

35.4.9 Rövid összefoglaló

A felhasználási kör, az adathatár és a származás a teljesítményállítás része: a clean teszt accuracy csak a rögzített szintetikus eloszlásra értelmezhető. A 2×2 példa két modellje azonos clean pontosság mellett intenzitásinverzió után 100% és 50% pontosságú volt, tehát a benchmarkeredményből nem következik a shift alatti viselkedés. A modellkártya rögzíti a bemeneti specifikációt, a korrupciós határt, a licencet és az emberi felülvizsgálat feltételeit. Az adatminimalizálás a privacy-kockázatot csökkenti, de nem bizonyítja a klinikai vagy jogi alkalmasságot. Ritka eseményes környezetben a kiegyensúlyozott accuracy félrevezető, ezért a baseline és a következménymátrix kötelező.

35.4.10 Következő alkalmazás

A 36.1. Állításból kísérleti terv egységben a dokumentált korlátokból kísérleti tervet készítünk: az itt rögzített adathatár és modellkártya-mezők lesznek a kísérleti hipotézis, a mérőszám és a kiértékelési protokoll forrásai.

35.4.11 Felhasznált források