Hvordan Man Genererer Sinusformet Positionskodning
Stryg for at vise menuen
Sinusoidal positionel kodning gør det muligt for transformer-modellen at opfatte rækkefølgen og positionen af ord, selvom den ikke anvender rekursive eller sekvensbevidste lag. Hver position repræsenteres af et unikt mønster af sinus- og cosinusværdier fordelt over embedding-dimensionerne.
Herunder ses et eksempel på koden.
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 til generering af sinusoidal positionel kodning kan forstås trin for trin:
1. Opret positions-array
position = np.arange(seq_length)[:, np.newaxis]
- Dette opretter en kolonnevektor, hvor hver række repræsenterer en position i inputsekvensen, startende fra 0.
- Hvis sekvensen har seks tokens, vil dette array se ud som
[0, 1, 2, 3, 4, 5]som en kolonne.
2. Beregn frekvensskaleringsfaktoren
div_term = np.exp(
np.arange(0, embed_dim, 2) * -(np.log(10000.0) / embed_dim)
)
- Dette beregner en skaleringsfaktor for hver lige embedding-dimension.
- Skaleringen sikrer, at hver dimension har en forskellig frekvens, hvilket gør det muligt for kodningen at opfange både kort- og langtrækkende positionsmønstre.
- Brug af
10000.0spreder frekvenserne ud, så ændringer i position påvirker hver dimension forskelligt.
3. Initialiser den positionelle kodningsmatrix
pe = np.zeros((seq_length, embed_dim))
- Dette opretter en matrix fyldt med nuller, med én række for hver position og én kolonne for hver embedding-dimension.
4. Udfyld matricen med sinus- og cosinusværdier
pe[:, 0::2] = np.sin(position * div_term)
pe[:, 1::2] = np.cos(position * div_term)
- For lige kolonner udfyldes med sinus til
position * div_term. - For ulige kolonner udfyldes med cosinus til
position * div_term. - Denne vekslen betyder, at hver position får en unik kombination af værdier, og mønsteret ændrer sig glidende på tværs af positioner og dimensioner.
5. Returnér den positionelle kodning
return pe
- Den resulterende matrix giver en unik kodning for hver position i sekvensen.
- Denne kodning kan lægges til word embeddings, så transformer-modellen kender rækkefølgen af tokens.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
Hvordan Man Genererer Sinusformet Positionskodning
Sinusoidal positionel kodning gør det muligt for transformer-modellen at opfatte rækkefølgen og positionen af ord, selvom den ikke anvender rekursive eller sekvensbevidste lag. Hver position repræsenteres af et unikt mønster af sinus- og cosinusværdier fordelt over embedding-dimensionerne.
Herunder ses et eksempel på koden.
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 til generering af sinusoidal positionel kodning kan forstås trin for trin:
1. Opret positions-array
position = np.arange(seq_length)[:, np.newaxis]
- Dette opretter en kolonnevektor, hvor hver række repræsenterer en position i inputsekvensen, startende fra 0.
- Hvis sekvensen har seks tokens, vil dette array se ud som
[0, 1, 2, 3, 4, 5]som en kolonne.
2. Beregn frekvensskaleringsfaktoren
div_term = np.exp(
np.arange(0, embed_dim, 2) * -(np.log(10000.0) / embed_dim)
)
- Dette beregner en skaleringsfaktor for hver lige embedding-dimension.
- Skaleringen sikrer, at hver dimension har en forskellig frekvens, hvilket gør det muligt for kodningen at opfange både kort- og langtrækkende positionsmønstre.
- Brug af
10000.0spreder frekvenserne ud, så ændringer i position påvirker hver dimension forskelligt.
3. Initialiser den positionelle kodningsmatrix
pe = np.zeros((seq_length, embed_dim))
- Dette opretter en matrix fyldt med nuller, med én række for hver position og én kolonne for hver embedding-dimension.
4. Udfyld matricen med sinus- og cosinusværdier
pe[:, 0::2] = np.sin(position * div_term)
pe[:, 1::2] = np.cos(position * div_term)
- For lige kolonner udfyldes med sinus til
position * div_term. - For ulige kolonner udfyldes med cosinus til
position * div_term. - Denne vekslen betyder, at hver position får en unik kombination af værdier, og mønsteret ændrer sig glidende på tværs af positioner og dimensioner.
5. Returnér den positionelle kodning
return pe
- Den resulterende matrix giver en unik kodning for hver position i sekvensen.
- Denne kodning kan lægges til word embeddings, så transformer-modellen kender rækkefølgen af tokens.
Tak for dine kommentarer!