Skip to content

MatMulFree#2

Open
GEMBI1226 wants to merge 5 commits into
mainfrom
MatMul-free
Open

MatMulFree#2
GEMBI1226 wants to merge 5 commits into
mainfrom
MatMul-free

Conversation

@GEMBI1226

Copy link
Copy Markdown
Collaborator

MatMulFree modell.

@matyasosvath

Copy link
Copy Markdown
Contributor

"Egy hagyományos nn.Linear réteg a következő műveletet végzi:"
-> A neurális hálózatokban található lineáris réteg egy lineáris leképezés, aminek képlete a következő:
Ne a nn.Linear-t ird le, hanem matematika oldaláról nézzük, az nn.Linear Pytorchc specifikus és nem érdekes ilyen szempontból,
mert pl tensorflowban is meg lehetne ezt csinálni.

"Ez egy lebegőpontos mátrixszorzás, "
-> ez csak az implementációban, de valójában a valós számok halmaza a lényeg

" bonyolultsága $O(d_{in} \cdot d_{out})$"
-> ez nem kell, nem érdekel minket

írod, hogy "a súlyokat ternáris értékekre $({-1,0,+1})$ kvantálja", de nem írdo le, hogy kvantálás szó mit jelent
és nem is adsz hivatkozás, hogy esetleg lentebb definiálod,
illetve ezek szerint a leképezés képtere / értékkészlete a {-1,0,1} skalárok?
vagy maguk a súlyok vehetik fel a {-1,0,1} értéket.

Olvasóként ez merülne fel, de te ezeket lentebb írod, az RMS normalizáció alatt. Egy átvezető mondat kellene ide pl.:
... amelyet a lentebbi (itt és itt) részben kerül leírásra. / vagy a következő részben ...

Az RMS normalizációval meg kellene cserélni.

"Egy nagy modellben ezek teszik ki a számítás ~95%-át."

ezt honnan tudod? kiszámoltad? elmondható, hogy minden modell 95%-a ez? ha nem, akkor ne írd, hogy 95%

a RMSNorm-nál nem kellenek a lépések a képlet magáért beszél, de tüntesd fel, hogy az $x$ bemeneti vektor milyen alakú
illetve hivatkozással lásd el, hogy honnan vetted.

ez a cella nem kell:

x_test = torch.randn(2, 10, config.d_model)
norm = RMSNorm(config.d_model)
x_normed = norm(x_test)

a "Súlykvantálás – ternáris értékekre (${-1, 0, +1}$)" részben jó lenne feltünteni, hogy a kvantálás, a tanítási szakasz előtt
példányosításkor van-e jelen

"Hagyományosan ezek tetszőleges lebegőpontos számok,"
-> nem, ezek valós, számok, csak az implementációs során vannak lebegőpontos számok, ezeket tisztázni kell egy megjegyzésben.

"−1 esetén az érték negálódik (ellentétes hatás),

0 esetén teljesen figyelmen kívül marad (nincs hatás),

+1 esetén pedig változatlanul átmegy (pozitív hatás).
"
-> ez honnan jön?, a szerzők írták? ha igen akkor írd is oda kérlek.
illetve gondolatjel legyen

" Valódi hardveres implementációban (pl. Loihi 2) ez a lépés elhagyható."
-> ezt honnan vetted? hivatkozás? és mit jelent?

"Skálafaktor: az abszolút értékek átlaga:"
-> a súlymátrix összes elemének abszolút értékére vett számtani közép (átlag).
a képlet a számtani közép, ami azért fontos, mert van még 3: harmonikus, mértani és négyzetes közép

"
2. Skálázás és kerekítés:
$$\tilde{W}{ij} = \text{round}\left(\frac{W{ij}}{\alpha}\right)$$
"

A round() programozási/informális jelölés, melyik a kettő közül:

$\lfloor x\rfloor$ - lefelé kerekítés (floor)
$\lceil x\rceil$ - felfelé kerekítés (ceiling)

Írd oda, hogy ezt a round függvény implementálja.

A clamp(...) szintén informális/programozási jelölés, a pontos matematikai jelölés / szintaxist add meg kérlek,
és a szemantikát pedig leírthatod, valamint azt, hogy ezt a clamp() fn implementálja.

