4. Attention Mechanisms
Mehanizmi pažnje i samopažnja u neuronskim mrežama
Mehanizmi pažnje omogućavaju neuronskim mrežama da fokusiraju na specifične delove ulaza prilikom generisanja svakog dela izlaza. Dodeljuju različite težine različitim ulazima, pomažući modelu da odluči koji su ulazi najrelevantniji za zadatak. Ovo je ključno u zadacima poput mašinskog prevođenja, gde je razumevanje konteksta cele rečenice neophodno za tačan prevod.
Cilj ove četvrte faze je vrlo jednostavan: Primeni neke mehanizme pažnje. Ovo će biti mnogo ponovljenih slojeva koji će uhvatiti odnos reči u rečniku sa njenim susedima u trenutnoj rečenici koja se koristi za obuku LLM. Za ovo se koristi mnogo slojeva, tako da će mnogo parametara za obuku hvatati ove informacije.
Razumevanje mehanizama pažnje
U tradicionalnim modelima sekvenca-za-sekvencu koji se koriste za prevođenje jezika, model kodira ulaznu sekvencu u vektorski kontekst fiksne veličine. Međutim, ovaj pristup se suočava sa problemima sa dugim rečenicama jer fiksni vektorski kontekst možda neće uhvatiti sve potrebne informacije. Mehanizmi pažnje rešavaju ovo ograničenje omogućavajući modelu da razmatra sve ulazne tokene prilikom generisanja svakog izlaznog tokena.
Primer: Mašinsko prevođenje
Razmotrite prevođenje nemačke rečenice "Kannst du mir helfen diesen Satz zu übersetzen" na engleski. Prevod reč po reč ne bi proizveo gramatički ispravnu englesku rečenicu zbog razlika u gramatičkim strukturama između jezika. Mehanizam pažnje omogućava modelu da se fokusira na relevantne delove ulazne rečenice prilikom generisanja svake reči izlazne rečenice, što dovodi do tačnijeg i koherentnijeg prevoda.
Uvod u samopažnju
Samopažnja, ili intra-pažnja, je mehanizam gde se pažnja primenjuje unutar jedne sekvence kako bi se izračunala reprezentacija te sekvence. Omogućava svakom tokenu u sekvenci da se obraća svim drugim tokenima, pomažući modelu da uhvati zavisnosti između tokena bez obzira na njihovu udaljenost u sekvenci.
Ključni koncepti
Tokeni: Pojedinačni elementi ulazne sekvence (npr. reči u rečenici).
Umetanja: Vektorske reprezentacije tokena, koje hvataju semantičke informacije.
Težine pažnje: Vrednosti koje određuju važnost svakog tokena u odnosu na druge.
Izračunavanje težina pažnje: Primer korak po korak
Razmotrimo rečenicu "Hello shiny sun!" i predstavimo svaku reč sa 3-dimenzionalnim umetanjima:
Hello:
[0.34, 0.22, 0.54]
shiny:
[0.53, 0.34, 0.98]
sun:
[0.29, 0.54, 0.93]
Naš cilj je da izračunamo vektor konteksta za reč "shiny" koristeći samopažnju.
Korak 1: Izračunavanje rezultata pažnje
Jednostavno pomnožite svaku dimenzionalnu vrednost upita sa relevantnom vrednošću svakog tokena i saberite rezultate. Dobijate 1 vrednost po paru tokena.
Za svaku reč u rečenici, izračunajte rezultat pažnje u odnosu na "shiny" izračunavanjem skalarne produkcije njihovih umetanja.
Rezultat pažnje između "Hello" i "shiny"
Rezultat pažnje između "shiny" i "shiny"
Rezultat pažnje između "sun" i "shiny"
Korak 2: Normalizacija rezultata pažnje da bi se dobile težine pažnje
Ne gubite se u matematičkim terminima, cilj ove funkcije je jednostavan, normalizujte sve težine tako da se ukupno saberu na 1.
Pored toga, softmax funkcija se koristi jer naglašava razlike zbog eksponencijalnog dela, olakšavajući prepoznavanje korisnih vrednosti.
Primeni softmax funkciju na rezultate pažnje da bi ih pretvorio u težine pažnje koje se saberu na 1.
Izračunavanje eksponencijala:
Izračunavanje sume:
Izračunavanje težina pažnje:
Korak 3: Izračunavanje vektora konteksta
Jednostavno uzmite svaku težinu pažnje i pomnožite je sa dimenzijama relevantnog tokena, a zatim saberite sve dimenzije da dobijete samo 1 vektor (vektor konteksta)
Vektor konteksta se izračunava kao ponderisana suma umetanja svih reči, koristeći težine pažnje.
Izračunavanje svake komponente:
Ponderisano umetanje "Hello":
* **Ponderisano umetanje "shiny"**:
* **Ponderisano umetanje "sun"**:
Saberanje ponderisanih umetanja:
vektor konteksta=[0.0779+0.2156+0.1057, 0.0504+0.1382+0.1972, 0.1237+0.3983+0.3390]=[0.3992,0.3858,0.8610]
Ovaj vektor konteksta predstavlja obogaćeno umetanje za reč "shiny," uključujući informacije iz svih reči u rečenici.
Sažetak procesa
Izračunajte rezultate pažnje: Koristite skalarni proizvod između umetanja ciljne reči i umetanja svih reči u sekvenci.
Normalizujte rezultate da biste dobili težine pažnje: Primeni softmax funkciju na rezultate pažnje da biste dobili težine koje se saberu na 1.
Izračunajte vektor konteksta: Pomnožite umetanje svake reči sa njenom težinom pažnje i saberite rezultate.
Samopažnja sa težinama koje se mogu obučavati
U praksi, mehanizmi samopažnje koriste težine koje se mogu obučavati da nauče najbolje reprezentacije za upite, ključeve i vrednosti. Ovo uključuje uvođenje tri matrice težina:
Upit je podatak koji se koristi kao i ranije, dok su matrice ključeva i vrednosti samo nasumične matrice koje se mogu obučavati.
Korak 1: Izračunavanje upita, ključeva i vrednosti
Svaki token će imati svoju matricu upita, ključeva i vrednosti množenjem svojih dimenzionalnih vrednosti sa definisanim matricama:
Ove matrice transformišu originalna umetanja u novi prostor pogodan za izračunavanje pažnje.
Primer
Pretpostavljajući:
Ulazna dimenzija
din=3
(veličina umetanja)Izlazna dimenzija
dout=2
(željena dimenzija za upite, ključeve i vrednosti)
Inicijalizujte matrice težina:
Izračunajte upite, ključeve i vrednosti:
Step 2: Compute Scaled Dot-Product Attention
Compute Attention Scores
Slično prethodnom primeru, ali ovoga puta, umesto da koristimo vrednosti dimenzija tokena, koristimo ključnu matricu tokena (već izračunatu koristeći dimenzije):. Dakle, za svaki upit qi
i ključ kj
:
Scale the Scores
Da bismo sprečili da dot proizvodi postanu preveliki, skaliramo ih kvadratnim korenom dimenzije ključa dk
:
Rezultat se deli kvadratnim korenom dimenzija jer dot proizvodi mogu postati veoma veliki i ovo pomaže da se regulišu.
Apply Softmax to Obtain Attention Weights: Kao u inicijalnom primeru, normalizujte sve vrednosti tako da se saberu na 1.
Step 3: Compute Context Vectors
Kao u inicijalnom primeru, samo saberite sve matrice vrednosti množeći svaku sa njenom težinom pažnje:
Code Example
Uzimajući primer sa https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb možete proveriti ovu klasu koja implementira funkcionalnost samopaznje o kojoj smo govorili:
Napomena da se umesto inicijalizacije matrica sa slučajnim vrednostima, koristi nn.Linear
da se označe sve težine kao parametri za obuku.
Uzročna Pažnja: Sakrivanje Budućih Reči
Za LLM-ove želimo da model uzima u obzir samo tokene koji se pojavljuju pre trenutne pozicije kako bi predvideo sledeći token. Uzročna pažnja, takođe poznata kao maskirana pažnja, to postiže modifikovanjem mehanizma pažnje kako bi se sprečio pristup budućim tokenima.
Primena Maski za Uzročnu Pažnju
Da bismo implementirali uzročnu pažnju, primenjujemo masku na rezultate pažnje pre softmax operacije tako da preostali rezultati i dalje zbrajaju 1. Ova maska postavlja rezultate pažnje budućih tokena na negativnu beskonačnost, osiguravajući da nakon softmax-a, njihove težine pažnje budu nula.
Koraci
Izračunaj Rezultate Pažnje: Isto kao i pre.
Primeni Masku: Koristi gornju trougaastu matricu ispunjenu negativnom beskonačnošću iznad dijagonale.
Primeni Softmax: Izračunaj težine pažnje koristeći maskirane rezultate.
Maskiranje Dodatnih Težina Pažnje sa Dropout-om
Da bismo sprečili prekomerno prilagođavanje, možemo primeniti dropout na težine pažnje nakon softmax operacije. Dropout slučajno postavlja neke od težina pažnje na nulu tokom obuke.
Redovni dropout je oko 10-20%.
Code Example
Code example from https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb:
Proširenje jedne glave pažnje na više glava pažnje
Višeglava pažnja u praktičnom smislu se sastoji od izvršavanja više instanci funkcije samopaznje, svaka sa svojim težinama, tako da se izračunavaju različiti konačni vektori.
Primer koda
Moguće je ponovo koristiti prethodni kod i samo dodati omotač koji ga pokreće nekoliko puta, ali ovo je optimizovana verzija sa https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb koja obrađuje sve glave u isto vreme (smanjujući broj skupih for petlji). Kao što možete videti u kodu, dimenzije svake oznake su podeljene u različite dimenzije prema broju glava. Na ovaj način, ako oznaka ima 8 dimenzija i želimo da koristimo 3 glave, dimenzije će biti podeljene u 2 niza od 4 dimenzije, a svaka glava će koristiti jedan od njih:
Za još jednu kompaktno i efikasnu implementaciju možete koristiti torch.nn.MultiheadAttention
klasu u PyTorch-u.
Kratak odgovor ChatGPT-a o tome zašto je bolje podeliti dimenzije tokena među glavama umesto da svaka glava proverava sve dimenzije svih tokena:
Iako bi omogućavanje svakoj glavi da obrađuje sve dimenzije ugrađivanja moglo izgledati korisno jer bi svaka glava imala pristup punim informacijama, standardna praksa je da se podele dimenzije ugrađivanja među glavama. Ovaj pristup balansira računarsku efikasnost sa performansama modela i podstiče svaku glavu da uči raznolike reprezentacije. Stoga je deljenje dimenzija ugrađivanja generalno poželjnije od toga da svaka glava proverava sve dimenzije.
References
Last updated