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-sekvenca 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
Samo 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 ih pretvoriš u težine pažnje koje se saberu na 1.
Izračunavanje eksponencijala:
Izračunavanje zbira:
Izračunavanje težina pažnje:
Korak 3: Izračunavanje vektora konteksta
Samo 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 dobijete težine pažnje: Primeni softmax funkciju na rezultate pažnje da dobijete 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: Izračunavanje skalirane dot-proizvodne pažnje
Izračunavanje ocena pažnje
Slično prethodnom primeru, ali ovoga puta, umesto korišćenja vrednosti dimenzija tokena, koristimo ključnu matricu tokena (već izračunatu korišćenjem dimenzija):. Dakle, za svaku upit qi
i ključ kj
:
Skaliranje ocena
Da bismo sprečili da dot-proizvodi postanu preveliki, skaliramo ih kvadratnim korenom dimenzije ključa dk
:
Ocena se deli kvadratnim korenom dimenzija jer dot-proizvodi mogu postati veoma veliki i ovo pomaže u regulisanju.
Primena Softmax-a za dobijanje težina pažnje: Kao u inicijalnom primeru, normalizujte sve vrednosti tako da se saberu na 1.
Step 3: Izračunavanje kontekstualnih vektora
Kao u inicijalnom primeru, jednostavno saberite sve vrednosti matrica množeći svaku sa svojom težinom pažnje:
Primer koda
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 nasumičnim vrednostima, koristi nn.Linear
da označi sve težine kao parametre 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 sumiraju 1. Ova maska postavlja rezultate pažnje budućih tokena na negativnu beskonačnost, osiguravajući da nakon softmax-a, njihova težina pažnje bude 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 nasumično 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 kao prednost 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