Értem, hogy a $W^{\text{quant}}$ jelölést mire használod, de matematikában mást is jelenthet, ezért
kérlek egyértelműsítsd

"
A visszaskálázás azért szükséges, mert a PyTorch F.linear művelete float32 értékeket vár — a ternáris ({-1, 0, +1}) értékeket visszaszorozzuk α-val hogy a kimenet nagyságrendje helyes maradjon.
"

ez az ok-okozati leírás nem tűnik helyesnek. A float32 nem tudja reprezentálni ezeket a számokat?
mit jelent az, hogy helyes maradjon?

## Aktivációkvantálás – 8 bitre

"Az aktivációkat, azaz a réteg bemeneti vektorait"
-> ez így nem a teljes kép: Az aktuális réteg szempontjából -> bemeneti vektor,
Az előző réteg szempontjából -> kimeneti vektor (aktiváció)
kérlek pontosítsd

A modell int8 specifikus-e az aktivációk szempontjából?, ha nem akkor töntesd fel, ha igen akkor is.

"8-bites egészekre, a [-128, 127] tartományba."
ez nem így nem pontos, helyette: 8-bites egészekre (int8), ami a ... tartományban vehet fel értékeket.

"Lépések:"
-> itt nincs feltűntetve, hogy az $x$ vektor micsoda és milyen alakú.

"az adott token feature-vektorának"
-> a feature-t jellemzőként fordítjuk
"dimenzióindex"
-> ilyen nem létezik, a dimenzió egy vektortér tulajdonsága (pl. "ez egy 768 dimenziós tér"),
nem pedig olyasmi, amit indexelünk — a vektort komponensei szerint indexeljük.

ezt

scale = 127.0 / x.abs().max(dim=-1, keepdim=True).values.clamp_(min=1e-5)

úgy írd le, ahogy a lépésekben megadod, tehát 3. sorban legyenek

ez itt nem világos:

$$s_t = \frac{127}{\max_j |x_{t,j}|}$$

mire gondolsz ez alatt? erre: ha a $t$-edik token vektora például $[1,2,3]$, akkor:

$$ s_t=\frac{127}{\max (|1|,|2|,|3|)}=\frac{127}{3} $$

? ha jól látom a kódot, akkor igen, kérlek pontosítsd.

"
A visszaskálázás azért szükséges, mert a PyTorch következő rétegei float32 értékeket várnak —
ha a [-128, 127] egész értékeket visszaosztatlanul adnánk tovább, a modell teljesen félreértelmezné őket és
a tanítás összeomolna. Ezért visszaosztunk s_t-vel hogy az értékek visszakerüljenek az eredeti nagyságrendbe.
Valódi int8 hardveres támogatással ez a lépés elhagyható lenne.
"

"visszaosztatlanul"
-> ez mit jelent? a torch át tudja alakítani az int8-at float32-re. lásd:

a = torch.tensor(38, dtype=torch.int8)
b = torch.tensor(0.5, dtype=torch.float32)
print(a + b) # tensor(38.5000), torch.float32

"a modell teljesen félreértelmezné őket és a tanítás összeomolna."
-> ez mit jelent? a modell nem egy filozófus, hogy "értelmezzen" :D

@matyasosvath

Copy link
Copy Markdown
Contributor

"
$$
\frac{\partial \mathcal{L}}{\partial x}=\frac{\partial \mathcal{L}}{\partial x^{\text {quant }}} \cdot \frac{\partial x^{\text {quant }}}{\partial x}
$$
"
itt nem írod, hogy mi-micsoda. látom, hogy lentebb írod, de a szimbólumot mindig annál a résznél kell definiálni, ahol írjuk.

"A probléma: A matematika szabályai szerint a valódi gradienst így kéne kiszámolni:"
-> ennek a felépítése nem jó, helyette: A gradiens kiszámítása a következőképpen történik... A probléma, hogy ...

"Forward pass: A .detach() az értékeket nem bántja, így az eredmény egyszerűen "
-> Helyette: A előreterjesztés során (forward pass) a .detach() az értékeket változatlanul hagyja. A gradiens leereszkedés során
a .detach() a műveletet figyelmen kívül hagyja.

