Neural networks — the working minimum
Explanation
Magyarázat
Hajdu Csaba, 2026
Neural networks — the working minimum
Mit csinál egy neuron, miért kell nemlinearitás, hogyan tanul a háló, és mikor NEM éri meg használni.
Hajdu Csaba, 2026
The semester
Egy súlyozott összeg, és ami belőle következik
Üdv. Ez a modul a neurális hálókról szól, és rögtön az elején elmondom, mit NEM fogunk csinálni: nem fogunk keretrendszert tanulni, és nem lesz benne egyetlen olyan sor sem, hogy „a modell megtanulja”. Azt fogjuk megnézni, mi történik odabent — negyven sor numpyban, amit át tudsz írni. A fekete doboz onnantól nem fekete, hogy egyszer láttad a belsejét.
Súlyozott összeg, eltolás, nemlineáris függvény. A tanulás a w és a b beállítása.
Az f nélkül ez közönséges lineáris regresszió. Az f-től lesz belőle valami más — és a következő blokkban meg is mérjük, mennyivel más.
Geometriailag a súlyok egy egyenes (több bemenetnél: egy sík) irányát adják meg, az eltolás pedig a helyét. Ezért mondjuk, hogy egy neuron egyetlen egyenest tud meghúzni.
Az ábra betöltése…
És itt a mérés, négy képben. A felső sorban a feladat egyenessel szétválasztható: a neuron kilencvenkilenc egész két százalékot ér el három paraméterrel. Az alsó sorban nem szétválasztható — ez a klasszikus XOR, agrár ruhában: a betegség akkor jelenik meg, ha meleg VAN és nedves VAN, vagy ha hideg van és száraz. Nézd meg a bal alsó képet. A neuron ötvenhat egész három százalékon áll, vagyis a véletlen találgatás szintjén. Nincs olyan egyenes, ami ezt kettévágja.
A jobb felső kép a legtanulságosabb, és könnyű átsiklani fölötte: a KÖNNYŰ feladaton a nyolcneuronos háló 97,2 százalékot ad a neuron 99,2 százaléka helyett. Tizenegyszer annyi paraméterért valamivel rosszabbat. Ahol egy egyenes elég, ott a háló nem hoz semmit, csak szórást.
A cella betöltése…
Itt a cella. A csavar a lépésszám: állítsd kétezerre. A kérdés a lehető legélesebb: megtanulja-e valaha az egyetlen neuron a XOR-t? A válasz nem, és nem is a lépésszámon múlik — nincs olyan egyenes, ami azt a négy pontot helyesen kettévágja. Ezt érdemes egyszer a saját szemeddel látni, mert utána nem kell elhinni.
A jobb felső eset a legtanulságosabb: a KÖNNYŰ feladaton a nyolcneuronos háló 97,2 százalékot ad az egy neuron 99,2 százaléka helyett. Ahol egy egyenes elég, ott a háló nem hoz semmit, csak szórást.
Az `nn-neuron` demó mérése: 600 megfigyelés, 600 tanítási lépés.
Ugyanaz a négy szám oszlopokban, mert így látszik a szerkezet. A szétválasztható feladaton a két oszlop majdnem egyforma — a háló nem segít. A nem szétválaszthatón viszont negyven egész nyolc százalékpont a különbség. Ez a modul első tanulsága, és egyben a 8. hét modellcsalád-létrájának a folytatása: nem az a kérdés, melyik modell erősebb, hanem hogy a feladatnak szüksége van-e rá.
Az 56,3 százalék nem „gyenge eredmény”, hanem a véletlen találgatás. Két egyforma osztálynál az érmefeldobás ötven százalék — ennyivel van fölötte. A neuron itt nem rosszul old meg valamit: nem tudja megoldani.
Súlyok plusz eltolások, rétegenként. A kétbemenetű, egy rejtett rétegű háló: 4h + 1.
Ebből látszik, hogy a paraméterszám a rétegszélességgel LINEÁRISAN nő egy rejtett rétegnél, de két egymás melletti széles rétegnél már szorzatként: 64 → 64 önmagában 4160 paraméter.
Az oldalsó rajz számai az `nn-hidden` demó kiírásából valók, és pontosan a 4h + 1 képletet adják vissza. Érdemes egymás mellé tenni a teljesítménnyel: 8 neuron (33 paraméter) 84,1 százalékot ad, 128 neuron (513 paraméter) 56,7-et. Tizenötször annyi paraméter, rosszabb eredmény.
Az `nn-hidden` demó hálója: 2 bemenet, 1 kimenet. A képlet 4h + 1-et ad rá.
P=2 * 8 + 8 + 8 * 1 + 1=33paraméter
Húzd a csúszkát, és nézd, mi mozdul.
Három csúszka: a bemenetek száma, a rejtett réteg szélessége, a kimenetek száma. Az alapbeállítás a demónk hálója: két bemenet, nyolc neuron, egy kimenet — harminchárom paraméter. Told a rejtett réteget százhuszonnyolcra: ötszáztizenhárom. Tizenötször annyi paraméter, és a demó szerint ROSSZABB eredmény. Most told a bemenetek számát nyolcra, ahogy egy táblázatos feladatnál lenne: ugyanaz a nyolc neuron már nyolcvanegy paramétert kíván. A bemenetek száma és a rétegszélesség SZORZÓDIK — ez az, amiért a széles rétegek egymás mellett gyorsan drágulnak.
A demó kiírt paraméterszámai — 5, 9, 13, 17, 33, 65, 129, 257, 513 — pontosan ezt a képletet adják vissza. Érdemes a legjobb és a legrosszabb beállítást egymás mellé tenni: 16 neuron 65 paraméterrel 85,1 %, 128 neuron 513 paraméterrel 56,7 %.
Nyolc neuron nyolc egyenest húz. A kimeneti réteg már ezek kombinációját látja, nem a nyers bemenetet.
És hogy ez ne maradjon varázslat. A rejtett réteg nyolc neuronja nyolc KÜLÖN egyenest húz meg a síkon. Egyik sem oldja meg a feladatot önmagában. A kimeneti neuron viszont már nem a nyers bemenetet kapja, hanem azt, hogy melyik egyenes melyik oldalán vagyunk — és ebből a nyolc igen-nem válaszból már össze lehet rakni a görbült határt. A mélység tehát nem misztikum: több egyenesből összerakott határvonal.
Ebből következik az is, hogy miért kell elég neuron: ha kettő van, két egyenesből kell összerakni a határt. A következő blokk megméri, hány kell valójában — és a válasz kevesebb, mint amire számítanál. Az oldalsó rajz az `nn-neuron` demóé. Nyolc neuron nyolc egyenest húz, és a kimeneti réteg már ezek kombinációját látja. Nem „okosabb” — több egyenesből rak össze egy határvonalat.
Egy kollégád talajmintákból jósol hozamot lineáris regresszióval, és elfogadható eredményt kap. Azt javasolja, hogy váltsatok neuronhálóra, mert az „általánosabb”. Mi az első kérdésed?
Egy kollégád talajmintákból jósol hozamot lineáris regresszióval, és elfogadható eredményt kap. Azt javasolja, hogy váltsatok neuronhálóra, mert az „általánosabb”. Mi az első kérdésed?
Két lineáris leképezés egymás után megint lineáris. A rétegek összeolvadnak.
Kézenfekvő ötlet, és érdemes végiggondolni, mielőtt megmérjük. Ha egy réteg keveset tud, rakjunk egymásra ötöt. Mi történik? A válasz meglepő és éles: semmi. Nem „kevesebb, mint remélnénk” — szó szerint semmi. Két lineáris leképezés egymás után megint lineáris leképezés, tehát az öt réteg összeolvad eggyé. A következő dián ezt nem levezetem, hanem megmérjük.
Ez az állítás matematikailag egy sor: (x·W₁ + b₁)·W₂ + b₂ = x·(W₁W₂) + (b₁W₂ + b₂). A demó pont ezt az összeszorzást végzi el, és összeveti a háló tényleges kimenetével. Az oldalsó rajz az `nn-linear` demóé: a nyolcszáznyolcvanegy paraméteres, ötrétegű háló és a súlymátrixok összeszorzásából kapott háromparaméteres leképezés kimenete legfeljebb 3e-15 eltérést mutat — ez a lebegőpontos számábrázolás pontossága, nem különbség. Ugyanaz a függvény.
Az ábra betöltése…
Itt a mérés, három képben. Balra az ötrétegű háló nemlinearitás nélkül: nyolcszáznyolcvanegy paraméter, és a döntési határa egyetlen egyenes. Középen egyetlen réteg, három paraméterrel — ugyanaz a kép. Jobbra pedig ugyanaz az ötrétegű szerkezet, egyetlen sor különbséggel: benne van a ReLU. Kilencvenkilenc százalék.
A demó nem a pontosságukat veti össze, hanem a KIMENETÜKET, pontról pontra. A legnagyobb eltérés 2,89·10⁻¹⁵ — ez a lebegőpontos számábrázolás pontossága, nem különbség. Matematikailag ugyanaz a függvény, két különböző alakban leírva.
A mélységet nem a rétegek száma adja, hanem a köztük lévő nemlinearitás.
Ez a modul egyik mondata, amit érdemes megjegyezni. Az aktivációs függvény nem finomítás, nem hangolási paraméter, és nem ízlés kérdése. Enélkül a mély háló szó szerint nem létezik — akárhány réteget raksz egymásra, egyetlen egyenest kapsz. A mélységet nem a rétegek száma adja, hanem az, hogy van-e köztük valami, ami nem lineáris.
A leggyakoribb választás a ReLU: a negatívat nullára vágja, a pozitívat változatlanul hagyja. Ennél egyszerűbb már nem is lehetne — és pont ez a lényeg: nem kell bonyolult függvény, csak olyan, amelyik nem egyenes. Az oldalsó rajz az `nn-linear` demóé. Egyetlen sor különbség a kódban. A mélységet nem a rétegek száma adja, hanem a köztük lévő nemlinearitás.
Az `nn-linear` demó mérése: ugyanaz a szerkezet, aktivációs függvénnyel és anélkül.
Három mérés, ugyanazon az adaton, és a köztük lévő különbség egyetlen kódsor. Az ötrétegű háló aktivációs függvény nélkül nyolcszáznyolcvanegy paraméterrel ötvenöt százalékot ad. Egyetlen réteg, három paraméterrel, ötvenhét egész négyet — tehát a mély háló még valamivel rosszabb is, csak drágább. Ugyanez az ötrétegű szerkezet ReLU-val kilencvenkilenc százalék. A mélységet tehát nem a rétegek száma adja. A rétegek közötti nemlinearitás adja, és enélkül a mély háló szó szerint nem létezik: a súlymátrixok összeszorzódnak egyetlen lineáris leképezéssé, legfeljebb három ezredmilliárdnyi eltéréssel.
Az 55,0 és az 57,4 közötti különbség nem jelent semmit: mindkettő a véletlen találgatás környéke ezen a feladaton. Ami jelent valamit, az a két bal oldali oszlop és a jobb oldali közötti szakadék — és hogy ezt egyetlen függvényhívás okozza.
A derivált a lényeg: a szigmoidé legföljebb 0,25, a ReLU-é pozitívon pontosan 1.
Tíz réteg szigmoiddal: a láncszabály tíz deriváltat szoroz össze, tehát a gradiens legföljebb 0,25 a tizediken — ez 10 a mínusz hatodikon nagyságrend. A ReLU-nál ugyanez tíz darab egyes szorzata.
A ReLU-nak is van baja: negatívon a derivált nulla, tehát egy neuron, ami tartósan negatív tartományba kerül, soha többé nem kap gradienst. Ezt hívják haldokló ReLU-nak, és ezért van a szivárgó változat, ahol a negatív ág nem nulla, hanem kis pozitív meredekségű.
A cella betöltése…
A demó teljes kimenete. Futtasd le, és nézd meg magad a nyolcszáznyolcvanegy paramétert a három mellett. Aztán írd át a jegyzetfüzetben a rétegek számát tízre, húszra — az eltérés a számábrázolás szintjén marad, akármennyi réteget raksz egymásra. Ez az a fajta állítás, amit nem elhinni kell, hanem lefuttatni.
Egy részlet, ami a demó írása közben derült ki: az ötrétegű lineáris háló a 0,05-ös tanulási rátával NaN-ba fut. A gradiens rétegenként szorzódik, tehát öt rétegen át ugyanaz a ráta sokkal nagyobb tényleges lépés. Erről szól majd a harmadik blokk.
Egy hiba, egy irány, egy lépéshossz
Második blokk. Eddig arról volt szó, mit SZÁMOL a háló. Most arról, hogyan találja meg a súlyokat. A dolog egyszerűbb, mint amilyennek hangzik, és egyetlen beállítás uralja az egészet — az, amelyiket a legtöbben elsőre elrontják.
A tanulás négy lépés ismétlése, és mind a négy egyszerű. Előreterjesztés: a bemenet végigfolyik a hálón, kijön egy becslés. Veszteség: egyetlen szám arról, mennyire tévedtünk. Visszaterjesztés: a láncszabály megmondja, melyik súly mennyivel felelős ezért a hibáért. Lépés: minden súlyt megmozdítunk egy kicsit a jó irányba. Aztán elölről, sokezerszer.
A visszaterjesztés nem tanulási módszer, hanem a gradiens kiszámításának a módja — a láncszabály hatékony alkalmazása. A tanulás maga a negyedik lépés, és az dönti el, mi történik.
A háló a veszteségfüggvényt csökkenti, nem azt, amit szerettél volna. A kettő különbsége a te felelősséged.
Egy figyelmeztetés, mielőtt továbbmennénk, mert ez a 8. hét küszöb-anyagának a folytatása. A háló pontosan azt a számot csökkenti, amit a veszteségfüggvénybe írtál. Ha négyzetes hibát írsz, akkor a nagy tévedéseket bünteti aránytalanul — ami hozambecslésnél lehet jó, kártevőriasztásnál viszont nem. Ha a két hibafajta ára eltér, akkor azt a veszteségbe kell beletenni, nem utólag a küszöbbel korrigálni.
Ez ugyanaz a gondolat, mint a 8. hét költségoptimális küszöbe, csak korábbra hozva: ott a betanított modell kimenetén állítottunk, itt magába a tanulásba tesszük bele az árakat. A második a helyesebb, ha az árak a tanításkor már ismertek. Az oldalsó rajz az `nn-gradient` demóé. A 0,600-as ráta éri el leggyorsabban a célt — huszonhét lépésből —, mégis rosszabb helyen áll meg. A háló azt csökkenti, amit beleírtál, nem azt, amit szerettél volna.
Négyzetes: az átlag felé húz. Abszolút: a medián felé. Kereszt-entrópia: a magabiztos tévedést bünteti a legjobban.
A kereszt-entrópia és a Brier-pontszám ugyanarra a kérdésre válaszol, de máshogy bünteti a magabiztos tévedést: a Brier legföljebb 1-et ad, a kereszt-entrópia végtelent. Ezért tanításra a kereszt-entrópia, jelentésbe a Brier.
A választás nem a modellről szól, hanem a FELADATRÓL: mit tekintünk drágának. Ha a nagy tévedés aránytalanul drága — például egy permetezési döntésnél —, akkor a négyzetes a jó. Ha a kiugró értékek mérési hibák, akkor az abszolút.
Az ábra betöltése…
És itt a mérés. Ugyanaz a háló, ugyanaz a kezdősúly, ugyanannyi lépés — az egyetlen különbség a lépéshossz. A függőleges tengely logaritmikus, különben a széteső görbe mellett a többi egy vonallá lapulna. Nézd meg a legfelső görbét: az a kétes ráta, és nem lassabban tanul, hanem nő a vesztesége, amíg a számok el nem szállnak. A legalsó a jó tartomány.
A rajz 10-nél levágja a széteső görbét, és ezt a tengelyfelirat ki is mondja. Enélkül a NaN-ba futó görbe miatt a rajz használhatatlan lenne — a levágás itt nem szépítés, hanem az egyetlen mód arra, hogy a többi görbe látszódjon.
Egy sor a tanulás. A mélység ára a szorzat: a gradiens rétegenként szorzódik.
A ráta nem hangolási apróság: ugyanaz a háló, ugyanaz a kezdősúly, 400 lépés. η = 0,001 mellett a veszteség 0,2984-nél áll meg, η = 0,1 mellett 0,0677-nél, η = 2,0 mellett pedig nem véges.
Az oldalsó rajz az `nn-gradient` demóé. A kettes ráta nincs rajta, mert nem véges — az oszlopa nem rajzolható. Vedd észre, hogy a 0,6-os ráta ért célba a leggyorsabban (27 lépés), a végső vesztesége mégis rosszabb a 0,1-esénél: a gyors odaérés és a jó végeredmény nem ugyanaz.
Az `nn-gradient` demó mérése: 2 → 12 → 1 háló, 400 lépés, azonos kezdősúly.
Ugyanaz a mérés számokban, és ez a dia lényege: ez nem egy skála, amin a ráta növelésével egyre jobb, aztán egyre rosszabb lesz. Négy MINŐSÉGILEG különböző dolog történik. Az ezredes rátánál négyszáz lépés sem elég. A tizedes rátánál nulla egész nulla hatszázhetvenhét a végső veszteség — ez a jó beállítás. A hat tizedesnél huszonhét lépésből célba ér, tehát a leggyorsabb — és rosszabb helyen áll meg, mert utána oszcillál. A kettesnél pedig nincs tanulás.
A 2,0-es ráta szándékosan hiányzik az ábráról: a vesztesége nem véges, tehát nincs oszlopmagassága. Ez nem levágás, hanem az, hogy a mért érték nem szám — és ezt a dia kimondja, nem elfedi.
| ráta | célba érés | végső veszteség |
|---|---|---|
| 0,6 | 27 lépés | 0,1266 |
| 0,1 | 28 lépés | 0,0677 |
| a különbség | 1 lépés | majdnem kétszeres |
Ezt a kettőt érdemes szétválasztani, mert a gyakorlatban rendszeresen összekeverik. A hat tizedes ráta huszonhét lépésből éri el a célt, a tizedes huszonnyolcból — gyakorlatilag ugyanannyi. De a végső veszteség nulla egész tizenkettő, illetve nulla egész nulla hat egy: majdnem kétszeres különbség. A gyors ráta beleesik a völgybe, aztán át is lendül rajta, és ott ugrál a széle körül. Aki csak azt nézi, mikor ért célba, rosszabb modellt kap.
Ezért van a gyakorlatban rátacsökkentés: nagy lépésekkel indulunk, hogy gyorsan a völgy közelébe érjünk, aztán csökkentjük, hogy bele is tudjunk állni. Ez nem trükk, hanem pontosan ennek a két mérésnek az összerakása.
Betanítasz egy hálót, és a veszteség az első néhány lépés után nem szám többé — NaN. A kollégád azt javasolja, hogy csökkentsük a háló méretét. Jó ötlet?
Betanítasz egy hálót, és a veszteség az első néhány lépés után nem szám többé — NaN. A kollégád azt javasolja, hogy csökkentsük a háló méretét. Jó ötlet?
Három beállítás, amit érdemes ismerni, mert mind a három tud csendben rontani. A kezdőérték: a súlyok induló skálája. Ha rossz, a jel mély hálóban elhal vagy elszáll, és a tanulás el sem indul — a demó kódjában ezért van a He-féle kezdőérték. A köteg: hány megfigyelésből számol egy lépést. A korszak: hányszor járjuk végig az adatot. A kettő együtt adja ki a lépések számát.
A kis köteg zajossága nem csak hátrány: a zajos lépések néha kisegítenek egy rossz helyi völgyből. Ezért a gyakorlatban ritkán számolunk teljes adaton gradienst, pedig az volna a „pontos” irány.
A cella betöltése…
A demó teljes kimenete, és ehhez van egy kérésem. A jegyzetfüzetben írd át a hálót nagyobbra — hatvannégy neuronra —, és futtasd újra ugyanezekkel a rátákkal. Azt fogod látni, hogy a jó tartomány ELTOLÓDIK: ami a kicsi hálónál jó volt, a nagynál már szétesik. Ebből jön a gyakorlati szabály: a rátát nem egyszer állítod be, hanem minden hálóméretnél újra.
Ugyanez a jelenség bukkant fel a következő blokk mérésében is, ahol a 128 neuronos háló ugyanazzal a rátával használhatatlan lett — és a tanulság ott az volt, hogy ne a modellt hibáztassuk, amíg a tanulást nem ellenőriztük.
Kapacitás, zajplafon, és a tanulási kudarc
Harmadik blokk. Két kérdés van hátra a hálóról: hány neuron kell, és hogyan ismerjük fel, ha a rossz eredmény nem a modellről szól. A második fontosabb, és ritkábban tanítják.
Az ábra betöltése…
Itt a mérés. Százhúsz tanítópont, a címkék tizenkét százaléka szándékosan át van billentve — ezért van egy szaggatott vonal nyolcvannyolc százaléknál: ennél többet senki nem tudhat, mert a fennmaradó tizenkét százalék véletlen. Nézd a két görbét. Nyolc neuronig gyorsan emelkednek, aztán beállnak. És nézd meg a jobb szélét: mindkettő leesik.
A vízszintes tengely logaritmikus, kettes alapon — a méretek kettő hatványai. Lineáris tengelyen az egytől nyolcig tartó szakasz, ahol a lényeg történik, a bal szélre préselődne.
A cella betöltése…
A cella itt fut. A csavar a tanítópontok száma: ötszörözd meg. A kérdés az, hogy eltűnik-e a tanító és a teszt közti rés. Ha igen, akkor a rés adathiány volt. Ha nem, akkor a modell kapacitása a baj. A kettő teljesen más beavatkozást kíván, és ez az egyetlen kísérlet szétválasztja őket.
A demó a zajból számolt felső korlátot is kiírja: 88 %. Ennél többet a címkék 12 %-os átbillentése miatt senki nem tud elérni — és a 16 neuronos háló 85,1 %-a ehhez képest, nem a 100 %-hoz képest jó.
| neuron | teszt pontosság | paraméter |
|---|---|---|
| 8 | 84,1 % | 33 |
| 16 | 85,1 % | 65 |
| a zaj plafonja | 88 % | — innen nincs tovább |
A gyakorlati válasz meglepően kicsi. Nyolc neuronnál a teszt pontosság nyolcvannégy egész egy százalék, tizenhatnál nyolcvanöt egész egy — a legjobb. Onnan nem javul. A nyolcvannyolc százalékos zajplafonhoz képest ez már majdnem a maximum. Harminchárom paraméterrel. Aki ilyenkor ötszázas hálót épít, nem több tudást vesz, hanem több szórást.
A „legkisebb elég méret” szándékosan nem a maximumhely. A maximumhely zajos: öt futás átlagában is ingadozik. A gyakorlati szabály az, hogy a legkisebb méretet válasszuk, amelyik a legjobbtól egy százalékponton belül van.
Az `nn-hidden` demó mérése: a két pontosság, méretenként.
És ami közben történik, azt külön érdemes megnézni. A tanító és a teszt pontosság között tizenhat neuronnál két egész kilenc százalékpont a rés, százhuszonnyolcnál öt egész nyolc. Ez a nyolcadik hét torzítás-szórás átváltása, most neuronszámban mérve: a többlet kapacitás nem a jelet tanulja meg, hanem a zajt — pontosan azt a tizenkét százalékot, amit átbillentettünk.
A görbék nem simák: a 3. és a 4. neuronszám között visszaesés van. Ez öt futás átlaga mellett is megmarad, tehát nem puszta zaj — kis hálóknál a kezdősúlyok szerencséje sokat számít, és négy neuronnal gyakrabban akad el a tanulás egy rossz helyi völgyben.
Túlillesztés: kicsi tanítási hiba, nagy teszthiba. Itt MINDKETTŐ rossz — ez más jelenség.
És most az, amiért ez a blokk létezik. A százhuszonnyolc neuronos háló teszt pontossága ötvenhat egész hét — összeomlás. Kézenfekvő volna azt mondani, hogy túltanult. De nézd meg a tanító pontosságot: hatvankettő egész öt. Az is leesett. Túlillesztésnél ez LEHETETLEN — ott a modell a tanítóadatot kívülről tudja, tehát a tanító pontosság magas. Ha mindkettő rossz, akkor a modell nem túl sokat tanult meg, hanem nem tanult meg semmit.
Ez a megkülönböztetés a 8. hét alul- és túlillesztés diájának a harmadik esete, amit ott ígértem. Nem a modell mérete a baj, és nem is az adaté: a tanulás maga mondta fel a szolgálatot. Az oldalsó rajz az `nn-hidden` demóé, a 128 neuronos hálóra. Túlillesztésnél a TANÍTÓ pontosság nem eshet le — itt 62,5 százalékra esett, tehát nem az. Nyolcadakkora rátával ugyanez a háló 87,5 százalékot ad: a baj a tanulás beállítása volt, nem a méret.
Az `nn-hidden` demó mérése: ugyanaz a 128 neuronos háló, kétféle tanulási rátával.
És a bizonyíték. Ugyanaz a százhuszonnyolc neuronos háló, ugyanaz az adat, ugyanannyi lépés — egyetlen dolgot változtattunk: a tanulási rátát nyolcadára. Ötvenhat egész hét százalékról nyolcvanhét egész öt százalékra ment. Ez a legjobb eredmény az egész söprésben, gyakorlatilag a nyolcvannyolcas zajplafonon. A háló nem volt túl nagy. A lépés volt túl hosszú.
Ebből jön a gyakorlati sorrend, amit érdemes követni: mielőtt a modellt hibáztatnád, nézd meg a veszteséggörbét. Ha az nem ment le, akkor nem a modellről van szó, és a nagyobb vagy kisebb háló ugyanúgy nem fog működni.
Egy hálónál a tanító pontosság nyolcvankilenc százalék, a teszté hatvankettő. Egy másiknál mindkettő hatvan körül van. Melyikhez melyik gyógyszer való?
Egy hálónál a tanító pontosság nyolcvankilenc százalék, a teszté hatvankettő. Egy másiknál mindkettő hatvan körül van. Melyikhez melyik gyógyszer való?
A blokk zárása egy sorrenddel, ami a hetedik hét lekérdezésterv-diájának a rokona: ott is azt mondtuk, hogy előbb nézd meg, mi történik, és csak utána változtass. Először a veszteséggörbe: lement-e egyáltalán. Aztán a tanító és a teszt hiba viszonya. Csak ezután a modell mérete. És legvégül az adat — bár a valóságban sokszor ott kellett volna kezdeni.
A legtöbben fordított sorrendben csinálják: először a modellt cserélik, aztán a méretet, és a veszteséggörbét meg sem nézik. Ez pont annyira működik, mint a SQL-t találomra átírni a terv megnézése nélkül.
Az állítás, amit a 8. héten tettem — és a mérés
Utolsó blokk, és ez az, amiért a modul egyáltalán a kurzus része. Eddig azt néztük, mit tud a háló. Most azt, hogy mikor van rá szükség — mert a nyolcadik héten azt állítottam, hogy táblázatos adaton ritkán. Ezt nem hagyhatom állításként: le kell mérni.
Az ábra betöltése…
Itt a mérés. Táblázatos hozamfeladat nyolc jellemzővel — talaj, csapadék, hőösszeg, néhány kategória —, kétszáztól négyezer tanítópontig, ugyanazon a teszthalmazon. Bal oldalt a két hibagörbe. Az erősítés végig alatta van. Jobb oldalt a hányadosuk, a szaggatott vonal az egyes érték: ott fordulna meg. Nem fordul meg. Sőt: a rés tágul, egy egész ötvenhatról egy egész hetvennégyre.
A háló hibája kétezer tanítópont fölött beáll, az erősítésé tovább csökken. Ez nem elvi korlát: a háló mérete végig 32 neuron, a lépésszám végig ugyanannyi. Nagyobb hálóval a rés szűkülhet — ezt a demó NEM mérte, tehát a dia sem állítja. A jegyzetfüzetben át lehet írni.
A fa küszöböt és kategóriát feltételez — táblázatos adaton ez igaz. A háló sima függvényt — ott ez nem segít.
A magyarázat nem az, hogy a fák „okosabbak”. Az, hogy amit eleve feltételeznek a világról, az táblázatos adatra igaz. A fa küszöbökkel dolgozik: „ha a csapadék kevesebb mint ennyi, akkor más a helyzet”. A táblázatos agráradat tele van ilyen küszöbökkel. A kategóriákat természetes módon kezeli, a hiányzó értékkel elbánik, és nem érdekli a jellemzők léptéke. A háló viszont sima függvényt feltételez, és a küszöböt csak közelíteni tudja.
Ezt a beépített feltevést hívjuk modellcsalád-előfeltevésnek. Nem hiba, hanem az, amitől egy modellcsalád egyáltalán tud tanulni véges adatból. A kérdés sosem az, melyik erősebb, hanem hogy melyiknek az előfeltevése illik a feladathoz. Az oldalsó rajz az `nn-tabular` demóé. A rés nem szűkül a mintamérettel, hanem tágul: a háló hibája 2000 pont fölött beáll, az erősítésé tovább csökken.
És akkor mikor éri meg a háló? Ott, ahol a bemenetnek SZERKEZETE van, amit a fák nem tudnak kihasználni. Képnél a szomszédos képpontok összetartoznak, és a mintázat bárhol lehet a képen. Idősornál a sorrend jelent valamit. Szövegnél a szórend. A fa mindezt nem látja: neki minden bemenet egy külön oszlop, és az oszlopok sorrendje közömbös. Ez a különbség, és nem a méret vagy a divat.
Ebből az is következik, hogy táblázatos adatra épített neuronháló nem „modernebb megoldás”, hanem rosszabbul illeszkedő előfeltevés. A gradiens erősítés választása nem maradiság.
Ugyanaz a szűrő végigcsúszik a képen. Feltevés: a mintázat bárhol lehet, és a szomszédos képpontok összetartoznak.
És hogy legyen kézzelfogható, mit jelent a szerkezet kihasználása. A konvolúció annyit tesz, hogy ugyanazt a kis szűrőt végigcsúsztatjuk a képen. Ez két dolgot feltételez. Egy: a keresett mintázat bárhol lehet — egy gyomfolt a kép bal felső sarkában ugyanaz, mint a jobb alsóban. Kettő: a szomszédos képpontok összetartoznak. Képnél mindkettő igaz, és ettől lesz a konvolúciós háló nagyságrendekkel takarékosabb, mint egy teljesen összekötött.
A takarékosság nem apróság. Egy 256×256-os képhez teljesen összekötött rétegben hatvanötezer súly kellene neurononként; egy 3×3-as szűrőhöz kilenc, és ugyanaz a kilenc az egész képen. Ezért működik a képi háló néhány ezer felvételből is. Az oldalsó rajz ugyanezt a két számot rakja ki: számolás, nem mérés. A takarékosság a két feltevésből jön — a mintázat bárhol lehet, és a szomszédos képpontok összetartoznak.
Egy 256×256-os, háromcsatornás kép: hány súly kell egyetlen neuronhoz, illetve egyetlen szűrőhöz.
Egy szám, ami a konvolúciót kézzelfoghatóvá teszi. Vegyél egy kétszázötvenhat oldalú színes képet. Ha teljesen összekötött rétegbe adod, akkor EGYETLEN neuronhoz száznyolcvankilencezer súly kell — minden képponthoz egy, három csatornán. Egy három a háromszor hármas konvolúciós szűrőhöz huszonhét. És ugyanaz a huszonhét fut végig az egész képen. Hétezerszeres különbség, és nem trükk: abból jön, hogy a szűrő feltételezi, a mintázat bárhol lehet.
A huszonhetes oszlop a rajzon nem látszik — 196 608 mellett a magassága a vonalvastagság alatt van. Ez most kivételesen nem hiba, hanem maga az állítás: a két szám nem összemérhető, és a rajz ezt mutatja meg. Aki logaritmikus tengelyt tenne alá, elrejtené a lényeget.
Ugyanaz a néhány súly, minden képponton. A paraméterszám a magtól függ, nem a kép méretétől.
A képletben nincs benne a kép mérete — ez maga a lényeg. Egy 3×3-as mag 32 bemeneti és 64 kimeneti csatornán 18 496 paraméter, akár 64×64-es, akár 4000×3000-es képet dolgozol fel vele.
Az oldalsó rajz az `nn-linear` demóé, és ugyanezt a gondolatot mutatja a másik oldalról: a nemlinearitás NÉLKÜLI ötrétegű háló 881 paramétere pontosan ugyanazt a függvényt adja, mint három paraméter — a legnagyobb eltérés köztük 2,89e-15. A paraméterszám tehát önmagában nem kapacitás.
Nagy készleten betanított háló + a felső rétegek újratanítása néhány száz saját képen. Agrárban ez a járható út.
És a gyakorlati tanács, amivel a modult zárom. Nulláról hálót tanítani sok százezer képet kíván — ennyi agrárfelvételed nem lesz. A járható út a transzfer tanulás: veszel egy nagy, általános készleten betanított hálót, lefagyasztod az alsó rétegeit, és csak a felsőket tanítod újra a saját néhány száz képeden. Az alsó rétegek éleket és textúrákat ismernek fel — az ugyanaz a levélen, mint bárhol máshol.
A gépi látás projektmodul első projektje pontosan ez, és ott a csapda is meg van nevezve: a nyilvános levélkészletek egyenletes laborháttérrel készültek, a terepi kép nem ilyen. A transzfer tanulás az adathiányt oldja meg, a doméneltolódást nem.
Egy gazdaság talajmintákból, műtrágyaadagokból és időjárási összegzőkből akar hozamot becsülni. Nyolcezer soruk van, tizenkét oszloppal. Mit javasolsz?
Egy gazdaság talajmintákból, műtrágyaadagokból és időjárási összegzőkből akar hozamot becsülni. Nyolcezer soruk van, tizenkét oszloppal. Mit javasolsz?
A cella betöltése…
A demó teljes kimenete, és ezzel a kéréssel zárom a modult. A jegyzetfüzetben írd át a rejtett réteget százhuszonnyolcra, növeld a lépésszámot, próbálj meg jobb hálót építeni erre a feladatra. Ha sikerül megverned a gradiens erősítést, az jó eredmény, és szeretném látni. Ha nem sikerül, az is eredmény — akkor a diákon álló állítás megerősítést kapott a te kezedben is.
Egy figyelmeztetés a kísérlethez: ha nagyobb hálót állítasz be, a tanulási rátát is csökkentened kell, különben nem a kapacitást méred, hanem a tanulási kudarcot. Erről szólt az előző blokk, és ez a leggyakoribb hiba ilyen összevetésnél.
Ez volt a neurális hálós modul. Egy mondatban: a háló nem okosabb modell, hanem másféle előfeltevés — és akkor éri meg, ha a bemenetnek olyan szerkezete van, amit más modellcsalád nem tud kihasználni.
| Rövidítés | Feloldás | Mit jelent |
|---|---|---|
| ReLU | Rectified Linear Unit | max(0, z): pozitívon önmaga, negatívon nulla — a deriváltja pozitívon pontosan 1 |
| XOR | eXclusive OR — kizáró vagy | a klasszikus, egyenessel szét NEM választható feladat |
| MSE | Mean Squared Error | négyzetes hiba: az átlag felé húz, és a nagy eltérést négyzetesen bünteti |
| MAE | Mean Absolute Error | abszolút hiba: a medián felé húz, ettől robusztus |
| CE | Cross-Entropy — kereszt-entrópia | osztályozás vesztesége; a magabiztos tévedést végtelenül bünteti |
| SGD | Stochastic Gradient Descent | sztochasztikus gradiens ereszkedés: a lépés egy kötegből becsült gradiens mentén |
| ONNX | Open Neural Network eXchange | keretrendszer-független modellformátum a betanított háló szállítására |
| NaN | Not a Number | a lebegőpontos „nem szám”; a széteső tanítás ezzel jelzi magát |
| SQL | Structured Query Language | a relációs lekérdezések nyelve — a modulban csak összevetésként kerül elő |
A neurálishálós modul kevés rövidítést használ, és ez szándékos: a modul tétele az, hogy a háló nem varázslat, hanem súlyozott összeg. Ami rövidítés, az jórészt aktivációs függvény vagy formátum.
A NaN nem hibaüzenet, hanem érték: a számolás tovább fut vele, és minden művelet eredménye NaN lesz. Ezért van az, hogy egy elszálló tanítás nem áll meg magától — a veszteséggörbét kell nézni, nem a hibakimenetet.
Az ábra betöltése…
A modul három típusa. Az összevetések oszlopon állnak, mert a hálók és a beállítások kategóriák; a tanulási görbék viszont demóábrán, mert logaritmikus tengelyt és több panelt kívánnak. A vonal panel itt a köztes értékekről szóló állítás — a tanulási görbén éppen ez a lényeg, hogy a két mért pont között is mondunk valamit.
Az ábra a `w05-encoding` demóé (`chartindex 4`). A paneleket a demó `TIPUSKESZLETEK` táblája sorolja fel, és pontosan annyi panel van rajta, ahány típust a következő dia táblázata felsorol — ezt a `check_diagramok.py` ellenőrzi is.
| diagramtípus | mit olvasol le róla | mire NEM jó |
|---|---|---|
| oszlop | kategóriák nagyságrendje és sorrendje — a hossz maga az érték | időbeli alakulás: a sorrend nem látszik rajta |
| vonal | időbeli alakulás: a meredekség és a fordulópontok | kategóriák összevetése: a vonal sorrendet állít oda is, ahol nincs |
| demóábra | amit a keretrendszer rajza nem tud: log tengely, hőtérkép, kis sokszorosok | saját adatod: ez a demó kimenete, nem szerkeszthető a dián |
A modul diagramtípusai. A tanulási görbék demóábrán jönnek, mert logaritmikus tengelyt és több panelt igényelnek; az összevetések oszlopon.
A felsorolás nem kézi lista: a `check_diagramok.py` ellenőrzi, hogy pontosan ezek a típusok szerepelnek-e a diasorban — ha egy új dia más típust hoz be, vagy egy típus kikopik, az építés szól.