Hur man genererar sinusformad positionskodning
Svep för att visa menyn
Sinusoidell positionskodning gör att transformer-modellen kan uppfatta ordningsföljd och position för ord, även om den inte använder rekurrens eller sekvensmedvetna lager. Varje position representeras av ett unikt mönster av sinus- och cosinusvärden fördelade över inbäddningsdimensionerna.
Vi tittar närmare på koden nedan.
1234567891011121314151617import numpy as np def get_sinusoidal_positional_encoding(seq_length, embed_dim): position = np.arange(seq_length)[:, np.newaxis] div_term = np.exp( np.arange(0, embed_dim, 2) * -(np.log(10000.0) / embed_dim) ) pe = np.zeros((seq_length, embed_dim)) pe[:, 0::2] = np.sin(position * div_term) pe[:, 1::2] = np.cos(position * div_term) return pe # Example usage: seq_length = 6 embed_dim = 8 encoding = get_sinusoidal_positional_encoding(seq_length, embed_dim) print(encoding)
Koden för att generera sinusoidell positionskodning kan förstås steg för steg:
1. Skapa positionsarrayen
position = np.arange(seq_length)[:, np.newaxis]
- Detta skapar en kolumnvektor där varje rad representerar en position i din inmatningssekvens, med start från 0.
- Om din sekvens har sex token kommer denna array att se ut som
[0, 1, 2, 3, 4, 5]som en kolumn.
2. Beräkna frekvensskalningstermen
div_term = np.exp(
np.arange(0, embed_dim, 2) * -(np.log(10000.0) / embed_dim)
)
- Detta beräknar en skalningsfaktor för varje jämn inbäddningsdimension.
- Skalningen säkerställer att varje dimension har en unik frekvens, vilket gör att kodningen kan fånga både kort- och långdistansmönster för position.
- Användningen av
10000.0sprider ut frekvenserna så att positionsförändringar påverkar varje dimension olika.
3. Initiera positionskodningsmatrisen
pe = np.zeros((seq_length, embed_dim))
- Detta skapar en matris fylld med nollor, med en rad för varje position och en kolumn för varje inbäddningsdimension.
4. Fyll matrisen med sinus- och cosinusvärden
pe[:, 0::2] = np.sin(position * div_term)
pe[:, 1::2] = np.cos(position * div_term)
- För jämna kolumner, fyll med sinus av
position * div_term. - För udda kolumner, fyll med cosinus av
position * div_term. - Denna växling innebär att varje position får en unik kombination av värden, och mönstret förändras mjukt över positioner och dimensioner.
5. Returnera positionskodningen
return pe
- Den resulterande matrisen ger en unik kodning för varje position i din sekvens.
- Denna kodning kan adderas till dina ordbäddningar så att transformer-modellen känner till ordningsföljden för token.
Var allt tydligt?
Tack för dina kommentarer!
Avsnitt 1. Kapitel 7
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
Avsnitt 1. Kapitel 7