Функция softmax превращает список оценок (логитов) в вероятности. Языковые модели используют её, чтобы выбрать следующее слово:
softmax(x)_i = e^(x_i) / (e^(x_1) + e^(x_2) + … + e^(x_n))
При больших оценках e^x переполняется, поэтому сначала вычтите из каждой оценки наибольшую. Математически результат тот же.
Реализуйте softmax(logits).
Входные данные
logits: список оценок.
Выходные данные
Верните список вероятностей в том же порядке. Все они лежат между 0 и 1 и в сумме дают 1.
Ограничения
1 ≤ длина ≤ 1000
-1000 ≤ каждая оценка ≤ 1000
Примеры
Ввод:
logits = [1.0, 2.0, 3.0]
Ожидаемый вывод:
expected = [0.090031, 0.244728, 0.665241]
Ввод:
std::vector<double> logits = {1.0, 2.0, 3.0};
Ожидаемый вывод:
std::vector<double> expected = {0.090031, 0.244728, 0.665241};
Ввод:
double[] logits = new double[] {1.0, 2.0, 3.0};
Ожидаемый вывод:
double[] expected = new double[] {0.090031, 0.244728, 0.665241};
Пояснение
e¹ ≈ 2.718, e² ≈ 7.389 и e³ ≈ 20.086 в сумме дают 30.193, поэтому вероятности примерно равны [0.090031, 0.244728, 0.665241].
Ввод:
logits = [1000.0, 1000.0]
Ожидаемый вывод:
expected = [0.5, 0.5]
Ввод:
std::vector<double> logits = {1000.0, 1000.0};
Ожидаемый вывод:
std::vector<double> expected = {0.5, 0.5};
Ввод:
double[] logits = new double[] {1000.0, 1000.0};
Ожидаемый вывод:
double[] expected = new double[] {0.5, 0.5};
Пояснение
Прямое вычисление e^1000 приводит к переполнению. После вычитания максимума получается [0, 0], и e⁰ / (e⁰ + e⁰) = 0.5 для обоих.
Ссылки
Это задание адаптировано для CodeUtility. Следуйте условию и ограничениям выше.