Tutte le sfide
Media 0 risolte 0% di accettazione

Codifica posizionale sinusoidale

Calcola i vettori di posizione seno e coseno che i Transformer sommano agli embedding dei token.

Cosa imparerai

  • Calcolare vettori di posizione con seno e coseno
  • Usare frequenze diverse per ogni dimensione
  • Capire come i Transformer conoscono l'ordine delle parole

Problema

L'attenzione ignora l'ordine delle parole, quindi il Transformer originale somma una codifica posizionale all'embedding di ogni token. Per la posizione pos e la dimensione j (entrambe da 0) in un modello di dimensione d_model:

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

Quindi le dimensioni 0 e 1 condividono una frequenza, le dimensioni 2 e 3 la successiva, e così via.

Implementa positional_encoding(length, d_model).

Input

length: Il numero di posizioni (da 0 a length - 1).

d_model: La dimensione dell'embedding.

Output

Restituisci una matrice length × d_model.

Vincoli

1 ≤ length ≤ 200, 1 ≤ d_model ≤ 128

Esempi

Esempio 1
Input:
length = 2
d_model = 4

Output atteso:
expected = [
    [0.0, 1.0, 0.0, 1.0],
    [0.841471, 0.540302, 0.01, 0.99995]
]
Input:
long long length = 2;
long long d_model = 4;

Output atteso:
std::vector<std::vector<double>> expected = {
    {0.0, 1.0, 0.0, 1.0},
    {0.841471, 0.540302, 0.01, 0.99995}
};
Input:
long length = 2;
long d_model = 4;

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

Spiegazione

La posizione 0 vale sin(0) = 0 e cos(0) = 1 per ogni coppia: [0, 1, 0, 1]. La posizione 1 usa le frequenze 1 e 1 / 10000^(2/4) = 0.01: [sin 1, cos 1, sin 0.01, cos 0.01] ≈ [0.841471, 0.540302, 0.01, 0.99995].

Esempio 2
Input:
length = 3
d_model = 1

Output atteso:
expected = [
    [0.0],
    [0.841471],
    [0.909297]
]
Input:
long long length = 3;
long long d_model = 1;

Output atteso:
std::vector<std::vector<double>> expected = {
    {0.0},
    {0.841471},
    {0.909297}
};
Input:
long length = 3;
long d_model = 1;

Output atteso:
double[][] expected = new double[][] {
    new double[] {0.0},
    new double[] {0.841471},
    new double[] {0.909297}
};

Spiegazione

Con una sola dimensione si usa solo sin(pos): [[0], [0.841471], [0.909297]].

Riferimenti

Questa sfida è adattata per CodeUtility. Segui la traccia e i vincoli sopra.

Impara dagli altri

Soluzioni della community

Nessuna soluzione pubblicata. Risolvi questa sfida per condividere la prima.