Iepazīstiet moderno mākslīgā intelekta kodolu, izmantojot mūsu visaptverošo ceļvedi Transformeru uzmanības mehānisma ieviešanā. No teorijas līdz kodam.
Transfomers atšifrēšana: Dziļš ieskats uzmanības mehānisma ieviešanā
2017. gadā Google Brain pētnieku publicētais raksts "Attention Is All You Need" fundamentāli mainīja mākslīgā intelekta pasauli. Šajā rakstā tika iepazīstināts ar Transformeru arhitektūru – jaunu dizainu, kas pilnībā atteicās no rekurentiem un konvolūcijas slāņiem, kuri iepriekš dominēja sekvenču uzdevumos, piemēram, mašīntulkošanā. Šīs revolūcijas centrā bija spēcīgs, tomēr elegants koncepts: uzmanības mehānisms.
Šodien Transformeri ir gandrīz visu mūsdienīgo mākslīgā intelekta modeļu, sākot no lieliem valodu modeļiem kā GPT-4 un LLaMA, līdz pat datorredzes un zāļu atklāšanas progresīvajiem modeļiem, pamats. Izprast uzmanības mehānismu vairs nav obligāti mākslīgā intelekta speciālistiem; tas ir būtiski. Šis visaptverošais ceļvedis ir izstrādāts globālai izstrādātāju, datu zinātnieku un mākslīgā intelekta entuziastu auditorijai. Mēs demistificēsim uzmanības mehānismu, sadalot to no tā pamatprincipiem līdz praktiskai ieviešanai kodā. Mūsu mērķis ir sniegt jums izpratni un tehniskās prasmes, lai izprastu un izveidotu dzinēju, kas nodrošina moderno mākslīgo intelektu.
Kas ir uzmanība? Globāla intuīcija
Pirms iedziļināties matricās un formulās, izveidosim universālu izpratni. Iedomājieties, ka lasāt šo teikumu: "Kuģis, kas piepildīts ar kravu no vairākām starptautiskām ostām, gludi airēja pāri okeānam."
Lai izprastu vārda "airēja" nozīmi, jūsu smadzenes nepiešķir vienādu svaru visiem pārējiem vārdiem teikumā. Tās instinktīvi pievērš vairāk uzmanības vārdiem "kuģis" un "okeāns" nekā "kravai" vai "ostām". Šī selektīvā fokusēšanās – spēja dinamiski novērtēt dažādu informācijas daļu nozīmi, apstrādājot konkrētu elementu – ir uzmanības būtība.
Mākslīgā intelekta kontekstā uzmanības mehānisms ļauj modelim darīt to pašu. Apstrādājot vienu ievades sekvences daļu (piemēram, vārdu teikumā vai attēla fragmentu), tas var aplūkot visu sekvenci un noteikt, kuras citas daļas ir visatbilstošākās pašreizējās daļas izpratnei. Šī spēja tieši modelēt ilgtermiņa atkarības, neizlaižot informāciju secīgi caur rekurentu ķēdi, padara Transformerus tik spēcīgus un efektīvus.
Kodoliekārtas: Mērogota punktu uzmanības mehānisms
Visbiežākais uzmanības veids, ko izmanto Transformeru arhitektūrā, ir mērogota punktu uzmanība. Tās formula var sākotnēji šķist biedējoša, taču tā ir balstīta uz virkni loģisku soļu, kas skaisti atbilst mūsu izpratnei.
Formula ir: Attention(Q, K, V) = softmax( (QKT) / √dk ) * V
Sadalīsim to pa daļām, sākot ar trim galvenajiem ievades datiem.
Trīsvienība: Vaicājums, Atslēga un Vērtība (Q, K, V)
Lai ieviestu uzmanību, mēs pārveidojam mūsu ievades datus (piemēram, vārdu ietveršanu) trīs atšķirīgās reprezentācijās: Vaicājumi, Atslēgas un Vērtības. Domājiet par to kā par izgūšanas sistēmu, līdzīgi kā meklēt informāciju digitālā bibliotēkā:
- Vaicājums (Q): Tas pārstāv pašreizējo objektu, uz kuru jūs koncentrējaties. Tas ir jūsu jautājums. Konkrētam vārdam tā Vaicājuma vektors jautā: "Kāda informācija atlikušajā teikumā ir man svarīga?"
- Atslēga (K): Katram elementam sekvencē ir Atslēgas vektors. Tas ir līdzīgs informācijas gabala nosaukumam, virsrakstam vai atslēgvārdam. Vaicājums tiks salīdzināts ar visām Atslēgām, lai atrastu vissvarīgākās.
- Vērtība (V): Katram elementam sekvencē ir arī Vērtības vektors. Tas satur faktisko saturu vai informāciju. Kad Vaicājums būs atradis vislabāk atbilstošās Atslēgas, mēs izgūsim to atbilstošās Vērtības.
Pašuzmanības gadījumā, kas ir mehānisms, ko izmanto Transformeru kodētājā un dekoderā, Vaicājumi, Atslēgas un Vērtības visas tiek ģenerētas no vienas un tās pašas ievades sekvences. Katrs teikuma vārds ģenerē savus Q, K un V vektorus, izlaižot caur trim atsevišķiem, apgūtiem lineāriem slāņiem. Tas ļauj modelim aprēķināt katra vārda uzmanību pret visiem citiem vārdiem tajā pašā teikumā.
Aspektu pa aspektam ieviešanas sadalījums
Izstaigāsim formulas operācijas, savienojot katru soli ar tā mērķi.
1. solis: Aprēķināt līdzības rādītājus (Q * KT)
Pirmais solis ir izmērīt, cik lielā mērā katrs Vaicājums sakrīt ar katru Atslēgu. Mēs to panākam, aprēķinot katra Vaicājuma vektora punktu produktu ar katru Atslēgas vektoru. Praksē tas tiek efektīvi veikts visai sekvencei, izmantojot vienu matricu reizinājumu: `Q` reizināts ar `K` transponēto (`K^T`).
- Ievade: Vaicājumu matrica `Q` ar izmēru `(sequence_length, d_q)` un Atslēgu matrica `K` ar izmēru `(sequence_length, d_k)`. Piezīme: `d_q` ir jābūt vienādam ar `d_k`.
- Operācija: `Q * K^T`
- Izvade: Uzmanības rādītāju matrica ar izmēru `(sequence_length, sequence_length)`. Elements `(i, j)` šajā matricā attēlo neapstrādātu līdzības rādītāju starp `i`-to vārdu (kā vaicājumu) un `j`-to vārdu (kā atslēgu). Augstāks rādītājs nozīmē spēcīgāku sakarību.
2. solis: Mērogot ( / √dk )
Šis ir svarīgs, bet vienkāršs stabilizācijas solis. Oriģinālā darba autori atklāja, ka lielām atslēgas dimensijas `d_k` vērtībām punktu produkti varēja ievērojami palielināties pēc apjoma. Kad šie lielie skaitļi tiek padoti softmax funkcijai (mūsu nākamais solis), tie var izspiest to uz reģioniem, kur tās gradienti ir ārkārtīgi mazi. Šī parādība, pazīstama kā izzūdošie gradienti, var padarīt modeli grūti apmācāmu.
Lai to kompensētu, mēs samazinām rādītājus, dalot tos ar atslēgas vektoru dimensijas laukuma sakni, √dk. Tas uztur rādītāju variāciju 1, nodrošinot stabilākus gradientus visā apmācības procesā.
3. solis: Lietot Softmax (softmax(...))
Tagad mums ir mērogota sakritības rādītāju matrica, taču šie rādītāji ir patvaļīgi. Lai padarītu tos saprotamus un noderīgus, mēs lietojam softmax funkciju katrai rindai. Softmax funkcija dara divas lietas:
- Tā visas likmes pārvērš pozitīvos skaitļos.
- Tā normalizē tās, lai katras rindas likmes summētos līdz 1.
Šī soļa rezultāts ir uzmanības svaru matrica. Katra rinda tagad attēlo varbūtības sadalījumu, norādot, cik daudz uzmanības vārdam attiecīgajā rindas pozīcijā vajadzētu pievērst katram citam vārdam sekvencē. Svars 0.9 vārdam "kuģis" rindā "airēja" nozīmē, ka, aprēķinot "airēja" jauno reprezentāciju, 90% informācijas nāks no "kuģis".
4. solis: Aprēķināt svērto summu ( * V )
Pēdējais solis ir izmantot šos uzmanības svarus, lai izveidotu jaunu, kontekstualizētu reprezentāciju katram vārdam. Mēs to darām, reizinot uzmanības svaru matricu ar Vērtību matricu `V`.
- Ievade: Uzmanības svaru matrica `(sequence_length, sequence_length)` un Vērtību matrica `V` `(sequence_length, d_v)`.
- Operācija: `weights * V`
- Izvade: Galīgā izvades matrica ar izmēru `(sequence_length, d_v)`.
Katram vārdam (kā katrai rindai) tā jaunā reprezentācija ir svērtā summa no visiem Vērtību vektoriem sekvencē. Vārdi ar augstākiem uzmanības svariem vairāk veicina šo summu. Rezultāts ir kopums iekļaušanas, kur katra vārda vektors ir ne tikai tā paša nozīme, bet arī tā nozīmes un to vārdu nozīmju sajaukums, kam tas pievērsa uzmanību. Tas tagad ir bagāts ar kontekstu.
Praktisks koda piemērs: Mērogota punktu uzmanības mehānisms PyTorch
Teorija vislabāk tiek saprasta praksē. Šeit ir vienkārša, komentēta Mērogota punktu uzmanības mehānisma ieviešana, izmantojot Python un PyTorch bibliotēku, populāru dziļās mācīšanās sistēmu.
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
Paaugstināšana: Daudzgalvu uzmanība
Mērogota punktu uzmanības mehānisms ir spēcīgs, taču tam ir ierobežojums. Tas aprēķina vienu uzmanības svaru kopumu, piespiežot to vidēji fokusēties. Viens uzmanības mehānisms varētu iemācīties fokusēties, piemēram, uz priekšmeta-darbības sakarībām. Bet kā ar citām sakarībām, piemēram, vietniekvārdu-priekštekstu vai stilistiskām niansēm?
Šeit Daudzgalvu uzmanība nāk talkā. Tā vietā, lai veiktu vienu uzmanības aprēķinu, tā paralēli palaida uzmanības mehānismu vairākas reizes un pēc tam apvienoja rezultātus.
"Kāpēc": Dažādu sakarību uztveršana
Padomājiet par to kā par ekspertu komiteju, nevis vienu ģenerālistu. Katru "galvu" Daudzgalvu uzmanībā var uzskatīt par ekspertu, kas iemācās fokusēties uz atšķirīgu sakarību tipu vai ievades datu aspektu.
Teikumam "Dzīvnieks nešķērsoja ielu, jo tas bija pārāk noguris,"
- Galva 1 varētu iemācīties saistīt vietniekvārdu "tas" ar tā priekštekstu "dzīvnieks".
- Galva 2 varētu iemācīties cēloņsakarību starp "nešķērsoja" un "noguris".
- Galva 3 varētu uztvert sintaktisko sakarību starp darbības vārdu "bija" un tā priekšmetu "tas".
Pateicoties vairākām galvām (oriģinālajā Transformeru darbā tika izmantotas 8), modelis var vienlaicīgi uztvert bagātīgu dažādu sintaktisko un semantisko sakarību klāstu datos, tādējādi nodrošinot daudz niansētāku un jaudīgāku reprezentāciju.
"Kā": Sadalīt, pievērst uzmanību, apvienot, projicēt
Daudzgalvu uzmanības ieviešana notiek četrās stadijās:
- Lineārās projekcijas: Ievades ietverumi tiek izlaisti caur trim atsevišķiem lineāriem slāņiem, lai izveidotu sākotnējos Vaicājumu, Atslēgu un Vērtību matricus. Pēc tam tie tiek sadalīti `h` mazākos gabalos (pa vienam katrai galvai). Piemēram, ja jūsu modeļa dimensija `d_model` ir 512 un jums ir 8 galvas, katra galva strādās ar Q, K un V vektoriem ar dimensiju 64 (512 / 8).
- Paralēla uzmanība: Iepriekš apskatītais Mērogota punktu uzmanības mehānisms tiek neatkarīgi un paralēli pielietots katram no `h` Q, K un V apakštelpu kopumiem. Tas rada `h` atsevišķas uzmanības izvades matricas.
- Apvienošana: `h` izvades matricas tiek apvienotas atpakaļ vienā lielā matricā. Mūsu piemērā 8 matricas ar izmēru 64 tiktu apvienotas, veidojot vienu matricu ar izmēru 512.
- Galīgā projekcija: Šī apvienotā matrica tiek izlaista caur vienu pēdējo lineāro slāni. Šis slānis ļauj modelim iemācīties, kā vislabāk apvienot dažādu galvu apgūto informāciju, radot vienotu galīgo izvadi.
Koda ieviešana: Daudzgalvu uzmanība PyTorch
Balstoties uz mūsu iepriekšējo kodu, šeit ir standarta Daudzgalvu uzmanības bloka ieviešana.
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
Globālā ietekme: Kāpēc šis mehānisms ir spēļu mainītājs
Uzmanības principi nav aprobežoti ar dabisko valodu apstrādi. Šis mehānisms ir izrādījies daudzpusīgs un spēcīgs rīks daudzās jomās, virzot progresu globālā mērogā.
- Valodu barjeru pārvarēšana: Mašīntulkošanā uzmanība ļauj modelim veikt tiešas, nelineāras saskaņošanas starp vārdiem dažādās valodās. Piemēram, tā var pareizi savienot franču frāzi "la voiture bleue" ar angļu "the blue car", veiksmīgi apstrādājot atšķirīgās īpašības vārdu sakārtojumus.
- Meklēšanas un kopsavilkumu darbināšana: Uzdevumos, piemēram, gariem dokumentiem veikt kopsavilkumu vai atbildēt uz jautājumu par to, pašu, pašuzmanība ļauj modelim identificēt visnozīmīgākās frāzes un koncepcijas, izprotot sarežģīto saišu tīklu starp tām.
- Zinātnes un medicīnas attīstība: Papildus tekstam, uzmanība tiek izmantota, lai modelētu sarežģītas mijiedarbības zinātniskos datos. Genomikā tā var modelēt atkarības starp DNS virknes attālajiem bāzes pāriem. Zāļu atklāšanā tā palīdz prognozēt mijiedarbību starp olbaltumvielām, paātrinot jaunu ārstēšanas metožu pētījumus.
- Datorredzes revolūcija: Ar Vision Transformers (ViT) parādīšanos, uzmanības mehānisms tagad ir moderno datorredzes stūrakmens. Attēlu uztverot kā fragmentu sekvenci, pašuzmanība ļauj modelim izprast attēla dažādo daļu savstarpējās attiecības, tādējādi panākot vismodernāko veiktspēju attēlu klasifikācijā un objektu atpazīšanā.
Secinājums: Nākotne ir uzmanīga
Ceļojums no intuitīvā fokusa koncepta līdz praktiskajai daudzgalvu uzmanības ieviešanai atklāj gan spēcīgu, gan dziļi loģisku mehānismu. Tas ir ļāvis mākslīgā intelekta modeļiem apstrādāt informāciju nevis kā stingru sekvenci, bet kā elastīgu, savstarpēji savienotu attiecību tīklu. Šī perspektīvas maiņa, ko ieviesa Transformeru arhitektūra, ir atklājusi nepieredzētas spējas mākslīgajā intelektā.
Izprotot, kā ieviest un interpretēt uzmanības mehānismu, jūs aptverat moderno mākslīgo intelektu veidojošos pamatkomponentu. Pētījumiem turpinot attīstīties, neapšaubāmi parādīsies jaunas un efektīvākas uzmanības variācijas, taču pamatprincips – selektīvi fokusēties uz to, kas ir vissvarīgākais – paliks centrālā tēma nepārtrauktajā centienos pēc viedākām un spējīgākām sistēmām.