Alle Herausforderungen
Mittel 0 gelöst 0% Erfolgsquote

Sinusförmige Positionskodierung

Berechne die Sinus- und Kosinus-Positionsvektoren, die Transformer zu den Token-Embeddings addieren.

Das lernst du

  • Sinus- und Kosinus-Positionsvektoren berechnen
  • Pro Dimension unterschiedliche Frequenzen verwenden
  • Verstehen, wie Transformer die Wortreihenfolge kennen

Problem

Attention ignoriert die Wortreihenfolge, deshalb addiert der ursprüngliche Transformer zu jedem Token-Embedding eine Positionskodierung. Für Position pos und Dimension j (beide ab 0) in einem Modell der Größe d_model:

  • 'gerades j: PE[pos][j] = sin(pos / 10000^(j / d_model))'
  • 'ungerades j: PE[pos][j] = cos(pos / 10000^((j - 1) / d_model))'

Die Dimensionen 0 und 1 teilen sich also eine Frequenz, die Dimensionen 2 und 3 die nächste, und so weiter.

Implementiere positional_encoding(length, d_model).

Eingabe

length: Die Anzahl der Positionen (0 bis length - 1).

d_model: Die Embedding-Größe.

Ausgabe

Gib eine length × d_model-Matrix zurück.

Einschränkungen

1 ≤ length ≤ 200, 1 ≤ d_model ≤ 128

Beispiele

Beispiel 1
Eingabe:
length = 2
d_model = 4

Erwartete Ausgabe:
expected = [
    [0.0, 1.0, 0.0, 1.0],
    [0.841471, 0.540302, 0.01, 0.99995]
]
Eingabe:
long long length = 2;
long long d_model = 4;

Erwartete Ausgabe:
std::vector<std::vector<double>> expected = {
    {0.0, 1.0, 0.0, 1.0},
    {0.841471, 0.540302, 0.01, 0.99995}
};
Eingabe:
long length = 2;
long d_model = 4;

Erwartete Ausgabe:
double[][] expected = new double[][] {
    new double[] {0.0, 1.0, 0.0, 1.0},
    new double[] {0.841471, 0.540302, 0.01, 0.99995}
};

Erläuterung

Position 0 ist für jedes Paar sin(0) = 0 und cos(0) = 1: [0, 1, 0, 1]. Position 1 verwendet die Frequenzen 1 und 1 / 10000^(2/4) = 0.01: [sin 1, cos 1, sin 0.01, cos 0.01] ≈ [0.841471, 0.540302, 0.01, 0.99995].

Beispiel 2
Eingabe:
length = 3
d_model = 1

Erwartete Ausgabe:
expected = [
    [0.0],
    [0.841471],
    [0.909297]
]
Eingabe:
long long length = 3;
long long d_model = 1;

Erwartete Ausgabe:
std::vector<std::vector<double>> expected = {
    {0.0},
    {0.841471},
    {0.909297}
};
Eingabe:
long length = 3;
long d_model = 1;

Erwartete Ausgabe:
double[][] expected = new double[][] {
    new double[] {0.0},
    new double[] {0.841471},
    new double[] {0.909297}
};

Erläuterung

Mit nur einer Dimension wird nur sin(pos) verwendet: [[0], [0.841471], [0.909297]].

Referenzen

Diese Aufgabe wurde für CodeUtility angepasst. Beachte die oben genannten Vorgaben und Einschränkungen.

Von anderen lernen

Community-Lösungen

Noch keine veröffentlichten Lösungen. Löse die Aufgabe und teile als Erster eine Lösung.