Problème
L'attention ignore l'ordre des mots, donc le Transformer original ajoute un encodage positionnel à l'embedding de chaque token. Pour la position pos et la dimension j (toutes deux à partir de 0) dans un modèle de taille d_model :
- 'j pair : PE[pos][j] = sin(pos / 10000^(j / d_model))'
- 'j impair : PE[pos][j] = cos(pos / 10000^((j - 1) / d_model))'
Les dimensions 0 et 1 partagent donc une fréquence, les dimensions 2 et 3 la suivante, et ainsi de suite.
Implémentez positional_encoding(length, d_model).
Entrée
length : Le nombre de positions (de 0 à length - 1).
d_model : La taille de l'embedding.
Sortie
Renvoyez une matrice length × d_model.
Contraintes
1 ≤ length ≤ 200, 1 ≤ d_model ≤ 128
Exemples
Entrée :
length = 2
d_model = 4
Sortie attendue :
expected = [
[0.0, 1.0, 0.0, 1.0],
[0.841471, 0.540302, 0.01, 0.99995]
]
Entrée :
long long length = 2;
long long d_model = 4;
Sortie attendue :
std::vector<std::vector<double>> expected = {
{0.0, 1.0, 0.0, 1.0},
{0.841471, 0.540302, 0.01, 0.99995}
};
Entrée :
long length = 2;
long d_model = 4;
Sortie attendue :
double[][] expected = new double[][] {
new double[] {0.0, 1.0, 0.0, 1.0},
new double[] {0.841471, 0.540302, 0.01, 0.99995}
};
Explication
La position 0 vaut sin(0) = 0 et cos(0) = 1 pour chaque paire : [0, 1, 0, 1]. La position 1 utilise les fréquences 1 et 1 / 10000^(2/4) = 0.01 : [sin 1, cos 1, sin 0.01, cos 0.01] ≈ [0.841471, 0.540302, 0.01, 0.99995].
Entrée :
length = 3
d_model = 1
Sortie attendue :
expected = [
[0.0],
[0.841471],
[0.909297]
]
Entrée :
long long length = 3;
long long d_model = 1;
Sortie attendue :
std::vector<std::vector<double>> expected = {
{0.0},
{0.841471},
{0.909297}
};
Entrée :
long length = 3;
long d_model = 1;
Sortie attendue :
double[][] expected = new double[][] {
new double[] {0.0},
new double[] {0.841471},
new double[] {0.909297}
};
Explication
Avec une seule dimension, seul sin(pos) est utilisé : [[0], [0.841471], [0.909297]].
Références
Ce défi a été adapté pour CodeUtility. Suivez l'énoncé et les contraintes ci-dessus.