Ez az egység a szekvenciák feletti figyelmi (attention) mechanizmus egyetlen, alakpontos mátrixműveletét építi fel. A 32.1. Szekvenciamodell és változó hossz egységből ismerjük a szekvenciát mint tokenek rendezett sorozatát, a padding maszk szerepét, valamint azt, hogy egy rekurrens cella állapotegyenlete ugyanazt a paramétervektort alkalmazza minden időlépésben. Most azt a kérdést vizsgáljuk: hogyan kaphat egy token olyan kontextusfüggő reprezentációt, amely a többi token reprezentációjának adatfüggő, tanult súlyozású kombinációja? Induló becslésként: ha tokenünk van és minden token dimenziós vektorként adott, akkor a figyelem matematikailag egy méretű pontszámtáblázatból indul ki, és a naiv implementáció ezt a táblázatot teljes egészében el is készíti; a kérdés az, hogyan lesz ebből a táblázatból értelmezhető, maszkolható és numerikusan stabil kimenet, és mi ennek a számítási és memóriaköltsége.
Legyen a bemeneti szekvencia reprezentációja , ahol a tokenek száma, pedig a beágyazási dimenzió. A vetített lekérdezés-, kulcs- és értékmátrixokat a
lineáris vetítések adják, ahol
Így és . A -edik sora az -edik token lekérdezése (query), a -edik sora a -edik token kulcsa (key), a -edik sora pedig a -edik token értéke (value). A tanulható paraméterek itt a három vetítőmátrix; a figyelem maga az alábbi determinisztikus, paraméter nélküli művelet.
Definíció (scaled dot-product attention). Adott , , esetén a figyelmi kimenet
ahol a softmax a mátrix minden sorára külön alkalmazott, soronkénti normalizálás. Az
mátrixot figyelmi súlymátrixnak nevezzük. A definíció érvényes akkor is, ha ; önfigyelem (self-attention) esetén . A gyakori, de nem kötelező választás.
Az mátrix -edik sora az értékvektorok konvex kombinációja:
ahol és . A figyelem tehát nem egy rögzített szűrő, hanem a bemenettől függő súlyrendszer: ugyanaz a hálózat más tokenek esetén más pontszámokat és ezáltal más mátrixot állít elő.
Amennyiben batchben dolgozunk, minden mennyiséghez egy méretű batch-dimenzió járul, és a képletek a következőképpen értendők: és így tovább; a softmax változatlanul az utolsó, tehát a dimenzióra normalizál. Ebben az egységben a levezetéseket egyetlen szekvenciára, tehát dimenziós mátrixokra írjuk fel, mert a batch-dimenzió a műveleteken csak párhuzamosan halad végig.
Az első levezetési kötelezettség a pontszámmátrix alakjának pontos meghatározása. A mátrixszorzás definíciójával:
Lemma 1 (a mátrix alakja és elemei). Ha és , akkor , és
Bizonyítás. A transzponált definíciója szerint . A két mátrix szorzatának eleme az első mátrix -edik sorának és a második mátrix -edik oszlopának skalárszorzata, tehát
A dimenzióellenőrzés: a szorzat sorainak száma , oszlopainak száma a oszlopainak száma, azaz .
A pontszám értelmezése: annak a mértéke, hogy a -edik kulcs mennyire illik az -edik lekérdezéshez. A -val való osztás a skálázás, amelynek motivációja a következő heurisztika. Ha és független, nulla várható értékű, egységvarianciájú valószínűségi változók, akkor az 5.2. Várható érték, variancia és likelihood alfejezetben bevezetett varianciaazonosságokkal
A osztó tehát a pontszámok varianciáját a feltételezett modellben közel egységnyire hozza. Ez azonban heurisztika, nem általános állítás: a betanult és sorai sem nem függetlenek, sem nem azonos eloszlásúak. A skálázás szükségességét ezért validációval kell eldönteni, és nem bizonyított tételként bemutatni.
A softmax soronkénti normalizálás:
A figyelmi gyakorlatban bizonyos kulcspozíciókat ki kell zárni. Két gyakori eset:
A maszkot logikai mátrixként adjuk meg: akkor és csak akkor, ha a kulcs az sorgal tiltott. A tiltás szabálya a pre-softmax logitra, tehát magára a mátrixra alkalmazandó.
Lemma 2 (tiltott pozíciók maszkolási szabálya). Legyen véges értékű pontszámmátrix, és minden sorra legyen a tiltott kulcspozíciók halmaza. Tegyük fel, hogy minden -re, azaz egyetlen query sem veszíti el valamennyi kulcsát. Definiáljuk
Ekkor az mátrix jól definiált, és minden tiltott esetén .
Bizonyítás. A feltétel szerint minden sorban van legalább egy nem tiltott , ahol véges. Így , tehát a nevező
vagyis a softmax értéke véges. Tiltott -re a számláló , tehát .
A lemma kimondja, hogy a behelyettesítése a logitban pontosan zérus figyelmi súlyt eredményez a tiltott pozíciókon. A maszkot tehát a softmax előtt kell alkalmazni; a softmax utáni utólagos nullázás nem ad érvényes súlymátrixot, amint ezt az F4 feladatban ellenőrizzük.
A numerikus számításhoz kapcsolódó második állítás a softmax shift-invarianciája.
Állítás (shift-invariancia). Minden soronkénti eltolás mellett
Bizonyítás. Soronként:
A közös tényezővel egyszerűsítünk.
A stabil implementáció ezért kivonja a soronkénti maximumot, hogy az exponenciális argumentumát legfeljebb nullára csökkentse. A maszkolt esetben a maximumot a nem maszkolt elemekre kell számítani; ha a teljes sor tiltott, akkor a maximum , és ezt hibaként kell jelezni. Megfelelő maszk mellett a nem maszkolt elemek maximuma véges, így a tiltott elemek esetén -t adnak, tehát a stabilizált képlet is a Lemma 2 szerinti súlyokat szolgáltatja.
Számítási és memóriaköltség. A két költséget nem szabad azonosítani. A pontszámok kiszámítása szorzás-összeadás, a súlyozott összeg ; ez a számítási költség önattenciónál () , és egzakt figyelemnél nem kerülhető meg. A memóriaköltség viszont a megvalósítástól függ. A naiv implementáció a teljes pontszám- és súlymátrixot materializálja, ezért köztes tárat igényel. A teljes figyelmi mátrix hasznos matematikai reprezentáció, de nem kötelező egyszerre a memóriában tartani: a kimenet egzaktul kiszámítható blokkokban is, ha a softmax normalizálását online módon, blokkonként frissített sormaximummal és sorösszeggel végezzük. A FlashAttention ezt a blokkosítást (tiling) használja; a cikk 1. tétele szerint egzakt -t ad művelettel és a bemeneten és kimeneten túl csak további memóriával [P29].
A multi-head attention a méretű reprezentációt párhuzamos fejre osztja. Fejenként
ahol a fejek vetítéseinek kimeneti dimenziói tipikusan . Minden fej önállóan kiszámítja az -t, a fejkimeneteket oszlopirányban konkatenáljuk, majd egy közös kimeneti vetítést alkalmazunk:
A multi-head célja heurisztikus: különböző fejek különböző hasonlósági altérben dolgozhatnak. Ez a definíció nem állítja, hogy minden architektúrában fej szükséges, és a fejek valódi eltérése csak illusztratív vizsgálattal ellenőrizhető.
A pozíciókódolás a figyelem permutáció-equivarianciáját kompenzálja. A fenti definícióban a tokenek sorrendje kizárólag a , , sorainak sorrendjén keresztül jelenik meg, és a pontszám kizárólag a sorok tartalmától függ, a pozíciótól nem. Ezért a sorrend megváltoztatása a kimenet sorrendjét ugyanúgy megváltoztatja, de a tokenekhez nem ad új információt. A pozíciókódolás a beágyazáshoz ad egy pozíciófüggő vektort: . A lehet tanult paraméter, vagy rögzített, például szinuszos séma. A gyakori szinuszos alak páros indexre típusú tagot, páratlan indexre koszinuszos tagot használ; a pontos formula architektúra-választás, nem egyedüli lehetőség.
Legyen , , , és
A Lemma 1 szerint
A , így az első sorban , , a második sorban , . A softmax exponenciálisai:
A kimenet
mert harmadik oszlopa nulla.
Most alkalmazzunk causal maszkot: az első query, tehát az első token nem figyelhet a másodikra, így , minden más elem zérus. A Lemma 2 szerint , tehát az első sor egyetlen megmaradó súlya , . A második sor változatlan. A maszkolt kimenet
Ez a két érték szolgál referenciaként a laborban.
A labor célja a Lemma 1, a stabil softmax és a Lemma 2 együttes
ellenőrzése kis, teljesen megadott mátrixokon. Munkakönyvtár:
lab/n126/.
# lab/n126/n126_attention.py
import numpy as np
def scaled_dot_product_attention(Q, K, V, mask=None):
d_k = Q.shape[-1]
S = Q @ K.T / np.sqrt(d_k)
if mask is not None:
S = np.where(mask, -np.inf, S)
m = np.max(S, axis=-1, keepdims=True)
if np.isneginf(m).any():
raise ValueError("Egy query minden kulcsa tiltott.")
P = np.exp(S - m)
Z = np.sum(P, axis=-1, keepdims=True)
if np.any(Z == 0):
raise ValueError("Nulla normalizáló a figyelmi sorban.")
A = P / Z
return A @ V, A
Q = np.array([[1.0, 0.0],
[0.0, 1.0]], dtype=np.float64)
K = np.array([[1.0, 1.0],
[2.0, 0.0]], dtype=np.float64)
V = np.array([[1.0, 0.0, 0.0],
[0.0, 1.0, 0.0]], dtype=np.float64)
O, A = scaled_dot_product_attention(Q, K, V)
print("Maszk nélküli figyelmi súlyok:")
print(A)
print("Kimenet:")
print(O)
causal = np.array([[False, True],
[False, False]])
Om, Am = scaled_dot_product_attention(Q, K, V, mask=causal)
print("Maszkolt figyelmi súlyok:")
print(Am)
print("Maszkolt kimenet:")
print(Om)A futtatás parancsa python n126_attention.py. A kód
CPU-t és float64-et használ; véletlen szám nincs, ezért
seedre nincs szükség. A fenti kézi számításból a várt értékek:
A közelítőleg a fenti
mátrix, Am pedig az
mátrix. A kimenetek a kézzel számított
és
.
A megadott várt értékek a fenti kézi számításból származnak, és
np.allclose toleranciája legfeljebb
abszolút eltérés legyen.
F1 (fogalmi, nehézség 1). Definiálja a figyelmi súlymátrix elemeit a softmax-képlettel, és bizonyítsa be, hogy minden sor nemnegatív elemű és sorösszege pontosan . Átadandó: a definíció, a két tulajdonság levezetése és egy rövid megjegyzés arról, hogy az mátrix miért nem egyenlő a pontszámmátrixszal.
F2 (levezetési/bizonyítási, nehézség 2). Bizonyítsa be a softmax shift-invarianciáját, és adott
esetén számítsa ki a maszkolt softmaxot kétféleképpen: először shift nélkül, majd soronkénti maximumkivonással. Ellenőrizze, hogy a két eredmény azonos, és indokolja, miért kell a maximumot a véges elemekre számítani. Átadandó: a bizonyítás, a két kiszámított súlymátrix és az indoklás.
F3 (implementációs, nehézség 2). Írjon önálló
NumPy-függvényt attention(Q, K, V, mask) néven, amely a
labor specifikációja szerint maszkolt scaled dot-product attentiont
számít. Ellenőrizze a labor kéttokenes példáján, hogy a maszk nélküli és
a maszkolt kimenet np.allclose szerint egyezik a kézi
referenciával. Átadandó: a függvény teljes forráskódja, a teszt és a
kapott kimenet.
F4 (hibakeresési, nehézség 2). Tekintsük a következő hibás maszkolást:
S = Q @ K.T / np.sqrt(d_k)
A = softmax(S)
A = np.where(mask, 0.0, A) # hibás
O = A @ VMagyarázza meg, miért nem teljesül a Lemma 2 állítása, mutassa meg a konkrét hibát a labor kéttokenes példájában a sorösszeggel, és adja meg a javítást. Átadandó: a hiba oka, a hibás sorösszeg kiszámítása, a javított kód és az ellenőrzés.
F5 (kísérlettervezési/transzfer, nehézség 3). Tervezzen ellenőrzött kísérletet annak eldöntésére, hogy a skálázás javítja-e a tanulási stabilitást egy kis szintetikus szekvenciafeladaton. Adja meg a célt, a hipotézist, a feladatot, a splitet, a baseline-t, a változó tényezőt, a metrikát, az ismétlést és az erőforrás-korlátot. Ne futtassa a kísérletet. Átadandó: protokoll, baseline indoklása és legalább két explicit érvényességi korlát.
F1 megoldás. A figyelmi súlymátrix eleme
Mivel az exponenciális függvény pozitív, minden . Az -edik sor összege
mert a számláló és a nevező ugyanaz az összeg. Az mátrix tehát sztochasztikus jellegű súlymátrix. A mátrix ezzel szemben nem feltétlenül nemnegatív, és sorösszege sincs normalizálva: a softmax egy lépésben elvégzi a pontszámok nemnegatívvá alakítását és soronkénti normalizálását. A softmax a 7.2. Softmax és többosztályos cross-entropy alfejezetben tárgyalt osztályeloszlás-konstrukcióval rokon, de itt a cél nem osztálycímke, hanem egy kulcspozíció feletti súlyeloszlás.
F2 megoldás. A shift-invarianciát a fenti Állítás bizonyítja. Az adott első sora , második sora . A maszkolt softmax shift nélkül, a exponensét nullának tekintve:
A maximumkivonásos eljárásban az első sor maximuma , a másodiké ; a maszkolt elemek a kivonás után maradnak, exponensük , a normalizáló ugyanaz a nevező és az eredmény azonos. A maximumot a véges elemekre kell számítani, mert ha a elemet is bevonnánk, akkor a stabilizáló eltolás nem lenne véges, és a képletben lépés NaN-t adna.
F3 megoldás. A laborban megadott függvény maga a referenciamegoldás; a hallgató saját kódjának legalább a következő ellenőrzéseket kell elvégeznie:
O_test, A_test = attention(Q, K, V)
O_m_test, A_m_test = attention(Q, K, V, mask=causal)
assert O_test.shape == (2, 3)
assert A_test.shape == (2, 2)
assert np.allclose(A_test, [[0.3302, 0.6698],
[0.6698, 0.3302]], atol=1e-4)
assert np.allclose(A_m_test, [[1.0, 0.0],
[0.6698, 0.3302]], atol=1e-4)
assert np.allclose(O_test, [[0.3302, 0.6698, 0.0],
[0.6698, 0.3302, 0.0]], atol=1e-4)A pontos tolerancia
;
a kézi értékeket nem kerekítve kell a kódnak kiszámítania. A függvénynek
figyelnie kell az
alakjára: a Q @ K.T során a
utolsó dimenziója azonos kell legyen a
utolsó dimenziójával, ami a
.
F4 megoldás. A hibás kód a softmax után nullázza a maszkolt elemeket. A softmax normalizálója ekkor még tartalmazta a tiltott elemek exponenciálisát, a nullázás viszont már nem korrigálja a nevezőt. A labor példában a maszk nélküli első sora . A hibás utólagos nullázás ezt -ra változtatja; a sorösszeg , tehát az első token kimenete az értékek -szorosát adja, és a figyelmi súlyok nem konvex kombinációt alkotnak. A javítás az, hogy a maszkot a logitmátrixra kell alkalmazni a softmax előtt:
S = np.where(mask, -np.inf, S)
A = softmax(S)Ezzel az első sor , a második sor változatlan, és a sorösszegek pontosan egyek. Ez a Lemma 2 tartalma.
F5 megoldásminta. Cél: annak eldöntése, hogy a skálázás csökkenti-e a tanítás korai szakaszának veszteségvarianciáját. Hipotézis: skálázás nélkül a nagy pontszámok telíthetik a softmaxot, ami lassabb és zajosabb tanulást ad. Feladat: szintetikus másolási feladat, token, , padding nélkül; a modell egyetlen attention-réteg, amely a cél token logitjeit adja. Split: a feladatok véletlen generálásból train/valid példány, rögzített seeddel. Baseline: Adam, tanulási ráta , batch , ismétlés különböző seeddel. Változó: csak a skálázó tényező ( versus ). Metrika: a valid cross-entropy loss első lépésének szórása, valamint a gradiensnorma átlaga. Erőforrás: CPU, teljes futás célkeret alatt. Érvényességi korlát: a szintetikus feladat nem általános szekvenciaprobléma, és egyetlen réteg nem mutatja a mély hálózatok viselkedését. A kísérlet nem a skálázás okát bizonyítja, csak ebben a konfigurációban mér.
Tipikus tévedés. Az attention súlymátrixot gyakran közvetlen szemantikai vagy oksági magyarázatként mutatják be. Ez a következtetés nem áll meg. Az súly csak azt mondja meg, hogy az -edik query a -edik értékből mekkora konvex kombinációs arányt vesz, de az értékvektorokat is tanult vetítés adja. Ellenpélda: legyen , , . Ekkor a kimenet ; a nagyobb figyelmi súly ellenére a negatív előjele kioltja a nagy pozitív hozzájárulását. A súly tehát nem hozzájárulás; oksági állításhoz kontrafaktuális beavatkozás kell, amelyet a 35.4. Korlátok, eredet és döntési felelősség egység módszertana tárgyal.
Önellenőrzés. Kérdezzük meg: (1) Milyen alakú a és az mátrix? (2) A maszkolás után minden tiltott sorösszeg pontosan -et ad-e? (3) A stabil softmax soronkénti maximuma vajon véges értéken lett-e számítva? (4) A labor függvény hibát ad-e, ha egy teljes sor maszkolt? A négy kérdés mindegyikére csak akkor adott a válasz, ha a levezetések és a teszt egyaránt rendelkezésre állnak.
Visszahívás. A 28.2. Sziámi és triplet cél triplet-célban a tanult beágyazások közötti távolság explicit pozitív/negatív párokat definiált; itt a pontszám ad hoc hasonlóság, és a softmax a sorok felett normalizál. A 20.2. Finomhangolás és tanulási ráta finomhangolás-tanulsága ismét megjelenik: a paraméterek és az esetleges tanult pozíciókódolás paraméterei eltérő paramétercsoportba tartozhatnak; a fagyasztásukat külön kell kezelni. A 31.2. GAN mint minimax probléma GAN-minimaxjában a diszkriminátor adatfüggő pontszámot állít elő, de ott nincs konvex kombinációra normalizálás; a figyelem softmaxja ebben az értelemben eltérő normalizálási szerződést ad.
A scaled dot-product attention a query-kulcs pontszámmátrix és az értékek szorzata. A eleme a query és a kulcs skalárszorzata; a osztó heurisztikus varianciastabilizálás. A softmax soronkénti normalizálása konvex súlyokat ad. A tiltott pozíciókat a pre-softmax logitban -nel kell jelölni, így a maszkolt súly pontosan nulla; utólagos nullázás hibás sorösszeget ad. A stabil implementáció soronkénti maximumot von ki. A multi-head a fejenkénti vetítések konkatendációja, a pozíciókódolás pedig a permutáció-equivariancia kompenzálására ad pozícióinformációt. A súlymátrix nem önmagában oksági magyarázat.
A következő egység 32.3. Vision Transformer és hibrid felhasználás ezt a figyelmi műveletet képekre alkalmazza: a Vision Transformerben a képet tokendarabokra vágjuk, és a pozíciókódolás, valamint a figyelmi rétegek együttesét vizsgáljuk a CNN-ekkel való összevetés előtt.