Miten Itsehuomio Lasketaan
Pyyhkäise näyttääksesi valikon
Jotta ymmärtäisit, miten itsehuomio (self-attention) lasketaan transformereissa, tulee noudattaa tarkkaa matemaattisten operaatioiden järjestystä. Itsehuomiomekanismi mahdollistaa sen, että jokainen sana lauseessa voi kiinnittää huomiota muihin sanoihin tuottaessaan ulostuloesitystä. Tämä saavutetaan laskemalla kaikkien syötevektorien painotettu summa, jossa painot kuvaavat kunkin sanan merkitystä käsiteltävälle sanalle.
Oletetaan, että sinulla on lyhyt lause, joka on esitetty matriisina, jossa jokainen rivi on sanan upotus (embedding). Ensin projisoit nämä upotukset kyselyiksi (queries), avaimiksi (keys) ja arvoiksi (values) opittujen painomatriisien avulla. Itsehuomion ydin on sitten huomioarvojen laskeminen ja arvovektorien yhdistäminen näiden arvojen perusteella.
Kyselyt (queries), avaimet (keys) ja arvot (values) ovat syötteen eri esitysmuotoja, joilla kullakin on oma roolinsa huomion laskennassa.
Itsehuomion laskenta
Itsehuomio voidaan jakaa selkeisiin matemaattisiin vaiheisiin jokaiselle sanalle sekvenssissä:
Syötteiden projektointi kyselyiksi, avaimiksi ja arvoiksi: projektoi syötematriisi opittujen painomatriisien avulla saadaksesi kyselyt, avaimet ja arvot.
123456789101112131415161718192021222324252627282930313233import numpy as np # Example input: 3 words, embedding size 4 X = np.array([ [1.0, 0.0, 1.0, 0.0], # word 1 [0.0, 2.0, 0.0, 2.0], # word 2 [1.0, 1.0, 1.0, 1.0] # word 3 ]) # Weight matrices for queries, keys, values (embedding size 4 -> 4) W_q = np.array([ [0.1, 0.2, 0.0, 0.0], [0.0, 0.1, 0.3, 0.0], [0.1, 0.0, 0.0, 0.2], [0.0, 0.0, 0.2, 0.3] ]) W_k = np.array([ [0.2, 0.0, 0.1, 0.0], [0.0, 0.1, 0.0, 0.3], [0.1, 0.0, 0.2, 0.0], [0.0, 0.2, 0.0, 0.1] ]) W_v = np.array([ [0.0, 0.1, 0.0, 0.2], [0.2, 0.0, 0.2, 0.0], [0.0, 0.3, 0.1, 0.0], [0.1, 0.0, 0.0, 0.3] ]) # Compute queries, keys, values Q = X @ W_q K = X @ W_k V = X @ W_v
Laske huomioarvot:
- Laske jokaisen kyselyn ja kaikkien avainten välinen samankaltaisuus;
- Nämä arvot osoittavat, kuinka paljon huomiota kukin sana kohdistaa muihin.
1scores = Q @ K.T
Skaalaa pisteet: jaa huomioarvot avaimen ulottuvuuden neliöjuurella. Tämä skaalaus auttaa vakauttamaan gradientit koulutuksen aikana.
12d_k = Q.shape[1] scaled_scores = scores / np.sqrt(d_k)
Sovella softmax-funktio: skaalaamalla saadut pisteet muunnetaan huomioarvoiksi softmax-funktion avulla. Tämä varmistaa, että painot ovat positiivisia ja niiden summa on 1 jokaiselle sanalle.
123456# Softmax to get attention weights def softmax(x): e_x = np.exp(x - np.max(x, axis=-1, keepdims=True)) return e_x / np.sum(e_x, axis=-1, keepdims=True) attention_weights = softmax(scaled_scores)
Laske arvojen painotettu summa: käytä huomioarvoja arvektoreiden painotetun summan laskemiseen. Tämä tuottaa lopullisen self-attention-tuloksen jokaiselle sanalle.
12345# Weighted sum of values output = attention_weights @ V print("Attention weights:\n", attention_weights) print("Self-attention output:\n", output)
Nämä vaiheet kuvaavat olennaiset laskutoimitukset, jotka liittyvät self-attention-mekanismin toimintaan transformer-malleissa.
1. Mikä on oikea toimintojen järjestys self-attentionissa yhdelle syötesanalle?
2. Miksi skaalaamme huomioarvot avainulottuvuuden neliöjuurella?
3. Mitkä vektorit käytetään huomioarvojen laskemiseen
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme