Problema
La función softmax convierte una lista de puntuaciones (logits) en probabilidades. Los modelos de lenguaje la usan para elegir la siguiente palabra:
softmax(x)_i = e^(x_i) / (e^(x_1) + e^(x_2) + … + e^(x_n))
Las puntuaciones grandes hacen que e^x se desborde, así que primero resta la puntuación más alta a todas las puntuaciones. El resultado es matemáticamente el mismo.
Implementa softmax(logits).
Entrada
logits: Una lista de puntuaciones.
Salida
Devuelve la lista de probabilidades en el mismo orden. Todas están entre 0 y 1 y suman 1.
Restricciones
1 ≤ longitud ≤ 1000
-1000 ≤ cada puntuación ≤ 1000
Ejemplos
Entrada:
logits = [1.0, 2.0, 3.0]
Salida esperada:
expected = [0.090031, 0.244728, 0.665241]
Entrada:
std::vector<double> logits = {1.0, 2.0, 3.0};
Salida esperada:
std::vector<double> expected = {0.090031, 0.244728, 0.665241};
Entrada:
double[] logits = new double[] {1.0, 2.0, 3.0};
Salida esperada:
double[] expected = new double[] {0.090031, 0.244728, 0.665241};
Explicación
e¹ ≈ 2.718, e² ≈ 7.389 y e³ ≈ 20.086 suman 30.193, así que las probabilidades son aproximadamente [0.090031, 0.244728, 0.665241].
Entrada:
logits = [1000.0, 1000.0]
Salida esperada:
expected = [0.5, 0.5]
Entrada:
std::vector<double> logits = {1000.0, 1000.0};
Salida esperada:
std::vector<double> expected = {0.5, 0.5};
Entrada:
double[] logits = new double[] {1000.0, 1000.0};
Salida esperada:
double[] expected = new double[] {0.5, 0.5};
Explicación
Calcular e^1000 directamente produce desbordamiento. Restar el máximo da [0, 0], y e⁰ / (e⁰ + e⁰) = 0.5 para ambos.
Referencias
Este reto está adaptado para CodeUtility. Sigue el enunciado y las restricciones indicadas arriba.