How to Generate Sinusförmiges Positions-Encoding
Swipe um das Menü anzuzeigen
Sinusförmige Positionskodierung ermöglicht es dem Transformer-Modell, die Wortreihenfolge und Position zu erfassen, obwohl es keine rekurrenten oder sequenzbewussten Schichten verwendet. Jede Position wird durch ein einzigartiges Muster von Sinus- und Kosinuswerten dargestellt, die sich über die Einbettungsdimensionen verteilen.
Im Folgenden betrachten wir den Code dazu.
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)
Der Code zur Erzeugung der sinusförmigen Positionskodierung lässt sich Schritt für Schritt nachvollziehen:
1. Erstellen des Positionsarrays
position = np.arange(seq_length)[:, np.newaxis]
- Erstellt einen Spaltenvektor, bei dem jede Zeile eine Position in der Eingabesequenz darstellt, beginnend bei 0.
- Bei einer Sequenz mit sechs Tokens sieht dieses Array als Spalte wie folgt aus:
[0, 1, 2, 3, 4, 5].
2. Berechnung des Frequenzskalierungsfaktors
div_term = np.exp(
np.arange(0, embed_dim, 2) * -(np.log(10000.0) / embed_dim)
)
- Berechnet einen Skalierungsfaktor für jede gerade Einbettungsdimension.
- Die Skalierung sorgt dafür, dass jede Dimension eine andere Frequenz erhält, sodass die Kodierung sowohl kurz- als auch langfristige Positionsmuster erfassen kann.
- Die Verwendung von
10000.0verteilt die Frequenzen, sodass Positionsänderungen jede Dimension unterschiedlich beeinflussen.
3. Initialisierung der Positionskodierungsmatrix
pe = np.zeros((seq_length, embed_dim))
- Erstellt eine mit Nullen gefüllte Matrix mit einer Zeile pro Position und einer Spalte pro Einbettungsdimension.
4. Befüllen der Matrix mit Sinus- und Kosinuswerten
pe[:, 0::2] = np.sin(position * div_term)
pe[:, 1::2] = np.cos(position * div_term)
- Für gerade Spalten wird der Sinus von
position * div_termeingetragen. - Für ungerade Spalten wird der Kosinus von
position * div_termeingetragen. - Durch diesen Wechsel erhält jede Position eine einzigartige Kombination von Werten, und das Muster verändert sich gleichmäßig über Positionen und Dimensionen hinweg.
5. Rückgabe der Positionskodierung
return pe
- Die resultierende Matrix liefert eine eindeutige Kodierung für jede Position in der Sequenz.
- Diese Kodierung kann zu den Wort-Embeddings addiert werden, sodass das Transformer-Modell die Reihenfolge der Tokens erkennt.
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen
How to Generate Sinusförmiges Positions-Encoding
Sinusförmige Positionskodierung ermöglicht es dem Transformer-Modell, die Wortreihenfolge und Position zu erfassen, obwohl es keine rekurrenten oder sequenzbewussten Schichten verwendet. Jede Position wird durch ein einzigartiges Muster von Sinus- und Kosinuswerten dargestellt, die sich über die Einbettungsdimensionen verteilen.
Im Folgenden betrachten wir den Code dazu.
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)
Der Code zur Erzeugung der sinusförmigen Positionskodierung lässt sich Schritt für Schritt nachvollziehen:
1. Erstellen des Positionsarrays
position = np.arange(seq_length)[:, np.newaxis]
- Erstellt einen Spaltenvektor, bei dem jede Zeile eine Position in der Eingabesequenz darstellt, beginnend bei 0.
- Bei einer Sequenz mit sechs Tokens sieht dieses Array als Spalte wie folgt aus:
[0, 1, 2, 3, 4, 5].
2. Berechnung des Frequenzskalierungsfaktors
div_term = np.exp(
np.arange(0, embed_dim, 2) * -(np.log(10000.0) / embed_dim)
)
- Berechnet einen Skalierungsfaktor für jede gerade Einbettungsdimension.
- Die Skalierung sorgt dafür, dass jede Dimension eine andere Frequenz erhält, sodass die Kodierung sowohl kurz- als auch langfristige Positionsmuster erfassen kann.
- Die Verwendung von
10000.0verteilt die Frequenzen, sodass Positionsänderungen jede Dimension unterschiedlich beeinflussen.
3. Initialisierung der Positionskodierungsmatrix
pe = np.zeros((seq_length, embed_dim))
- Erstellt eine mit Nullen gefüllte Matrix mit einer Zeile pro Position und einer Spalte pro Einbettungsdimension.
4. Befüllen der Matrix mit Sinus- und Kosinuswerten
pe[:, 0::2] = np.sin(position * div_term)
pe[:, 1::2] = np.cos(position * div_term)
- Für gerade Spalten wird der Sinus von
position * div_termeingetragen. - Für ungerade Spalten wird der Kosinus von
position * div_termeingetragen. - Durch diesen Wechsel erhält jede Position eine einzigartige Kombination von Werten, und das Muster verändert sich gleichmäßig über Positionen und Dimensionen hinweg.
5. Rückgabe der Positionskodierung
return pe
- Die resultierende Matrix liefert eine eindeutige Kodierung für jede Position in der Sequenz.
- Diese Kodierung kann zu den Wort-Embeddings addiert werden, sodass das Transformer-Modell die Reihenfolge der Tokens erkennt.
Danke für Ihr Feedback!