Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Hvordan Generere Sinusformet Posisjonskoding | Forståelse av transformer-grunnprinsipper
Transformers for Naturlig Språkprosessering

bookHvordan Generere Sinusformet Posisjonskoding

Sveip for å vise menyen

Sinusoidal posisjonskoding gjør at transformer-modellen kan oppfatte ordrekkefølge og posisjon, selv om den ikke bruker rekurrens eller sekvensbevisste lag. Hver posisjon representeres av et unikt mønster av sinus- og cosinusverdier fordelt over de ulike dimensjonene i embedding-vektoren.

La oss se nærmere på koden nedenfor.

1234567891011121314151617
import 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)
copy

Koden for å generere sinusoidal posisjonskoding kan forstås steg for steg:

1. Opprett posisjonsarray

position = np.arange(seq_length)[:, np.newaxis]
  • Dette lager en kolonnevektor hvor hver rad representerer en posisjon i inndata-sekvensen, med start fra 0.
  • Hvis sekvensen har seks tokens, vil denne arrayen se ut 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 partalls embedding-dimensjon.
  • Skaleringen sørger for at hver dimensjon har ulik frekvens, slik at kodingen fanger opp både kort- og langdistansemønstre for posisjon.
  • Bruken av 10000.0 sprer frekvensene, slik at endringer i posisjon påvirker hver dimensjon forskjellig.

3. Initialiser posisjonskodingsmatrisen

pe = np.zeros((seq_length, embed_dim))
  • Dette lager en matrise fylt med nuller, med én rad for hver posisjon og én kolonne for hver embedding-dimensjon.

4. Fyll matrisen med sinus- og cosinusverdier

pe[:, 0::2] = np.sin(position * div_term)
pe[:, 1::2] = np.cos(position * div_term)
  • For partallskolonner fylles det inn sinus til position * div_term.
  • For oddetallskolonner fylles det inn cosinus til position * div_term.
  • Denne vekslingen gir hver posisjon en unik kombinasjon av verdier, og mønsteret endres jevnt over posisjoner og dimensjoner.

5. Returner posisjonskodingen

return pe
  • Den resulterende matrisen gir en unik koding for hver posisjon i sekvensen.
  • Denne kodingen kan legges til ord-embeddingene slik at transformer-modellen får informasjon om rekkefølgen på tokens.
question mark

Hvilke av følgende påstander om sinusoidal posisjonskoding er sanne?

Velg alle riktige svar

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 1. Kapittel 7

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Seksjon 1. Kapittel 7
some-alt