"gradiens úgy folyik vissza a súlyokhoz"
-> a gradiens nem folyik, nem egy folyó, hogy tudnád ezt pontosbban megfogalmazni?

a pytorchban inkább kompozíciót használnak és nem öröklődést: class BitLinear(nn.Linear):, kérlek javítsd

"Straight-Through Estimator (STE)"
-> ezt leírod, de aztán nem kötöd össze a leírtakkal. csak a gradiens számítást fejted ki. akkor meg minek?
így csak egy jól hangzó idegen szó lesz

"activation_quant(x_norm) - x_norm"
"weight_quant(w) - w"
-> miért kell kivonni?

"total_weights * 1.58 / 8:.0f}"
honnan jött az 1.58?

"hagyományos önfigyelem (self-attention) legnagyobb szűk keresztmetszete"
-> van olyan, hogy hagyományos? keresztmetszet?

"vetítések"
-> lineáris leképezések vagy csak leképezések

"self-attention"
-> önfigyelem

"elem-szintű"
-> elemenkénti

"ami lehetetlenné tenné a MatMul-mentes működést."
-> nem tenné szó szerint lehetetlenné, csak értelmét vesztené.

"egy kapuzott lineáris rekurrens egységgel (MLGRU) váltja ki."
-> egy ún. mátrixszorzás-mentes lineáris kapuzó (vagy kapuzott) rekurrens egységgel ...

@matyasosvath

Copy link
Copy Markdown
Contributor

"összeadásokat használ"
-> összeadást használ

"maradéktalanul eltűnik a folyamatból."
-> elég, hogy "eltűnik a folyamatból"

" A matematika szabályai szerint a valódi gradienst így kéne kiszámolni"
-> a gradienst írod a szövegben, de a képletben x szerint parciális derivált van

"blokkja tartalmaz egy Feed-Forward hálózatot (MLP) "
-> egy teljesen-összekapcsolt előrecsatolt réteget (multi-layer perceptron, MLP)...

"Míg az önfigyelem (vagy az MLGRU) az időben keveri az információt a szavak között, addig az MLP a szavak saját, belső tulajdonságait (dimenzióit) keveri újra, pozíciónként függetlenül."
-> ezt honnan vetted?

"A hagyományos transzformerekben ez két egyszerű lineáris vetítésből és egy ReLU aktivációból áll:"
-> leképezés szó jobb, mint a vetítés
-> ez nem igaz, a két lineáris leképezést csak később adták hozzá, eredetileg, egy lineáris leképezés + egy aktivációs függvény

" felskálázza a bemenetet nagyobb dimenzióba"
-> a lekezépezés egy nagyobb dimenziójú vektortérbe történik
"visszahozza az eredeti dimenzióba."
-> alacsonyabb dimenzióba történő leképezés, a visszahozza szó nem pontos.

"drága lebegőpontos rétegeket"
-> a lebegeőpontos szám nem drága :D

"lebegőpontos rétegeket"
-> ez így nem pontos, helyette: a rétegek súlymátrixai lebegőpontos értékeit ...

"A belső kiterjesztett dimenzió az alapdimenzió többszöröse (általában"
-> a kiterjeszett nem jó szó, lehet ennél pontosabb megfogalmazás?
-> általában? honnan gondolod, hogy általában?

"mint egy gondolkodási folyamat ahol kiterjesztjük a lehetőségeket, majd visszasűrítjük a lényeget."
-> ez honnan van? illetve honnan tudod, hogy a gondolkodási folyamat így működik?

"A SwiGLU két párhuzamos réteget használ (A SwiGLU két párhuzamos réteget használ (..."
-> A SwiGLU egy aktivációs függvény, nem használ rétegeket, a rétegek kimeneteit használja.

"Ez a korrekció minden SwiGLU-t használó modellnél szükséges."
-> honnan gondolod, hogy szükséges? ez nem a SwiGLU-ról szól, hanem a paraméterszám ne legyen "túl" nagy.

"Véletlen mini-batch kivágása az adatból"
-> nem kivágjuk, hanem kiválasztjuk

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants