Problème
La fonction softmax transforme une liste de scores (logits) en probabilités. Les modèles de langage s'en servent pour choisir le mot suivant :
softmax(x)_i = e^(x_i) / (e^(x_1) + e^(x_2) + … + e^(x_n))
De grands scores font déborder e^x : soustrayez d'abord le plus grand score de chaque score. Le résultat est mathématiquement identique.
Implémentez softmax(logits).
Entrée
logits : une liste de scores.
Sortie
Renvoyez la liste des probabilités, dans le même ordre. Elles sont toutes entre 0 et 1 et leur somme vaut 1.
Contraintes
1 ≤ longueur ≤ 1 000
-1 000 ≤ chaque score ≤ 1 000
Exemples
Entrée :
logits = [1.0, 2.0, 3.0]
Sortie attendue :
expected = [0.090031, 0.244728, 0.665241]
Entrée :
std::vector<double> logits = {1.0, 2.0, 3.0};
Sortie attendue :
std::vector<double> expected = {0.090031, 0.244728, 0.665241};
Entrée :
double[] logits = new double[] {1.0, 2.0, 3.0};
Sortie attendue :
double[] expected = new double[] {0.090031, 0.244728, 0.665241};
Explication
e¹ ≈ 2.718, e² ≈ 7.389 et e³ ≈ 20.086 font au total 30.193, donc les probabilités sont d'environ [0.090031, 0.244728, 0.665241].
Entrée :
logits = [1000.0, 1000.0]
Sortie attendue :
expected = [0.5, 0.5]
Entrée :
std::vector<double> logits = {1000.0, 1000.0};
Sortie attendue :
std::vector<double> expected = {0.5, 0.5};
Entrée :
double[] logits = new double[] {1000.0, 1000.0};
Sortie attendue :
double[] expected = new double[] {0.5, 0.5};
Explication
Calculer directement e^1000 provoque un dépassement de capacité. Soustraire le maximum donne [0, 0], et e⁰ / (e⁰ + e⁰) = 0.5 pour les deux.
Références
Ce défi a été adapté pour CodeUtility. Suivez l'énoncé et les contraintes ci-dessus.