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.
Tack för dina kommentarer!
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
Hur man genererar sinusformad positionskodning
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.
Tack för dina kommentarer!