Süvenege AI tuuma: Transformeri tähelepanumehhanismi rakendamise juhend. Teooriast koodini, selgitame skaleeritud punktkorrutist ja mitme pea tähelepanu.
Transformeri dešifreerimine: Sügav sukeldumine tähelepanumehhanismi rakendamisse
Aastal 2017 muutis Google Braini teadusartikkel pealkirjaga "Attention Is All You Need" ("Tähelepanu on kõik, mida vajate") tehisintellekti maailma põhjalikult. See artikkel tutvustas Transformeri arhitektuuri, uut disaini, mis loobus täielikult korduvatest ja konvolutsioonikihtidest, mis olid varem domineerinud järjestuspõhistes ülesannetes, nagu masintõlge. Selle revolutsiooni keskmes oli võimas, kuid elegantne kontseptsioon: tähelepanumehhanism.
Tänapäeval on Transformerid peaaegu iga tipptasemel tehisintellekti mudeli alus, alates suurtest keelemudelitest nagu GPT-4 ja LLaMA kuni murranguliste mudeliteni arvutinägemises ja ravimite avastamises. Tähelepanumehhanismi mõistmine ei ole enam tehisintellekti praktikutele valikuline; see on hädavajalik. See põhjalik juhend on mõeldud ülemaailmsele arendajate, andmeteadlaste ja tehisintellekti entusiastide publikule. Me demüstifitseerime tähelepanumehhanismi, jaotades selle põhiprintsiipidest praktilise koodis rakendamiseni. Meie eesmärk on anda teile intuitsioon ja tehnilised oskused, et mõista ja ehitada mootorit, mis toidab tänapäevast tehisintellekti.
Mis on tähelepanu? Ülemaailmne intuitsioon
Enne maatriksite ja valemitega sĂĽvenemist loome universaalse intuitsiooni. Kujutage ette, et loete seda lauset: "Laev, mis oli laaditud kaubaga mitmest rahvusvahelisest sadamast, seilas sujuvalt ĂĽle ookeani."
Sõna "seilas" tähenduse mõistmiseks ei anna teie aju igale teisele sõnale lauses võrdset kaalu. See pöörab instinktiivselt rohkem tähelepanu sõnadele "laev" ja "ookean" kui sõnadele "kaup" või "sadamad". See selektiivne keskendumine – võime dünaamiliselt kaaluda erinevate teabeosade olulisust konkreetse elemendi töötlemisel – on tähelepanu olemus.
Tehisintellekti kontekstis võimaldab tähelepanumehhanism mudelil sama teha. Sisendjärjestuse ühe osa (nagu sõna lauses või plaaster pildil) töötlemisel saab see vaadata kogu järjestust ja otsustada, millised teised osad on praeguse osa mõistmiseks kõige olulisemad. See võime otse modelleerida pikamaa sõltuvusi, ilma et peaks teavet järjestikku korduvketi kaudu edastama, teeb Transformerid nii võimsaks ja tõhusaks.
Põhimootor: Skaleeritud punktkorrutise tähelepanu
Kõige levinum Transformerites kasutatav tähelepanuvorm on Skaleeritud Punktkorrutise Tähelepanu (Scaled Dot-Product Attention). Selle valem võib esmapilgul tunduda hirmutav, kuid see on ehitatud loogilistele sammudele, mis kaarduvad kaunilt meie intuitsioonile.
Valem on: Attention(Q, K, V) = softmax( (QKT) / √dk ) * V
Lahutame selle osadeks, alustades kolmest peamisest sisendist.
Kolmainsus: Päring, Võti ja Väärtus (Q, K, V)
Tähelepanu rakendamiseks teisendame oma sisendandmed (nt sõnaümbrised) kolmeks erinevaks esituseks: Päringud, Võtmed ja Väärtused. Mõelge sellele kui otsingusüsteemile, nagu teabe otsimisele digitaalses raamatukogus:
- Päring (Q): See esindab praegust eset, millele olete keskendunud. See on teie küsimus. Konkreetse sõna puhul küsib selle Päringu vektor: "Milline teave ülejäänud lauses on minu jaoks oluline?"
- Võti (K): Igal järjestuse elemendil on Võtme vektor. See on nagu sildi, pealkiri või märksõna teabe jaoks. Päringut võrreldakse kõigi Võtmetega, et leida kõige olulisemad.
- Väärtus (V): Igal järjestuse elemendil on ka Väärtuse vektor. See sisaldab tegelikku sisu või teavet. Kui Päring leiab parimad sobivad Võtmed, siis me otsime nende vastavad Väärtused.
Enesetähelepanu puhul, mehhanismis, mida kasutatakse Transformeri kodeerijas ja dekooderikus, genereeritakse Päringud, Võtmed ja Väärtused kõik samast sisendjärjestusest. Iga sõna lauses genereerib oma Q, K ja V vektorid, läbides kolm eraldi, õpitud lineaarset kihti. See võimaldab mudelil arvutada iga sõna tähelepanu iga teise sõnaga samas lauses.
Samm-sammult rakenduse jaotus
Vaatame läbi valemi toimingud, ühendades iga sammu selle eesmärgiga.
1. samm: Sarnasusskooride arvutamine (Q * KT)
Esimene samm on mõõta, kui palju iga Päring vastab igale Võtmele. Saavutame selle, võttes iga Päringu vektori punktkorrutise iga Võtme vektoriga. Praktikas tehakse seda tõhusalt kogu järjestuse jaoks, kasutades ühte maatriksi korrutamist: `Q` korrutatakse `K` transponeeritud kujuga (`K^T`).
- Sisend: Päringu maatriks `Q` kujuga `(sequence_length, d_q)` ja Võtme maatriks `K` kujuga `(sequence_length, d_k)`. Märkus: `d_q` peab võrduma `d_k`.
- Tehing: `Q * K^T`
- Väljund: Tähelepanuskooride maatriks kujuga `(sequence_length, sequence_length)`. Selle maatriksi element kohal `(i, j)` esindab toores sarnasusskoori `i`-nda sõna (päringuna) ja `j`-nda sõna (võtmena) vahel. Kõrgem skoor tähendab tugevamat seost.
2. samm: Skaleerimine ( / √dk )
See on oluline, kuid lihtne stabiliseerimissamm. Algse paberi autorid leidsid, et võtmemõõtme `d_k` suurte väärtuste korral võisid punktkorrutised kasvada väga suureks. Kui need suured arvud söödeti softmax-funktsiooni (meie järgmine samm), võisid nad seda suruda piirkondadesse, kus selle gradiendid on äärmiselt väikesed. See nähtus, tuntud kui kaduvad gradiendid, võib muuta mudeli treenimise keeruliseks.
Selle vastu võitlemiseks skaleerime skoore, jagades need võtmevektorite mõõtme ruutjuurega, √dk. See hoiab skooride dispersiooni 1-l, tagades stabiilsemad gradiendid kogu treeningu vältel.
3. samm: Softmaxi rakendamine (softmax(...))
Meil on nüüd skaleeritud joondusskooride maatriks, kuid need skoorid on meelevaldsed. Et muuta need tõlgendatavateks ja kasulikeks, rakendame softmax-funktsiooni igale reale. Softmax-funktsioon teeb kaks asja:
- See teisendab kõik skoorid positiivseteks arvudeks.
- See normaliseerib need nii, et iga rea skooride summa on 1.
Selle sammu väljundiks on tähelepanukaalude maatriks. Iga rida esindab nüüd tõenäosusjaotust, mis ütleb meile, kui palju tähelepanu peaks selle rea positsioonil olev sõna pöörama igale teisele sõnale järjestuses. Kaal 0.9 sõna "laev" puhul rea "seilas" jaoks tähendab, et "seilas" uue esituse arvutamisel tuleb 90% teabest "laevast".
4. samm: Kaalutud summa arvutamine ( * V )
Viimane samm on kasutada neid tähelepanukaalusid, et luua iga sõna jaoks uus, kontekstiteadlik esitus. Teeme seda, korrutades tähelepanukaalude maatriksi Väärtuse maatriksiga `V`.
- Sisend: Tähelepanukaalude maatriks `(sequence_length, sequence_length)` ja Väärtuse maatriks `V` `(sequence_length, d_v)`.
- Tehing: `weights * V`
- Väljund: Lõplik väljundmaatriks kujuga `(sequence_length, d_v)`.
Iga sõna (iga rea) jaoks on selle uus esitus kõigi järjestuse Väärtuse vektorite kaalutud summa. Kõrgema tähelepanukaaluga sõnad panustavad sellesse summasse rohkem. Tulemuseks on ümbriste komplekt, kus iga sõna vektor ei ole mitte ainult selle enda tähendus, vaid segu selle tähendusest ja sõnade tähendustest, millele see tähelepanu pööras. See on nüüd rikas kontekstiga.
Praktiline koodinäide: Skaleeritud punktkorrutise tähelepanu PyTorchis
Teooriat on kõige parem mõista praktika kaudu. Siin on lihtne, kommenteeritud Skaleeritud Punktkorrutise Tähelepanu mehhanismi implementatsioon Pythonis ja PyTorchi teegis, mis on populaarne raamistik süvaõppeks.
import torch
import torch.nn as nn
import math
class ScaledDotProductAttention(nn.Module):
""" Implements the Scaled Dot-Product Attention mechanism. """
def __init__(self):
super(ScaledDotProductAttention, self).__init__()
def forward(self, q, k, v, mask=None):
# q, k, v must have the same dimension d_k = d_v = d_model / h
# In practice, these tensors will also have a batch dimension and head dimension.
# For clarity, let's assume shape [batch_size, num_heads, seq_len, d_k]
d_k = k.size(-1) # Get the dimension of the key vectors
# 1. Calculate Similarity Scores: (Q * K^T)
# Matmul for the last two dimensions: (seq_len, d_k) * (d_k, seq_len) -> (seq_len, seq_len)
scores = torch.matmul(q, k.transpose(-2, -1))
# 2. Scale the scores
scaled_scores = scores / math.sqrt(d_k)
# 3. (Optional) Apply mask to prevent attention to certain positions
# The mask is crucial in the decoder to prevent attending to future tokens.
if mask is not None:
# Fills elements of self tensor with -1e9 where mask is True.
scaled_scores = scaled_scores.masked_fill(mask == 0, -1e9)
# 4. Apply Softmax to get attention weights
# Softmax is applied on the last dimension (the keys) to get a distribution.
attention_weights = torch.softmax(scaled_scores, dim=-1)
# 5. Compute the Weighted Sum: (weights * V)
# Matmul for the last two dimensions: (seq_len, seq_len) * (seq_len, d_v) -> (seq_len, d_v)
output = torch.matmul(attention_weights, v)
return output, attention_weights
Taseme tõstmine: Mitme pea tähelepanu
Skaleeritud Punktkorrutise Tähelepanu mehhanism on võimas, kuid sellel on piirang. See arvutab ühe tähelepanukaalude komplekti, sundides seda oma fookust keskmistama. Üksik tähelepanumehhanism võib õppida keskenduma näiteks subjekti-verbi suhetele. Aga kuidas on lood teiste suhetega, nagu asesõna-eelnõu või stilistilised nüansid?
Siin tuleb appi Mitme pea tähelepanu (Multi-Head Attention). Selle asemel, et teha üksik tähelepanu arvutus, käitab see tähelepanumehhanismi mitu korda paralleelselt ja seejärel kombineerib tulemused.
"Miks": Mitmekesiste suhete jäädvustamine
Mõelge sellele kui ekspertide komiteele, mitte ühele üldspetsialistile. Iga "pea" Mitme Pea Tähelepanus võib olla mõistetav kui ekspert, kes õpib keskenduma sisendandmete erinevale suhete tüübile või aspektile.
Lauses: "Loom ei ületanud tänavat, sest see oli liiga väsinud,"
- Pea 1 võib õppida siduma asesõna "see" tagasi oma eelnõuga "loom".
- Pea 2 võib õppida põhjuse-tagajärje seoseid "ei ületanud" ja "väsinud" vahel.
- Pea 3 võib haarata süntaktilise seose verbi "oli" ja selle subjekti "see" vahel.
Mitme pea (algne Transformeri artikkel kasutas 8) olemasolu võimaldab mudelil samaaegselt jäädvustada rikkalikku hulka süntaktilisi ja semantilisi seoseid andmete sees, mis viib palju nüansirikkama ja võimsama esituseni.
"Kuidas": Jagamine, Tähelepanu, Konkateneerimine, Projektsioon
Mitme pea tähelepanu rakendamine järgib neljaastmelist protsessi:
- Lineaarsed projektsioonid: Sisendümbrised läbitakse kolme eraldi lineaarkihi kaudu, et luua esialgsed Päringu, Võtme ja Väärtuse maatriksid. Need jagatakse seejärel `h` väiksemaks osaks (üks iga pea jaoks). Näiteks, kui teie mudeli dimensioon `d_model` on 512 ja teil on 8 pead, töötab iga pea Q, K ja V vektoritega dimensiooniga 64 (512 / 8).
- Paralleelne tähelepanu: Varem käsitletud Skaleeritud Punktkorrutise Tähelepanu mehhanismi rakendatakse sõltumatult ja paralleelselt igale `h` Q, K ja V alamruumide komplektile. See annab tulemuseks `h` eraldi tähelepanu väljundmaatriksit.
- Konkateneerimine: `h` väljundmaatriksit ühendatakse tagasi üheks suureks maatriksiks. Meie näites ühendataks 8 maatriksit suurusega 64, et moodustada üks maatriks suurusega 512.
- Lõplik projektsioon: See konkateneeritud maatriks läbitakse veel ühe lineaarkihi kaudu. See kiht võimaldab mudelil õppida, kuidas kõige paremini kombineerida erinevate peade poolt õpitud teavet, luues ühtse lõppväljundi.
Koodi implementatsioon: Mitme pea tähelepanu PyTorchis
Tuginedes meie eelmisele koodile, on siin Mitme Pea Tähelepanu ploki standardne implementatsioon.
class MultiHeadAttention(nn.Module):
""" Implements the Multi-Head Attention mechanism. """
def __init__(self, d_model, num_heads):
super(MultiHeadAttention, self).__init__()
assert d_model % num_heads == 0, "d_model must be divisible by num_heads"
self.d_model = d_model
self.num_heads = num_heads
self.d_k = d_model // num_heads
# Linear layers for Q, K, V and the final output
self.W_q = nn.Linear(d_model, d_model)
self.W_k = nn.Linear(d_model, d_model)
self.W_v = nn.Linear(d_model, d_model)
self.W_o = nn.Linear(d_model, d_model)
self.attention = ScaledDotProductAttention()
def forward(self, q, k, v, mask=None):
batch_size = q.size(0)
# 1. Apply linear projections
q, k, v = self.W_q(q), self.W_k(k), self.W_v(v)
# 2. Reshape for multi-head attention
# (batch_size, seq_len, d_model) -> (batch_size, num_heads, seq_len, d_k)
q = q.view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)
k = k.view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)
v = v.view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)
# 3. Apply attention on all heads in parallel
context, _ = self.attention(q, k, v, mask=mask)
# 4. Concatenate heads and apply final linear layer
# (batch_size, num_heads, seq_len, d_k) -> (batch_size, seq_len, num_heads, d_k)
context = context.transpose(1, 2).contiguous()
# (batch_size, seq_len, num_heads, d_k) -> (batch_size, seq_len, d_model)
context = context.view(batch_size, -1, self.d_model)
output = self.W_o(context)
return output
Globaalne mõju: Miks see mehhanism on mängu muutja
Tähelepanu põhimõtted ei piirdu loomuliku keele töötlemisega. See mehhanism on osutunud mitmekülgseks ja võimsaks tööriistaks paljudes valdkondades, edendades arengut globaalses mastaabis.
- Keelebarjääride murdmine: Masintõlkes võimaldab tähelepanu mudelil luua otseseid, mittelineaarseid joondusi sõnade vahel erinevates keeltes. Näiteks saab see õigesti kaardistada prantsuse fraasi "la voiture bleue" inglise keelde "the blue car", käsitledes erinevaid omadussõna paigutusi graatsiliselt.
- Otsingu ja kokkuvõtte loomise toetamine: Ülesannete puhul, nagu pika dokumendi kokkuvõtte tegemine või selle kohta küsimusele vastamine, võimaldab enesetähelepanu mudelil tuvastada kõige olulisemad laused ja kontseptsioonid, mõistes nendevaheliste suhete keerulist võrku.
- Teaduse ja meditsiini edendamine: Lisaks tekstile kasutatakse tähelepanu keeruliste koostoimete modelleerimiseks teaduslikes andmetes. Genoomikas saab see modelleerida sõltuvusi DNA ahela kaugete aluspaaride vahel. Ravimite avastamises aitab see ennustada valkude vahelisi koostoimeid, kiirendades uute ravimeetodite uurimist.
- Arvutinägemise revolutsioon: Vision Transformerite (ViT) tulekuga on tähelepanumehhanism nüüd tänapäevase arvutinägemise nurgakivi. Koheldes pilti plaastrite järjestusena, võimaldab enesetähelepanu mudelil mõista pildi erinevate osade vahelisi seoseid, mis viib tipptasemel jõudluseni piltide klassifitseerimisel ja objektide tuvastamisel.
Järeldus: Tulevik on tähelepanelik
Teekond fookuse intuitiivsest kontseptsioonist Mitme Pea Tähelepanu praktilise rakendamiseni paljastab mehhanismi, mis on nii võimas kui ka sügavalt loogiline. See on võimaldanud tehisintellekti mudelitel töödelda teavet mitte jäiga järjestusena, vaid paindliku, omavahel ühendatud suhete võrgustikuna. See Transformeri arhitektuuriga sisse viidud vaatenurga muutus on avanud enneolematud võimalused tehisintellektis.
Mõistes, kuidas tähelepanumehhanismi rakendada ja tõlgendada, mõistate tänapäevase tehisintellekti põhilist ehitusplokki. Kuna uuringud jätkuvad, ilmuvad kahtlemata uued ja tõhusamad tähelepanu variatsioonid, kuid põhiprintsiip – selektiivselt keskendumine kõige olulisemale – jääb keskseks teemaks pidevas püüdluses intelligentsemate ja võimekamate süsteemide poole.